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))'
html_install = $( prefix) /share/kernelshark/html
html_install_SQ = '$(subst ' ,'\' ',$(html_install))'
img_install = $( prefix) /share/kernelshark/html/images
img_install_SQ = '$(subst ' ,'\' ',$(img_install))'
export man_dir man_dir_SQ html_install html_install_SQ INSTALL
export img_install img_install_SQ
export DESTDIR DESTDIR_SQ
# 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
$( if $( VERBOSE:1= ) ,@) $( MAKE) -C $( BUILD_OUTPUT) \
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
gui : force
$( call build_output, all_cmd)
$(filter-out gui,$(MAKECMDGOALS)) : sub -make
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) )
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)
INCLUDES = -I. -I/usr/local/include $( CONFIG_INCLUDES)
# 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)
o v e r r i d e CFLAGS += $( udis86-flags)
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 = @
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) ;
print_plugin_obj_compile = echo ' CC PLUGIN OBJ ' $( OBJ) ;
print_plugin_build = echo ' CC PLUGI ' $( OBJ) ;
print_static_lib_build = echo ' BUILD STATIC LIB ' $( OBJ) ;
print_install = echo ' INSTALL ' $1 ' to $(DESTDIR_SQ)$2' ;
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)
PEVENT_LIB_OBJS = event-parse.o trace-seq.o parse-filter.o parse-utils.o
ALL_OBJS = $( PEVENT_LIB_OBJS)
CMD_TARGETS = $( LIB_FILE)
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)
$(PEVENT_LIB_OBJS) : %.o : $( src ) /%.c
$( Q) $( do_fpic_compile)
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) $@ ; \
$( CC) -M $( CFLAGS) $< > $@ .$$ $$ ; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@ .$$ $$ > $@ ; \
$( RM) $@ .$$ $$
2012-04-06 00:47:53 +02:00
e n d e f
$(gui_deps) : ks_version .h
$(non_gui_deps) : tc_version .h
$(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
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
install_lib : all_cmd install_plugins install_python
$( Q) $( call do_install,$( LIB_FILE) ,$( bindir_SQ) )
install : install_lib
clean :
2012-06-27 15:52:14 -06:00
$( RM) *.o *~ $( TARGETS) *.a *.so $( VERSION_FILES) .*.d
2012-04-06 00:47:53 +02:00
$( RM) tags TAGS
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 )