Makefile - ktap


  1. #
  2. # Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
  3. # (this will also disable resolve resolving symbols in DSO functionality)
  4. #
  5. # Define FFI if you want to compile ktap with FFI support. By default This
  6. # toggle is off.
  7. #
  8. # Define amalg to enable amalgamation build, This compiles the ktapvm as
  9. # one huge C file and allows GCC to generate faster and shorter code. Alas,
  10. # this requires lots of memory during the build.
  11. # Recommend to use amalgmation build as default.
  12. amalg = 1

  13. # Do not instrument the tracer itself:
  14. ifdef CONFIG_FUNCTION_TRACER
  15. ORIG_CFLAGS := $(KBUILD_CFLAGS)
  16. KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS))
  17. endif

  18. all: mod ktap

  19. INC = include
  20. RUNTIME = runtime

  21. FFIDIR = $(RUNTIME)/ffi
  22. KTAP_LIBS = -lpthread

  23. LIB_OBJS += $(RUNTIME)/lib_base.o $(RUNTIME)/lib_kdebug.o \
  24.         $(RUNTIME)/lib_timer.o $(RUNTIME)/lib_ansi.o \
  25.         $(RUNTIME)/lib_table.o $(RUNTIME)/lib_net.o

  26. ifndef amalg
  27. ifdef FFI
  28. FFI_OBJS += $(FFIDIR)/ffi_call.o $(FFIDIR)/ffi_type.o $(FFIDIR)/ffi_symbol.o \
  29.     $(FFIDIR)/cdata.o $(FFIDIR)/ffi_util.o
  30. RUNTIME_OBJS += $(FFI_OBJS)
  31. LIB_OBJS += $(RUNTIME)/lib_ffi.o
  32. endif
  33. RUNTIME_OBJS += $(RUNTIME)/ktap.o $(RUNTIME)/kp_bcread.o $(RUNTIME)/kp_obj.o \
  34.         $(RUNTIME)/kp_str.o $(RUNTIME)/kp_mempool.o \
  35.         $(RUNTIME)/kp_tab.o $(RUNTIME)/kp_vm.o \
  36.         $(RUNTIME)/kp_transport.o $(RUNTIME)/kp_events.o $(LIB_OBJS)
  37. else
  38. RUNTIME_OBJS += $(RUNTIME)/amalg.o
  39. endif

  40. ifdef FFI
  41. ifeq ($(KBUILD_MODULES), 1)
  42. ifdef CONFIG_X86_64
  43. # call_x86_64.o is compiled from call_x86_64.S
  44. RUNTIME_OBJS += $(FFIDIR)/call_x86_64.o
  45. else
  46. $(error ktap FFI only supports x86_64 for now!)
  47. endif
  48. endif


  49. ccflags-y    += -DCONFIG_KTAP_FFI
  50. endif

  51. obj-m        += ktapvm.o
  52. ktapvm-y    := $(RUNTIME_OBJS)

  53. KVERSION ?= $(shell uname -r)
  54. KERNEL_SRC ?= /lib/modules/$(KVERSION)/build
  55. PWD := $(shell pwd)
  56. mod:
  57.     $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules

  58. modules_install:
  59.     $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules_install

  60. KTAPC_CFLAGS = -Wall -O2


  61. # try-cc
  62. # Usage: option = $(call try-cc, source-to-build, cc-options, msg)
  63. ifneq ($(V),1)
  64. TRY_CC_OUTPUT= > /dev/null 2>&1
  65. endif
  66. TRY_CC_MSG=echo "    CHK $(3)" 1>&2;

  67. try-cc = $(shell sh -c                            \
  68.          'TMP="/tmp/.$$$$";                        \
  69.           $(TRY_CC_MSG)                            \
  70.           echo "$(1)" |                            \
  71.           $(CC) -x c - $(2) -o "$$TMP" $(TRY_CC_OUTPUT) && echo y;    \
  72.           rm -f "$$TMP"')


  73. define SOURCE_LIBELF
  74. #include <libelf.h>

  75. int main(void)
  76. {
  77.         Elf *elf = elf_begin(0, ELF_C_READ, 0);
  78.         return (long)elf;
  79. }
  80. endef

  81. FLAGS_LIBELF = -lelf

  82. ifdef NO_LIBELF
  83.     KTAPC_CFLAGS += -DNO_LIBELF
  84. else
  85. ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF),libelf),y)
  86.     $(warning No libelf found, disables symbol resolving, please install elfutils-libelf-devel/libelf-dev);
  87.     NO_LIBELF := 1
  88.     KTAPC_CFLAGS += -DNO_LIBELF
  89. else
  90.     KTAP_LIBS += -lelf
  91. endif
  92. endif

  93. UDIR = userspace

  94. $(UDIR)/kp_main.o: $(UDIR)/kp_main.c $(INC)/* KTAP-CFLAGS
  95.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  96. $(UDIR)/kp_lex.o: $(UDIR)/kp_lex.c $(INC)/* KTAP-CFLAGS
  97.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  98. $(UDIR)/kp_parse.o: $(UDIR)/kp_parse.c $(INC)/* KTAP-CFLAGS
  99.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  100. $(UDIR)/kp_bcwrite.o: $(UDIR)/kp_bcwrite.c $(INC)/* KTAP-CFLAGS
  101.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  102. $(UDIR)/kp_reader.o: $(UDIR)/kp_reader.c $(INC)/* KTAP-CFLAGS
  103.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  104. $(UDIR)/kp_util.o: $(UDIR)/kp_util.c $(INC)/* KTAP-CFLAGS
  105.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  106. $(UDIR)/kp_parse_events.o: $(UDIR)/kp_parse_events.c $(INC)/* KTAP-CFLAGS
  107.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  108. ifndef NO_LIBELF
  109. $(UDIR)/kp_symbol.o: $(UDIR)/kp_symbol.c KTAP-CFLAGS
  110.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  111. endif
  112. ifdef FFI
  113. KTAPC_CFLAGS += -DCONFIG_KTAP_FFI
  114. $(UDIR)/ffi_type.o: $(RUNTIME)/ffi/ffi_type.c $(INC)/* KTAP-CFLAGS
  115.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  116. $(UDIR)/ffi/cparser.o: $(UDIR)/ffi/cparser.c $(INC)/* KTAP-CFLAGS
  117.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  118. $(UDIR)/ffi/ctype.o: $(UDIR)/ffi/ctype.c $(INC)/* KTAP-CFLAGS
  119.     $(QUIET_CC)$(CC) $(DEBUGINFO_FLAG) $(KTAPC_CFLAGS) -o $@ -c $<
  120. endif


  121. KTAPOBJS =
  122. KTAPOBJS += $(UDIR)/kp_main.o
  123. KTAPOBJS += $(UDIR)/kp_lex.o
  124. KTAPOBJS += $(UDIR)/kp_parse.o
  125. KTAPOBJS += $(UDIR)/kp_bcwrite.o
  126. KTAPOBJS += $(UDIR)/kp_reader.o
  127. KTAPOBJS += $(UDIR)/kp_util.o
  128. KTAPOBJS += $(UDIR)/kp_parse_events.o
  129. ifndef NO_LIBELF
  130. KTAPOBJS += $(UDIR)/kp_symbol.o
  131. endif
  132. ifdef FFI
  133. KTAPOBJS += $(UDIR)/ffi_type.o
  134. KTAPOBJS += $(UDIR)/ffi/cparser.o
  135. KTAPOBJS += $(UDIR)/ffi/ctype.o
  136. endif

  137. ktap: $(KTAPOBJS) KTAP-CFLAGS
  138.     $(QUIET_LINK)$(CC) $(KTAPC_CFLAGS) -o $@ $(KTAPOBJS) $(KTAP_LIBS)

  139. KMISC := /lib/modules/$(KVERSION)/ktapvm/

  140. install: mod ktap
  141.     make modules_install ktapvm.ko
  142.     install -c ktap /usr/bin/
  143.     mkdir -p ~/.vim/ftdetect
  144.     mkdir -p ~/.vim/syntax
  145.     cp vim/ftdetect/ktap.vim ~/.vim/ftdetect/
  146.     cp vim/syntax/ktap.vim ~/.vim/syntax/

  147. load:
  148.     insmod ktapvm.ko

  149. unload:
  150.     rmmod ktapvm

  151. reload:
  152.     make unload; make load

  153. test: FORCE
  154.     #start testing
  155.     prove -j4 -r test/

  156. clean:
  157.     $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean
  158.     $(RM) ktap KTAP-CFLAGS


  159. PHONY += FORCE
  160. FORCE:

  161. TRACK_FLAGS = KTAP
  162. ifdef amalg
  163. TRACK_FLAGS += AMALG
  164. endif
  165. ifdef FFI
  166. TRACK_FLAGS += FFI
  167. endif
  168. ifdef NO_LIBELF
  169. TRACK_FLAGS += NO_LIBELF
  170. endif

  171. KTAP-CFLAGS: FORCE
  172.     @FLAGS='$(TRACK_FLAGS)'; \
  173.     if test x"$$FLAGS" != x"`cat KTAP-CFLAGS 2>/dev/null`" ; then \
  174.         echo "$$FLAGS" >KTAP-CFLAGS; \
  175.     fi

  176. #generate tags/etags/cscope index for editor.
  177. define all_sources
  178.         (find . -name '*.[ch]' -print)
  179. endef

  180. .PHONY: tags
  181. tags:
  182.     $(all_sources) | xargs ctags

  183. .PHONY: etags
  184. etags:
  185.     $(all_sources) | xargs etags

  186. .PHONY: cscope
  187. cscope:
  188.     $(all_sources) > cscope.files
  189.     cscope -k -b