xref: /OK3568_Linux_fs/kernel/tools/lib/traceevent/Makefile (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun# trace-cmd version
3*4882a593SmuzhiyunEP_VERSION = 1
4*4882a593SmuzhiyunEP_PATCHLEVEL = 1
5*4882a593SmuzhiyunEP_EXTRAVERSION = 0
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun# file format version
8*4882a593SmuzhiyunFILE_VERSION = 6
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunMAKEFLAGS += --no-print-directory
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun# Makefiles suck: This macro sets a default value of $(2) for the
14*4882a593Smuzhiyun# variable named by $(1), unless the variable has been set by
15*4882a593Smuzhiyun# environment or command line. This is necessary for CC and AR
16*4882a593Smuzhiyun# because make sets default values, so the simpler ?= approach
17*4882a593Smuzhiyun# won't work as expected.
18*4882a593Smuzhiyundefine allow-override
19*4882a593Smuzhiyun  $(if $(or $(findstring environment,$(origin $(1))),\
20*4882a593Smuzhiyun            $(findstring command line,$(origin $(1)))),,\
21*4882a593Smuzhiyun    $(eval $(1) = $(2)))
22*4882a593Smuzhiyunendef
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
25*4882a593Smuzhiyun$(call allow-override,CC,$(CROSS_COMPILE)gcc)
26*4882a593Smuzhiyun$(call allow-override,AR,$(CROSS_COMPILE)ar)
27*4882a593Smuzhiyun$(call allow-override,NM,$(CROSS_COMPILE)nm)
28*4882a593Smuzhiyun$(call allow-override,PKG_CONFIG,pkg-config)
29*4882a593Smuzhiyun
30*4882a593SmuzhiyunEXT = -std=gnu99
31*4882a593SmuzhiyunINSTALL = install
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun# Use DESTDIR for installing into a different root directory.
34*4882a593Smuzhiyun# This is useful for building a package. The program will be
35*4882a593Smuzhiyun# installed in this directory as if it was the root directory.
36*4882a593Smuzhiyun# Then the build tool can move it later.
37*4882a593SmuzhiyunDESTDIR ?=
38*4882a593SmuzhiyunDESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
39*4882a593Smuzhiyun
40*4882a593SmuzhiyunLP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
41*4882a593Smuzhiyunifeq ($(LP64), 1)
42*4882a593Smuzhiyun  libdir_relative_temp = lib64
43*4882a593Smuzhiyunelse
44*4882a593Smuzhiyun  libdir_relative_temp = lib
45*4882a593Smuzhiyunendif
46*4882a593Smuzhiyun
47*4882a593Smuzhiyunlibdir_relative ?= $(libdir_relative_temp)
48*4882a593Smuzhiyunprefix ?= /usr/local
49*4882a593Smuzhiyunlibdir = $(prefix)/$(libdir_relative)
50*4882a593Smuzhiyunman_dir = $(prefix)/share/man
51*4882a593Smuzhiyunman_dir_SQ = '$(subst ','\'',$(man_dir))'
52*4882a593Smuzhiyunpkgconfig_dir ?= $(word 1,$(shell $(PKG_CONFIG) 		\
53*4882a593Smuzhiyun			--variable pc_path pkg-config | tr ":" " "))
54*4882a593Smuzhiyunincludedir_relative = traceevent
55*4882a593Smuzhiyunincludedir = $(prefix)/include/$(includedir_relative)
56*4882a593Smuzhiyunincludedir_SQ = '$(subst ','\'',$(includedir))'
57*4882a593Smuzhiyun
58*4882a593Smuzhiyunexport man_dir man_dir_SQ INSTALL
59*4882a593Smuzhiyunexport DESTDIR DESTDIR_SQ
60*4882a593Smuzhiyunexport EVENT_PARSE_VERSION
61*4882a593Smuzhiyun
62*4882a593Smuzhiyuninclude ../../scripts/Makefile.include
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun# copy a bit from Linux kbuild
65*4882a593Smuzhiyun
66*4882a593Smuzhiyunifeq ("$(origin V)", "command line")
67*4882a593Smuzhiyun  VERBOSE = $(V)
68*4882a593Smuzhiyunendif
69*4882a593Smuzhiyunifndef VERBOSE
70*4882a593Smuzhiyun  VERBOSE = 0
71*4882a593Smuzhiyunendif
72*4882a593Smuzhiyun
73*4882a593Smuzhiyunifeq ($(srctree),)
74*4882a593Smuzhiyunsrctree := $(patsubst %/,%,$(dir $(CURDIR)))
75*4882a593Smuzhiyunsrctree := $(patsubst %/,%,$(dir $(srctree)))
76*4882a593Smuzhiyunsrctree := $(patsubst %/,%,$(dir $(srctree)))
77*4882a593Smuzhiyun#$(info Determined 'srctree' to be $(srctree))
78*4882a593Smuzhiyunendif
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunexport prefix libdir src obj
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun# Shell quotes
83*4882a593Smuzhiyunlibdir_SQ = $(subst ','\'',$(libdir))
84*4882a593Smuzhiyunlibdir_relative_SQ = $(subst ','\'',$(libdir_relative))
85*4882a593Smuzhiyun
86*4882a593SmuzhiyunCONFIG_INCLUDES =
87*4882a593SmuzhiyunCONFIG_LIBS	=
88*4882a593SmuzhiyunCONFIG_FLAGS	=
89*4882a593Smuzhiyun
90*4882a593SmuzhiyunVERSION		= $(EP_VERSION)
91*4882a593SmuzhiyunPATCHLEVEL	= $(EP_PATCHLEVEL)
92*4882a593SmuzhiyunEXTRAVERSION	= $(EP_EXTRAVERSION)
93*4882a593Smuzhiyun
94*4882a593SmuzhiyunOBJ		= $@
95*4882a593SmuzhiyunN		=
96*4882a593Smuzhiyun
97*4882a593SmuzhiyunEVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
98*4882a593Smuzhiyun
99*4882a593SmuzhiyunLIB_TARGET  = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION)
100*4882a593SmuzhiyunLIB_INSTALL = libtraceevent.a libtraceevent.so*
101*4882a593SmuzhiyunLIB_INSTALL := $(addprefix $(OUTPUT),$(LIB_INSTALL))
102*4882a593Smuzhiyun
103*4882a593SmuzhiyunINCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun# Set compile option CFLAGS
106*4882a593Smuzhiyunifdef EXTRA_CFLAGS
107*4882a593Smuzhiyun  CFLAGS := $(EXTRA_CFLAGS)
108*4882a593Smuzhiyunelse
109*4882a593Smuzhiyun  CFLAGS := -g -Wall
110*4882a593Smuzhiyunendif
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun# Append required CFLAGS
113*4882a593Smuzhiyunoverride CFLAGS += -fPIC
114*4882a593Smuzhiyunoverride CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
115*4882a593Smuzhiyunoverride CFLAGS += $(udis86-flags) -D_GNU_SOURCE
116*4882a593Smuzhiyun
117*4882a593Smuzhiyunifeq ($(VERBOSE),1)
118*4882a593Smuzhiyun  Q =
119*4882a593Smuzhiyunelse
120*4882a593Smuzhiyun  Q = @
121*4882a593Smuzhiyunendif
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun# Disable command line variables (CFLAGS) override from top
124*4882a593Smuzhiyun# level Makefile (perf), otherwise build Makefile will get
125*4882a593Smuzhiyun# the same command line setup.
126*4882a593SmuzhiyunMAKEOVERRIDES=
127*4882a593Smuzhiyun
128*4882a593Smuzhiyunexport srctree OUTPUT CC LD CFLAGS V
129*4882a593Smuzhiyunbuild := -f $(srctree)/tools/build/Makefile.build dir=. obj
130*4882a593Smuzhiyun
131*4882a593SmuzhiyunTE_IN      := $(OUTPUT)libtraceevent-in.o
132*4882a593SmuzhiyunLIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
133*4882a593Smuzhiyun
134*4882a593SmuzhiyunCMD_TARGETS = $(LIB_TARGET)
135*4882a593Smuzhiyun
136*4882a593SmuzhiyunTARGETS = $(CMD_TARGETS)
137*4882a593Smuzhiyun
138*4882a593Smuzhiyunall: all_cmd plugins
139*4882a593Smuzhiyun
140*4882a593Smuzhiyunall_cmd: $(CMD_TARGETS)
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun$(TE_IN): force
143*4882a593Smuzhiyun	$(Q)$(MAKE) $(build)=libtraceevent
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
146*4882a593Smuzhiyun	$(QUIET_LINK)$(CC) --shared $(LDFLAGS) $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
147*4882a593Smuzhiyun	@ln -sf $(@F) $(OUTPUT)libtraceevent.so
148*4882a593Smuzhiyun	@ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun$(OUTPUT)libtraceevent.a: $(TE_IN)
151*4882a593Smuzhiyun	$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun$(OUTPUT)%.so: $(OUTPUT)%-in.o
154*4882a593Smuzhiyun	$(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
155*4882a593Smuzhiyun
156*4882a593Smuzhiyundefine make_version.h
157*4882a593Smuzhiyun  (echo '/* This file is automatically generated. Do not modify. */';		\
158*4882a593Smuzhiyun   echo \#define VERSION_CODE $(shell						\
159*4882a593Smuzhiyun   expr $(VERSION) \* 256 + $(PATCHLEVEL));					\
160*4882a593Smuzhiyun   echo '#define EXTRAVERSION ' $(EXTRAVERSION);				\
161*4882a593Smuzhiyun   echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"';	\
162*4882a593Smuzhiyun   echo '#define FILE_VERSION '$(FILE_VERSION);					\
163*4882a593Smuzhiyun  ) > $1
164*4882a593Smuzhiyunendef
165*4882a593Smuzhiyun
166*4882a593Smuzhiyundefine update_version.h
167*4882a593Smuzhiyun  ($(call make_version.h, $@.tmp);		\
168*4882a593Smuzhiyun    if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
169*4882a593Smuzhiyun      rm -f $@.tmp;				\
170*4882a593Smuzhiyun    else					\
171*4882a593Smuzhiyun      echo '  UPDATE                 $@';	\
172*4882a593Smuzhiyun      mv -f $@.tmp $@;				\
173*4882a593Smuzhiyun    fi);
174*4882a593Smuzhiyunendef
175*4882a593Smuzhiyun
176*4882a593Smuzhiyunep_version.h: force
177*4882a593Smuzhiyun	$(Q)$(N)$(call update_version.h)
178*4882a593Smuzhiyun
179*4882a593SmuzhiyunVERSION_FILES = ep_version.h
180*4882a593Smuzhiyun
181*4882a593Smuzhiyundefine update_dir
182*4882a593Smuzhiyun  (echo $1 > $@.tmp;				\
183*4882a593Smuzhiyun   if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
184*4882a593Smuzhiyun     rm -f $@.tmp;				\
185*4882a593Smuzhiyun   else						\
186*4882a593Smuzhiyun     echo '  UPDATE                 $@';	\
187*4882a593Smuzhiyun     mv -f $@.tmp $@;				\
188*4882a593Smuzhiyun   fi);
189*4882a593Smuzhiyunendef
190*4882a593Smuzhiyun
191*4882a593Smuzhiyuntags:	force
192*4882a593Smuzhiyun	$(RM) tags
193*4882a593Smuzhiyun	find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
194*4882a593Smuzhiyun	--regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/'
195*4882a593Smuzhiyun
196*4882a593SmuzhiyunTAGS:	force
197*4882a593Smuzhiyun	$(RM) TAGS
198*4882a593Smuzhiyun	find . -name '*.[ch]' | xargs etags \
199*4882a593Smuzhiyun	--regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/'
200*4882a593Smuzhiyun
201*4882a593Smuzhiyundefine do_install_mkdir
202*4882a593Smuzhiyun	if [ ! -d '$(DESTDIR_SQ)$1' ]; then		\
203*4882a593Smuzhiyun		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1';	\
204*4882a593Smuzhiyun	fi
205*4882a593Smuzhiyunendef
206*4882a593Smuzhiyun
207*4882a593Smuzhiyundefine do_install
208*4882a593Smuzhiyun	$(call do_install_mkdir,$2);			\
209*4882a593Smuzhiyun	$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
210*4882a593Smuzhiyunendef
211*4882a593Smuzhiyun
212*4882a593SmuzhiyunPKG_CONFIG_SOURCE_FILE = libtraceevent.pc
213*4882a593SmuzhiyunPKG_CONFIG_FILE := $(addprefix $(OUTPUT),$(PKG_CONFIG_SOURCE_FILE))
214*4882a593Smuzhiyundefine do_install_pkgconfig_file
215*4882a593Smuzhiyun	if [ -n "${pkgconfig_dir}" ]; then 					\
216*4882a593Smuzhiyun		cp -f ${PKG_CONFIG_SOURCE_FILE}.template ${PKG_CONFIG_FILE};	\
217*4882a593Smuzhiyun		sed -i "s|INSTALL_PREFIX|${1}|g" ${PKG_CONFIG_FILE}; 		\
218*4882a593Smuzhiyun		sed -i "s|LIB_VERSION|${EVENT_PARSE_VERSION}|g" ${PKG_CONFIG_FILE}; \
219*4882a593Smuzhiyun		sed -i "s|LIB_DIR|${libdir}|g" ${PKG_CONFIG_FILE}; \
220*4882a593Smuzhiyun		sed -i "s|HEADER_DIR|$(includedir)|g" ${PKG_CONFIG_FILE}; \
221*4882a593Smuzhiyun		$(call do_install,$(PKG_CONFIG_FILE),$(pkgconfig_dir),644); 	\
222*4882a593Smuzhiyun	else 									\
223*4882a593Smuzhiyun		(echo Failed to locate pkg-config directory) 1>&2;		\
224*4882a593Smuzhiyun	fi
225*4882a593Smuzhiyunendef
226*4882a593Smuzhiyun
227*4882a593Smuzhiyuninstall_lib: all_cmd install_plugins install_headers install_pkgconfig
228*4882a593Smuzhiyun	$(call QUIET_INSTALL, $(LIB_TARGET)) \
229*4882a593Smuzhiyun		$(call do_install_mkdir,$(libdir_SQ)); \
230*4882a593Smuzhiyun		cp -fpR $(LIB_INSTALL) $(DESTDIR)$(libdir_SQ)
231*4882a593Smuzhiyun
232*4882a593Smuzhiyuninstall_pkgconfig:
233*4882a593Smuzhiyun	$(call QUIET_INSTALL, $(PKG_CONFIG_FILE)) \
234*4882a593Smuzhiyun		$(call do_install_pkgconfig_file,$(prefix))
235*4882a593Smuzhiyun
236*4882a593Smuzhiyuninstall_headers:
237*4882a593Smuzhiyun	$(call QUIET_INSTALL, headers) \
238*4882a593Smuzhiyun		$(call do_install,event-parse.h,$(includedir_SQ),644); \
239*4882a593Smuzhiyun		$(call do_install,event-utils.h,$(includedir_SQ),644); \
240*4882a593Smuzhiyun		$(call do_install,trace-seq.h,$(includedir_SQ),644); \
241*4882a593Smuzhiyun		$(call do_install,kbuffer.h,$(includedir_SQ),644)
242*4882a593Smuzhiyun
243*4882a593Smuzhiyuninstall: install_lib
244*4882a593Smuzhiyun
245*4882a593Smuzhiyunclean: clean_plugins
246*4882a593Smuzhiyun	$(call QUIET_CLEAN, libtraceevent) \
247*4882a593Smuzhiyun		$(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd; \
248*4882a593Smuzhiyun		$(RM) TRACEEVENT-CFLAGS tags TAGS; \
249*4882a593Smuzhiyun		$(RM) $(PKG_CONFIG_FILE)
250*4882a593Smuzhiyun
251*4882a593SmuzhiyunPHONY += doc
252*4882a593Smuzhiyundoc:
253*4882a593Smuzhiyun	$(call descend,Documentation)
254*4882a593Smuzhiyun
255*4882a593SmuzhiyunPHONY += doc-clean
256*4882a593Smuzhiyundoc-clean:
257*4882a593Smuzhiyun	$(call descend,Documentation,clean)
258*4882a593Smuzhiyun
259*4882a593SmuzhiyunPHONY += doc-install
260*4882a593Smuzhiyundoc-install:
261*4882a593Smuzhiyun	$(call descend,Documentation,install)
262*4882a593Smuzhiyun
263*4882a593SmuzhiyunPHONY += doc-uninstall
264*4882a593Smuzhiyundoc-uninstall:
265*4882a593Smuzhiyun	$(call descend,Documentation,uninstall)
266*4882a593Smuzhiyun
267*4882a593SmuzhiyunPHONY += help
268*4882a593Smuzhiyunhelp:
269*4882a593Smuzhiyun	@echo 'Possible targets:'
270*4882a593Smuzhiyun	@echo''
271*4882a593Smuzhiyun	@echo '  all                 - default, compile the library and the'\
272*4882a593Smuzhiyun				      'plugins'
273*4882a593Smuzhiyun	@echo '  plugins             - compile the plugins'
274*4882a593Smuzhiyun	@echo '  install             - install the library, the plugins,'\
275*4882a593Smuzhiyun					'the header and pkgconfig files'
276*4882a593Smuzhiyun	@echo '  clean               - clean the library and the plugins object files'
277*4882a593Smuzhiyun	@echo '  doc                 - compile the documentation files - man'\
278*4882a593Smuzhiyun					'and html pages, in the Documentation directory'
279*4882a593Smuzhiyun	@echo '  doc-clean           - clean the documentation files'
280*4882a593Smuzhiyun	@echo '  doc-install         - install the man pages'
281*4882a593Smuzhiyun	@echo '  doc-uninstall       - uninstall the man pages'
282*4882a593Smuzhiyun	@echo''
283*4882a593Smuzhiyun
284*4882a593SmuzhiyunPHONY += plugins
285*4882a593Smuzhiyunplugins:
286*4882a593Smuzhiyun	$(call descend,plugins)
287*4882a593Smuzhiyun
288*4882a593SmuzhiyunPHONY += install_plugins
289*4882a593Smuzhiyuninstall_plugins:
290*4882a593Smuzhiyun	$(call descend,plugins,install)
291*4882a593Smuzhiyun
292*4882a593SmuzhiyunPHONY += clean_plugins
293*4882a593Smuzhiyunclean_plugins:
294*4882a593Smuzhiyun	$(call descend,plugins,clean)
295*4882a593Smuzhiyun
296*4882a593Smuzhiyunforce:
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun# Declare the contents of the .PHONY variable as phony.  We keep that
299*4882a593Smuzhiyun# information in a variable so we can use it in if_changed and friends.
300*4882a593Smuzhiyun.PHONY: $(PHONY)
301