2012-04-06 00:47:53 +02:00
# 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.
d e f i n e a l l o w - o v e r r i d e
$( if $( or $( findstring environment,$( origin $( 1) ) ) ,\
$( findstring command line,$( origin $( 1) ) ) ) ,,\
$( eval $( 1) = $( 2) ) )
e n d e f
# 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))'
2013-06-04 14:20:16 +09:00
export man_dir man_dir_SQ INSTALL
2012-04-06 00:47:53 +02:00
export DESTDIR DESTDIR_SQ
2013-12-03 14:09:17 +01:00
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.
#
i f e q ( $( plugin_dir ) , )
i f e q ( $( prefix ) , $( HOME ) )
o v e r r i d e plugin_dir = $( HOME) /.traceevent/plugins
set_plugin_dir := 0
e l s e
o v e r r i d e plugin_dir = $( prefix) /lib/traceevent/plugins
e n d i f
e n d i f
i f e q ( $( set_plugin_dir ) , 1 )
PLUGIN_DIR = -DPLUGIN_DIR= " $( DESTDIR) / $( plugin_dir) "
PLUGIN_DIR_SQ = '$(subst ' ,'\' ',$(PLUGIN_DIR))'
e n d i f
2012-04-06 00:47:53 +02:00
# copy a bit from Linux kbuild
i f e q ( "$(origin V)" , "command line" )
VERBOSE = $( V)
e n d i f
i f n d e f V E R B O S E
VERBOSE = 0
e n d i f
i f e q ( "$(origin O)" , "command line" )
BUILD_OUTPUT := $( O)
e n d i f
i f e q ( $( BUILD_SRC ) , )
i f n e q ( $( BUILD_OUTPUT ) , )
d e f i n e b u i l d _ o u t p u t
2013-08-26 13:04:04 -03:00
$( if $( VERBOSE:1= ) ,@) +$( MAKE) -C $( BUILD_OUTPUT) \
2012-04-06 00:47:53 +02:00
BUILD_SRC = $( CURDIR) -f $( CURDIR) /Makefile $1
e n d e f
saved-output := $( BUILD_OUTPUT)
BUILD_OUTPUT := $( shell cd $( BUILD_OUTPUT) && /bin/pwd)
$( if $ ( BUILD_OUTPUT ) ,, \
$( error output directory " $( saved-output) " does not exist) )
all : sub -make
2013-06-04 14:20:17 +09:00
$(MAKECMDGOALS) : sub -make
2012-04-06 00:47:53 +02:00
sub-make : force
$( call build_output, $( MAKECMDGOALS) )
# Leave processing to above invocation of make
skip-makefile := 1
e n d i f # BUILD_OUTPUT
e n d i f # BUILD_SRC
# We process the rest of the Makefile if this is the final invocation of make
i f e q ( $( 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) )
2013-12-03 14:09:17 +01:00
plugin_dir_SQ = $( subst ',' \' ' ,$( plugin_dir) )
2012-04-06 00:47:53 +02:00
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)
2013-03-08 11:21:52 +00:00
INCLUDES = -I. $( CONFIG_INCLUDES)
2012-04-06 00:47:53 +02:00
# Set compile option CFLAGS if not set elsewhere
CFLAGS ?= -g -Wall
# Append required CFLAGS
o v e r r i d e CFLAGS += $( CONFIG_FLAGS) $( INCLUDES) $( PLUGIN_DIR_SQ)
2012-09-12 14:29:40 -03:00
o v e r r i d e CFLAGS += $( udis86-flags) -D_GNU_SOURCE
2012-04-06 00:47:53 +02:00
i f e q ( $( VERBOSE ) , 1 )
Q =
print_compile =
print_app_build =
print_fpic_compile =
print_shared_lib_compile =
print_plugin_obj_compile =
print_plugin_build =
print_install =
e l s e
Q = @
2013-10-09 11:49:27 +02:00
print_compile = echo ' CC ' $( OBJ) ;
print_app_build = echo ' BUILD ' $( OBJ) ;
print_fpic_compile = echo ' CC FPIC ' $( OBJ) ;
print_shared_lib_compile = echo ' BUILD SHARED LIB ' $( OBJ) ;
2013-12-03 14:09:17 +01:00
print_plugin_obj_compile = echo ' CC FPIC ' $( OBJ) ;
print_plugin_build = echo ' BUILD PLUGIN ' $( OBJ) ;
2013-10-09 11:49:27 +02:00
print_static_lib_build = echo ' BUILD STATIC LIB ' $( OBJ) ;
print_install = echo ' INSTALL ' $1 ' to $(DESTDIR_SQ)$2' ;
2012-04-06 00:47:53 +02:00
e n d i f
do_fpic_compile = \
( $( print_fpic_compile) \
$( CC) -c $( CFLAGS) $( EXT) -fPIC $< -o $@ )
do_app_build = \
( $( print_app_build) \
$( CC) $^ -rdynamic -o $@ $( CONFIG_LIBS) $( LIBS) )
do_compile_shared_library = \
( $( print_shared_lib_compile) \
$( CC) --shared $^ -o $@ )
do_compile_plugin_obj = \
( $( print_plugin_obj_compile) \
$( CC) -c $( CFLAGS) -fPIC -o $@ $<)
do_plugin_build = \
( $( print_plugin_build) \
$( CC) $( CFLAGS) -shared -nostartfiles -o $@ $<)
do_build_static_lib = \
( $( print_static_lib_build) \
$( RM) $@ ; $( AR) rcs $@ $^)
d e f i n e d o _ c o m p i l e
$( print_compile) \
$( CC) -c $( CFLAGS) $( EXT) $< -o $( obj) /$@ ;
e n d e f
$(obj)/%.o : $( src ) /%.c
$( Q) $( call do_compile)
%.o : $( src ) /%.c
$( Q) $( call do_compile)
2013-12-03 14:09:16 +01:00
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
2013-06-04 14:20:21 +09:00
PEVENT_LIB_OBJS += kbuffer-parse.o
2012-04-06 00:47:53 +02:00
2013-12-03 14:09:17 +01:00
PLUGINS := $( PLUGIN_OBJS:.o= .so)
ALL_OBJS = $( PEVENT_LIB_OBJS) $( PLUGIN_OBJS)
2012-04-06 00:47:53 +02:00
2013-12-03 14:09:17 +01:00
CMD_TARGETS = $( LIB_FILE) $( PLUGINS)
2012-04-06 00:47:53 +02:00
TARGETS = $( CMD_TARGETS)
all : all_cmd
all_cmd : $( CMD_TARGETS )
libtraceevent.so : $( PEVENT_LIB_OBJS )
$( Q) $( do_compile_shared_library)
libtraceevent.a : $( PEVENT_LIB_OBJS )
$( Q) $( do_build_static_lib)
2013-12-03 14:09:17 +01:00
plugins : $( PLUGINS )
2012-07-06 16:21:32 +09:00
$(PEVENT_LIB_OBJS) : %.o : $( src ) /%.c TRACEEVENT -CFLAGS
2012-04-06 00:47:53 +02:00
$( Q) $( do_fpic_compile)
2013-12-03 14:09:17 +01:00
$(PLUGIN_OBJS) : %.o : $( src ) /%.c
$( Q) $( do_compile_plugin_obj)
$(PLUGINS) : %.so : %.o
$( Q) $( do_plugin_build)
2012-04-06 00:47:53 +02:00
d e f i n e m a k e _ v e r s i o n . h
( 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
e n d e f
d e f i n e u p d a t e _ v e r s i o n . h
( $( call make_version.h, $@ .tmp) ; \
if [ -r $@ ] && cmp -s $@ $@ .tmp; then \
rm -f $@ .tmp; \
else \
echo ' UPDATE $@' ; \
mv -f $@ .tmp $@ ; \
fi ) ;
e n d e f
ep_version.h : force
$( Q) $( N) $( call update_version.h)
VERSION_FILES = ep_version.h
d e f i n e u p d a t e _ d i r
( echo $1 > $@ .tmp; \
if [ -r $@ ] && cmp -s $@ $@ .tmp; then \
rm -f $@ .tmp; \
else \
echo ' UPDATE $@' ; \
mv -f $@ .tmp $@ ; \
fi ) ;
e n d e f
## make deps
all_objs := $( sort $( ALL_OBJS) )
all_deps := $( all_objs:%.o= .%.d)
2012-06-22 14:37:36 +09:00
# let .d file also depends on the source and header files
2012-04-06 00:47:53 +02:00
d e f i n e c h e c k _ d e p s
2012-06-22 14:37:36 +09:00
@set -e; $( RM) $@ ; \
2012-10-26 17:55:48 +09:00
$( CC) -MM $( CFLAGS) $< > $@ .$$ $$ ; \
2012-06-22 14:37:36 +09:00
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@ .$$ $$ > $@ ; \
$( RM) $@ .$$ $$
2012-04-06 00:47:53 +02:00
e n d e f
$(all_deps) : .%.d : $( src ) /%.c
$( Q) $( call check_deps)
$(all_objs) : %.o : .%.d
dep_includes := $( wildcard $( all_deps) )
i f n e q ( $( dep_includes ) , )
include $( dep_includes)
e n d i f
2012-07-06 16:21:32 +09:00
### 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 \
2013-10-09 11:49:27 +02:00
echo 1>& 2 " FLAGS: * new build flags or cross compiler" ; \
2012-07-06 16:21:32 +09:00
echo " $$ FLAGS " >TRACEEVENT-CFLAGS; \
fi
2012-04-06 00:47:53 +02:00
tags : force
$( RM) tags
2012-06-22 17:10:14 +09:00
find . -name '*.[ch]' | xargs ctags --extra= +f --c-kinds= +px \
--regex-c++= '/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'
2012-04-06 00:47:53 +02:00
TAGS : force
$( RM) TAGS
2012-06-22 17:10:14 +09:00
find . -name '*.[ch]' | xargs etags \
--regex= '/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
2012-04-06 00:47:53 +02:00
d e f i n e d o _ i n s t a l l
$( print_install) \
if [ ! -d '$(DESTDIR_SQ)$2' ] ; then \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$2' ; \
fi ; \
$( INSTALL) $1 '$(DESTDIR_SQ)$2'
e n d e f
2013-12-03 14:09:17 +01:00
install_lib : all_cmd install_plugins
2012-04-06 00:47:53 +02:00
$( Q) $( call do_install,$( LIB_FILE) ,$( bindir_SQ) )
2013-12-03 14:09:17 +01:00
PLUGINS_INSTALL = $( subst .so,.install,$( PLUGINS) )
$(PLUGINS_INSTALL) : %.install : %.so force
$( Q) $( call do_install,$<,$( plugin_dir_SQ) )
install_plugins : $( PLUGINS_INSTALL )
2012-04-06 00:47:53 +02:00
install : install_lib
clean :
2012-06-27 15:52:14 -06:00
$( RM) *.o *~ $( TARGETS) *.a *.so $( VERSION_FILES) .*.d
2012-07-06 16:21:32 +09:00
$( RM) TRACEEVENT-CFLAGS tags TAGS
2012-04-06 00:47:53 +02:00
e n d i f # skip-makefile
PHONY += force
force :
# 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 )