testing: freebsd on cirrus
[awesomized/libmemcached] / CMake / EnableDtrace.cmake
diff --git a/CMake/EnableDtrace.cmake b/CMake/EnableDtrace.cmake
new file mode 100644 (file)
index 0000000..184a327
--- /dev/null
@@ -0,0 +1,55 @@
+function(enable_dtrace_for TARGET PROBES_D PROBES_H)
+    if(HAVE_DTRACE AND NOT CMAKE_CROSSCOMPILING)
+        target_sources(${TARGET} PRIVATE ${PROBES_H})
+        add_custom_command(
+                OUTPUT
+                    ${PROBES_H}
+                MAIN_DEPENDENCY
+                    ${PROBES_D}
+                COMMAND
+                    ${DTRACE_EXECUTABLE}
+                ARGS
+                    -x nolibs -h
+                    -s ${CMAKE_CURRENT_SOURCE_DIR}/${PROBES_D}
+                    -o ${PROBES_H}
+        )
+        if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+            add_custom_command(
+                    OUTPUT
+                        ${TARGET}_probes.o
+                    MAIN_DEPENDENCY
+                        ${PROBES_H}
+                    COMMAND
+                        ${DTRACE_EXECUTABLE}
+                    ARGS
+                        -x nolibs -G
+                        -s ${CMAKE_CURRENT_SOURCE_DIR}/${PROBES_D}
+                        -o ${TARGET}_probes.o
+            )
+            target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_probes.o)
+            set_source_files_properties(${TARGET}_probes.o PROPERTIES
+                    GENERATED true
+                    EXTERNAL_OBJECT true)
+        else() # not Linux
+            set(PROBES_C ${TARGET}_probes.cc)
+            file(GENERATE
+                    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PROBES_C}
+                    CONTENT "#include \"${PROBES_H}\""
+                    )
+            add_custom_command(
+                    TARGET ${TARGET}
+                        PRE_LINK
+                    DEPENDS
+                        ${PROBES_H}
+                    COMMAND
+                        rm -f ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET}.dir/${PROBES_C}.o
+                    COMMAND
+                        ${DTRACE_EXECUTABLE} -x nolibs -G
+                        -s ${CMAKE_CURRENT_SOURCE_DIR}/${PROBES_D}
+                        -o ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET}.dir/${PROBES_C}.o
+                           ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET}.dir/*.o
+                )
+            target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${PROBES_C})
+        endif()
+    endif()
+endfunction()