Commit 4a4b822a authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

Dtrace on Solaris:

fix excessive relinking that results from rerunning
dtrace -G second time on the objects that come into 
static library. 
The reason for relinking is that dtrace -G changes 
timestamp for the object file, which in turn results
in re-archiving the mysys on next time make runs, 
which causes relinking of the whole mysql, because
everything depends on mysys.

The fix is to copy objects into temp before running 
dtrace -G in mysqld pre-build step. This way dtrace 
does not affect the object timestamp.
parent 367cb8fd
......@@ -75,7 +75,7 @@ MACRO (DTRACE_INSTRUMENT target)
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
SET(objdir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir)
SET(outfile ${objdir}/${target}_dtrace.o)
GET_TARGET_PROPERTY(target_type ${target} TYPE)
ADD_CUSTOM_COMMAND(
TARGET ${target} PRE_LINK
COMMAND ${CMAKE_COMMAND}
......@@ -84,6 +84,7 @@ MACRO (DTRACE_INSTRUMENT target)
-DDFILE=${CMAKE_BINARY_DIR}/include/probes_mysql.d
-DDTRACE_FLAGS=${DTRACE_FLAGS}
-DDIRS=.
-DTYPE=${target_type}
-P ${CMAKE_SOURCE_DIR}/cmake/dtrace_prelink.cmake
WORKING_DIRECTORY ${objdir}
)
......@@ -94,7 +95,7 @@ MACRO (DTRACE_INSTRUMENT target)
ELSE()
# For static library flags, add the object to the library.
# Note: DTrace probes in static libraries are unusable currently
# (see http://opensolaris.org/jive/thread.jspa?messageID=432454)
# (see explanation for DTRACE_INSTRUMENT_STATIC_LIBS below)
# but maybe one day this will be fixed.
GET_TARGET_PROPERTY(target_location ${target} LOCATION)
ADD_CUSTOM_COMMAND(
......@@ -102,7 +103,6 @@ MACRO (DTRACE_INSTRUMENT target)
COMMAND ${CMAKE_AR} r ${target_location} ${outfile}
COMMAND ${CMAKE_RANLIB} ${target_location}
)
# Used in DTRACE_INSTRUMENT_WITH_STATIC_LIBS
SET(TARGET_OBJECT_DIRECTORY_${target} ${objdir} CACHE INTERNAL "")
ENDIF()
......@@ -123,7 +123,7 @@ IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND ENABLE_DTRACE)
FOREACH(lib ${libs})
SET(dirs ${dirs} ${TARGET_OBJECT_DIRECTORY_${lib}})
ENDFOREACH()
SET (obj ${CMAKE_BINARY_DIR}/${target}_dtrace_all.o)
SET (obj ${CMAKE_CURRENT_BINARY_DIR}/${target}_dtrace_all.o)
ADD_CUSTOM_COMMAND(
OUTPUT ${obj}
DEPENDS ${libs}
......@@ -133,6 +133,7 @@ IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND ENABLE_DTRACE)
-DDFILE=${CMAKE_BINARY_DIR}/include/probes_mysql.d
-DDTRACE_FLAGS=${DTRACE_FLAGS}
"-DDIRS=${dirs}"
-DTYPE=MERGE
-P ${CMAKE_SOURCE_DIR}/cmake/dtrace_prelink.cmake
VERBATIM
)
......
......@@ -19,17 +19,65 @@
# Do not follow symlinks in GLOB_RECURSE
CMAKE_POLICY(SET CMP0009 NEW)
FILE(REMOVE ${OUTFILE})
MACRO(CONVERT_TO_RELATIVE_PATHS files rel_paths)
GET_FILENAME_COMPONENT(abs_dir . ABSOLUTE)
SET(${rel_paths})
FOREACH(file ${files})
FILE(RELATIVE_PATH rel ${abs_dir} ${file})
LIST(APPEND ${rel_paths} ${rel})
ENDFOREACH()
ENDMACRO()
IF(TYPE STREQUAL "MERGE")
# Rerun dtrace on objects that are already in static libraries.
# Object paths are stored in text files named 'dtrace_objects'
# in the input directores. We have to copy the objects into temp.
# directory, as running dtrace -G on original files will change
# timestamps and cause rebuilds or the libraries / excessive
# relink
FILE(REMOVE_RECURSE dtrace_objects_merge)
MAKE_DIRECTORY(dtrace_objects_merge)
FOREACH(dir ${DIRS})
FILE(STRINGS ${dir}/dtrace_objects OBJS)
FOREACH(obj ${OBJS})
IF(obj)
EXECUTE_PROCESS(COMMAND cp ${obj} dtrace_objects_merge)
ENDIF()
ENDFOREACH()
ENDFOREACH()
FILE(GLOB_RECURSE OBJECTS dtrace_objects_merge/*.o)
CONVERT_TO_RELATIVE_PATHS("${OBJECTS}" REL_OBJECTS)
EXECUTE_PROCESS(
COMMAND ${DTRACE} ${DTRACE_FLAGS} -o ${OUTFILE} -G -s ${DFILE} ${REL_OBJECTS}
)
RETURN()
ENDIF()
FOREACH(dir ${DIRS})
FILE(GLOB_RECURSE OBJECTS ${dir}/*.o)
# Use relative paths to generate shorter command line
GET_FILENAME_COMPONENT(CURRENT_ABS_DIR . ABSOLUTE)
FOREACH(OBJ ${OBJECTS})
FILE(RELATIVE_PATH REL ${CURRENT_ABS_DIR} ${OBJ})
LIST(APPEND REL_OBJECTS ${REL})
ENDFOREACH()
CONVERT_TO_RELATIVE_PATHS("${OBJECTS}" REL)
LIST(APPEND REL_OBJECTS ${REL})
ENDFOREACH()
FILE(WRITE dtrace_timestamp "")
EXECUTE_PROCESS(
COMMAND ${DTRACE} ${DTRACE_FLAGS} -o ${OUTFILE} -G -s ${DFILE} ${REL_OBJECTS}
)
# Save objects that contain dtrace probes in a file.
# This file is used when script is called with -DTYPE=MERGE
# to dtrace from static libs.
# To find objects with probes, look at the timestamp, it was updated
# by dtrace -G run
IF(TYPE MATCHES "STATIC")
FILE(WRITE dtrace_objects "")
FOREACH(obj ${REL_OBJECTS})
IF(${obj} IS_NEWER_THAN dtrace_timestamp)
GET_FILENAME_COMPONENT(obj_absolute_path ${obj} ABSOLUTE)
FILE(APPEND dtrace_objects "${obj_absolute_path}\n" )
ENDIF()
ENDFOREACH()
ENDIF()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment