Makefile 7.8 KB
Newer Older
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
# trace-cmd version
EP_VERSION = 1
EP_PATCHLEVEL = 1
EP_EXTRAVERSION = 0

# file format version
FILE_VERSION = 6

MAKEFLAGS += --no-print-directory


# Makefiles suck: This macro sets a default value of $(2) for the
# variable named by $(1), unless the variable has been set by
# environment or command line. This is necessary for CC and AR
# because make sets default values, so the simpler ?= approach
# won't work as expected.
define allow-override
  $(if $(or $(findstring environment,$(origin $(1))),\
            $(findstring command line,$(origin $(1)))),,\
    $(eval $(1) = $(2)))
endef

# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
$(call allow-override,AR,$(CROSS_COMPILE)ar)

EXT = -std=gnu99
INSTALL = install

# Use DESTDIR for installing into a different root directory.
# This is useful for building a package. The program will be
# installed in this directory as if it was the root directory.
# Then the build tool can move it later.
DESTDIR ?=
DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'

prefix ?= /usr/local
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
man_dir = $(prefix)/share/man
man_dir_SQ = '$(subst ','\'',$(man_dir))'

43
export man_dir man_dir_SQ INSTALL
44 45
export DESTDIR DESTDIR_SQ

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
set_plugin_dir := 1

# Set plugin_dir to preffered global plugin location
# If we install under $HOME directory we go under
# $(HOME)/.traceevent/plugins
#
# We dont set PLUGIN_DIR in case we install under $HOME
# directory, because by default the code looks under:
# $(HOME)/.traceevent/plugins by default.
#
ifeq ($(plugin_dir),)
ifeq ($(prefix),$(HOME))
override plugin_dir = $(HOME)/.traceevent/plugins
set_plugin_dir := 0
else
override plugin_dir = $(prefix)/lib/traceevent/plugins
endif
endif

ifeq ($(set_plugin_dir),1)
PLUGIN_DIR = -DPLUGIN_DIR="$(DESTDIR)/$(plugin_dir)"
PLUGIN_DIR_SQ = '$(subst ','\'',$(PLUGIN_DIR))'
endif

70 71
include $(if $(BUILD_SRC),$(BUILD_SRC)/)../../scripts/Makefile.include

72 73 74 75 76 77 78 79 80 81 82 83 84 85
# copy a bit from Linux kbuild

ifeq ("$(origin V)", "command line")
  VERBOSE = $(V)
endif
ifndef VERBOSE
  VERBOSE = 0
endif

ifeq ("$(origin O)", "command line")
  BUILD_OUTPUT := $(O)
endif

ifeq ($(BUILD_SRC),)
86
ifneq ($(OUTPUT),)
87 88

define build_output
89 90
  $(if $(VERBOSE:1=),@)+$(MAKE) -C $(OUTPUT) \
  BUILD_SRC=$(CURDIR)/ -f $(CURDIR)/Makefile $1
91 92 93 94
endef

all: sub-make

95
$(MAKECMDGOALS): sub-make
96 97 98 99 100 101 102 103

sub-make: force
	$(call build_output, $(MAKECMDGOALS))


# Leave processing to above invocation of make
skip-makefile := 1

104
endif # OUTPUT
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
endif # BUILD_SRC

# We process the rest of the Makefile if this is the final invocation of make
ifeq ($(skip-makefile),)

srctree		:= $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))
objtree		:= $(CURDIR)
src		:= $(srctree)
obj		:= $(objtree)

export prefix bindir src obj

# Shell quotes
bindir_SQ = $(subst ','\'',$(bindir))
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
120
plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138

LIB_FILE = libtraceevent.a libtraceevent.so

CONFIG_INCLUDES = 
CONFIG_LIBS	=
CONFIG_FLAGS	=

VERSION		= $(EP_VERSION)
PATCHLEVEL	= $(EP_PATCHLEVEL)
EXTRAVERSION	= $(EP_EXTRAVERSION)

OBJ		= $@
N		=

export Q VERBOSE

EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)

139
INCLUDES = -I. $(CONFIG_INCLUDES)
140 141 142 143 144 145

# Set compile option CFLAGS if not set elsewhere
CFLAGS ?= -g -Wall

# Append required CFLAGS
override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
146
override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

ifeq ($(VERBOSE),1)
  Q =
else
  Q = @
endif

do_compile_shared_library =			\
	($(print_shared_lib_compile)		\
	$(CC) --shared $^ -o $@)

do_plugin_build =				\
	($(print_plugin_build)			\
	$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $<)

do_build_static_lib =				\
	($(print_static_lib_build)		\
	$(RM) $@;  $(AR) rcs $@ $^)


167
do_compile = $(QUIET_CC)$(CC) -c $(CFLAGS) $(EXT) $< -o $(obj)/$@;
168 169

$(obj)/%.o: $(src)/%.c
170
	$(call do_compile)
171 172

%.o: $(src)/%.c
173
	$(call do_compile)
174

175 176 177 178 179
PEVENT_LIB_OBJS  = event-parse.o
PEVENT_LIB_OBJS += event-plugin.o
PEVENT_LIB_OBJS += trace-seq.o
PEVENT_LIB_OBJS += parse-filter.o
PEVENT_LIB_OBJS += parse-utils.o
180
PEVENT_LIB_OBJS += kbuffer-parse.o
181

182 183
PLUGIN_OBJS  = plugin_jbd2.o
PLUGIN_OBJS += plugin_hrtimer.o
J
Jiri Olsa 已提交
184
PLUGIN_OBJS += plugin_kmem.o
J
Jiri Olsa 已提交
185
PLUGIN_OBJS += plugin_kvm.o
186
PLUGIN_OBJS += plugin_mac80211.o
187
PLUGIN_OBJS += plugin_sched_switch.o
188
PLUGIN_OBJS += plugin_function.o
J
Jiri Olsa 已提交
189
PLUGIN_OBJS += plugin_xen.o
J
Jiri Olsa 已提交
190
PLUGIN_OBJS += plugin_scsi.o
191
PLUGIN_OBJS += plugin_cfg80211.o
J
Jiri Olsa 已提交
192

193 194 195
PLUGINS := $(PLUGIN_OBJS:.o=.so)

ALL_OBJS = $(PEVENT_LIB_OBJS) $(PLUGIN_OBJS)
196

197
CMD_TARGETS = $(LIB_FILE) $(PLUGINS)
198 199 200 201 202 203 204 205 206

TARGETS = $(CMD_TARGETS)


all: all_cmd

all_cmd: $(CMD_TARGETS)

libtraceevent.so: $(PEVENT_LIB_OBJS)
207
	$(QUIET_LINK)$(CC) --shared $^ -o $@
208 209

libtraceevent.a: $(PEVENT_LIB_OBJS)
210
	$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
211

212 213
plugins: $(PLUGINS)

214
$(PEVENT_LIB_OBJS): %.o: $(src)/%.c TRACEEVENT-CFLAGS
215
	$(QUIET_CC_FPIC)$(CC) -c $(CFLAGS) $(EXT) -fPIC $< -o $@
216

217
$(PLUGIN_OBJS): %.o : $(src)/%.c
218
	$(QUIET_CC_FPIC)$(CC) -c $(CFLAGS) -fPIC -o $@ $<
219 220

$(PLUGINS): %.so: %.o
221
	$(QUIET_LINK)$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $<
222

223
define make_version.h
224 225 226 227 228 229 230
  (echo '/* This file is automatically generated. Do not modify. */';		\
   echo \#define VERSION_CODE $(shell						\
   expr $(VERSION) \* 256 + $(PATCHLEVEL));					\
   echo '#define EXTRAVERSION ' $(EXTRAVERSION);				\
   echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"';	\
   echo '#define FILE_VERSION '$(FILE_VERSION);					\
  ) > $1
231 232 233
endef

define update_version.h
234 235 236 237 238 239 240
  ($(call make_version.h, $@.tmp);		\
    if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
      rm -f $@.tmp;				\
    else					\
      echo '  UPDATE                 $@';	\
      mv -f $@.tmp $@;				\
    fi);
241 242 243 244 245 246 247 248
endef

ep_version.h: force
	$(Q)$(N)$(call update_version.h)

VERSION_FILES = ep_version.h

define update_dir
249 250 251 252 253 254 255
  (echo $1 > $@.tmp;				\
   if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
     rm -f $@.tmp;				\
   else						\
     echo '  UPDATE                 $@';	\
     mv -f $@.tmp $@;				\
   fi);
256 257 258 259 260 261 262
endef

## make deps

all_objs := $(sort $(ALL_OBJS))
all_deps := $(all_objs:%.o=.%.d)

263
# let .d file also depends on the source and header files
264
define check_deps
265 266 267 268
  @set -e; $(RM) $@; \
  $(CC) -MM $(CFLAGS) $< > $@.$$$$; \
  sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
  $(RM) $@.$$$$
269 270 271 272 273 274 275 276 277 278 279 280 281
endef

$(all_deps): .%.d: $(src)/%.c
	$(Q)$(call check_deps)

$(all_objs) : %.o : .%.d

dep_includes := $(wildcard $(all_deps))

ifneq ($(dep_includes),)
 include $(dep_includes)
endif

282 283 284 285 286 287
### Detect environment changes
TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):$(ARCH):$(CROSS_COMPILE)

TRACEEVENT-CFLAGS: force
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat TRACEEVENT-CFLAGS 2>/dev/null`" ; then \
288
		echo 1>&2 "  FLAGS:   * new build flags or cross compiler"; \
289 290 291
		echo "$$FLAGS" >TRACEEVENT-CFLAGS; \
            fi

292 293
tags:	force
	$(RM) tags
294 295
	find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
	--regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'
296 297 298

TAGS:	force
	$(RM) TAGS
299 300
	find . -name '*.[ch]' | xargs etags \
	--regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
301 302 303 304 305 306 307 308

define do_install
	if [ ! -d '$(DESTDIR_SQ)$2' ]; then		\
		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2';	\
	fi;						\
	$(INSTALL) $1 '$(DESTDIR_SQ)$2'
endef

309 310 311 312 313
define do_install_plugins
	for plugin in $1; do				\
	  $(call do_install,$$plugin,$(plugin_dir_SQ));	\
	done
endef
314

315 316 317
install_lib: all_cmd install_plugins
	$(call QUIET_INSTALL, $(LIB_FILE)) \
		$(call do_install,$(LIB_FILE),$(bindir_SQ))
318

319 320 321
install_plugins: $(PLUGINS)
	$(call QUIET_INSTALL, trace_plugins) \
		$(call do_install_plugins, $(PLUGINS))
322

323 324 325
install: install_lib

clean:
326 327 328
	$(call QUIET_CLEAN, libtraceevent) \
		$(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \
		$(RM) TRACEEVENT-CFLAGS tags TAGS
329 330 331

endif # skip-makefile

332
PHONY += force plugins
333 334
force:

335 336 337
plugins:
	@echo > /dev/null

338 339 340
# Declare the contents of the .PHONY variable as phony.  We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)