~ctwm/ctwm/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Try setting up some bits for dtrace.
#
# By itself, dtrace can trace things like function entry/return points
# just fine, and even pull numeric and string arguments.  More involved
# data structures, though, would either need manual definition in the D
# scripts (which is practically impossible for anything sizable), manual
# specification of offsets (even worse), or CTF info included in the
# binary (hey, we can do that!).  So, see if we can pull that stuff in...

find_program(CTFCONVERT ctfconvert)
find_program(CTFMERGE   ctfmerge)

if(CTFCONVERT AND CTFMERGE)
	message(STATUS "Found ctfconvert/ctfmerge, setting up CTF info for dtrace.")

	# ctfconvert/merge is about pulling over debug info, so make sure we
	# enable that in the objects.
	add_definitions("-g")

	# ctfconvert/merge on BSD has a '-g' option, which we want to use
	# (preserves the -g info in the final binary).  Solarish apparently
	# doesn't; maybe it always does it anyway?  Regardless, figure out
	# whether it takes that arg...
	execute_process(COMMAND ${CTFCONVERT} -g -l0 /dev/null
		OUTPUT_QUIET ERROR_VARIABLE _CTFCONVERT_G_OUT)
	if(${_CTFCONVERT_G_OUT} MATCHES "^Usage:")
		# No -g; leave vars alone
	else()
		# Add -g
		set(CTFCONVERT "${CTFCONVERT} -g")
		set(CTFMERGE "${CTFMERGE} -g")
	endif()

	# This is a horrific hack.  cmake provides no way to actually find
	# out the list of object files, or where they are, because that would
	# be too easy.  So we have to "know", and take our best shot.  Sigh.
	# Well, it's really only a dev tool anyway, so I guess some manual
	# mess isn't the end of the world.  We can't check the existence yet
	# here, since it hasn't been created at this point in the process.
	# So we just have to hope.  mk_ctf_info.sh will warn us if things
	# change...
	set(CODIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/ctwmlib.dir)

	add_custom_command(TARGET ctwm POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E env
			CTFCONVERT=${CTFCONVERT} CTFMERGE=${CTFMERGE}
			${TOOLS}/mk_ctf_info.sh ${CODIR}
			${CMAKE_CURRENT_BINARY_DIR}/ctwm
		COMMENT "Converting in CTF info for dtrace"
	)
endif()