xref: /aosp_15_r20/external/bpftool/src/Makefile.feature (revision 858ea5e570667251cdc31d3fe7b846b591105938)
1*858ea5e5SAndroid Build Coastguard Worker# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2*858ea5e5SAndroid Build Coastguard Worker
3*858ea5e5SAndroid Build Coastguard Workerpound := \#
4*858ea5e5SAndroid Build Coastguard Worker
5*858ea5e5SAndroid Build Coastguard WorkerCFLAGS_BACKUP := $(CFLAGS)
6*858ea5e5SAndroid Build Coastguard WorkerCFLAGS := $(EXTRA_CFLAGS)
7*858ea5e5SAndroid Build Coastguard Workerifneq ($(LLVM),)
8*858ea5e5SAndroid Build Coastguard Worker  CFLAGS += -Wno-unused-command-line-argument
9*858ea5e5SAndroid Build Coastguard Workerendif
10*858ea5e5SAndroid Build Coastguard Worker
11*858ea5e5SAndroid Build Coastguard Workerifeq ($(V),1)
12*858ea5e5SAndroid Build Coastguard Worker  LOG=$(warning $(1))
13*858ea5e5SAndroid Build Coastguard Worker  LOG_RES = (echo $(1) && >&2 echo result: $(1))
14*858ea5e5SAndroid Build Coastguard Worker  define detect
15*858ea5e5SAndroid Build Coastguard Worker    $(warning $(1) && $(call LOG_RES,1) || $(call LOG_RES,0))
16*858ea5e5SAndroid Build Coastguard Worker    $(shell $(1) && $(call LOG_RES,1) || $(call LOG_RES,0))
17*858ea5e5SAndroid Build Coastguard Worker  endef
18*858ea5e5SAndroid Build Coastguard Workerelse
19*858ea5e5SAndroid Build Coastguard Worker  LOG=
20*858ea5e5SAndroid Build Coastguard Worker  LOG_RES = (echo $(1))
21*858ea5e5SAndroid Build Coastguard Worker  define detect
22*858ea5e5SAndroid Build Coastguard Worker    $(shell $(1) 2>&1 && $(call LOG_RES,1) || $(call LOG_RES,0))
23*858ea5e5SAndroid Build Coastguard Worker  endef
24*858ea5e5SAndroid Build Coastguard Worker  QUIET_STDERR := 2>/dev/null
25*858ea5e5SAndroid Build Coastguard Workerendif
26*858ea5e5SAndroid Build Coastguard Worker
27*858ea5e5SAndroid Build Coastguard Worker### feature-clang-bpf-co-re
28*858ea5e5SAndroid Build Coastguard Worker
29*858ea5e5SAndroid Build Coastguard WorkerCLANG_BPF_CO_RE_PROBE_CMD = \
30*858ea5e5SAndroid Build Coastguard Worker  printf '%s\n' 'struct s { int i; } __attribute__((preserve_access_index)); struct s foo = {};' | \
31*858ea5e5SAndroid Build Coastguard Worker    $(CLANG) -g -target bpf -S -o - -x c - $(QUIET_STDERR) | grep -q BTF_KIND_VAR
32*858ea5e5SAndroid Build Coastguard Worker
33*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring clang-bpf-co-re,$(FEATURE_TESTS)),)
34*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-clang-bpf-co-re)
35*858ea5e5SAndroid Build Coastguard Workerfeature-clang-bpf-co-re := \
36*858ea5e5SAndroid Build Coastguard Worker  $(findstring 1,$(call detect,$(CLANG_BPF_CO_RE_PROBE_CMD)))
37*858ea5e5SAndroid Build Coastguard Workerendif # clang-bpf-co-re
38*858ea5e5SAndroid Build Coastguard Worker
39*858ea5e5SAndroid Build Coastguard Worker### feature-libbfd
40*858ea5e5SAndroid Build Coastguard Worker
41*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring libbfd,$(FEATURE_TESTS)),)
42*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE := '$(pound)include <bfd.h>\n'
43*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE += 'int main(void) {'
44*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE += '	bfd_demangle(0, 0, 0);'
45*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE += '	return 0;'
46*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE += '}'
47*858ea5e5SAndroid Build Coastguard WorkerLIBBFD_PROBE_CMD = printf '%b\n' $(LIBBFD_PROBE) | \
48*858ea5e5SAndroid Build Coastguard Worker  $(CC) $(CFLAGS) -Wall -Werror -x c - $(1) -o /dev/null >/dev/null
49*858ea5e5SAndroid Build Coastguard Worker
50*858ea5e5SAndroid Build Coastguard Workerdefine libbfd_build
51*858ea5e5SAndroid Build Coastguard Worker  $(call detect,$(LIBBFD_PROBE_CMD))
52*858ea5e5SAndroid Build Coastguard Workerendef
53*858ea5e5SAndroid Build Coastguard Worker
54*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-libbfd)
55*858ea5e5SAndroid Build Coastguard Workerfeature-libbfd := \
56*858ea5e5SAndroid Build Coastguard Worker  $(findstring 1,$(call libbfd_build,-lbfd -ldl))
57*858ea5e5SAndroid Build Coastguard Workerifneq ($(feature-libbfd),1)
58*858ea5e5SAndroid Build Coastguard Worker  $(call LOG,Probing: feature-libbfd-liberty)
59*858ea5e5SAndroid Build Coastguard Worker  feature-libbfd-liberty := \
60*858ea5e5SAndroid Build Coastguard Worker    $(findstring 1,$(call libbfd_build,-lbfd -ldl -liberty))
61*858ea5e5SAndroid Build Coastguard Worker  ifneq ($(feature-libbfd-liberty),1)
62*858ea5e5SAndroid Build Coastguard Worker    $(call LOG,Probing: feature-libbfd-liberty-z)
63*858ea5e5SAndroid Build Coastguard Worker    feature-libbfd-liberty-z := \
64*858ea5e5SAndroid Build Coastguard Worker      $(findstring 1,$(call libbfd_build,-lbfd -ldl -liberty -lz))
65*858ea5e5SAndroid Build Coastguard Worker  endif
66*858ea5e5SAndroid Build Coastguard Workerendif
67*858ea5e5SAndroid Build Coastguard WorkerHAS_LIBBFD := $(findstring 1, \
68*858ea5e5SAndroid Build Coastguard Worker  $(feature-libbfd)$(feature-libbfd-liberty)$(feature-libbfd-liberty-z))
69*858ea5e5SAndroid Build Coastguard Workerendif # libbfd
70*858ea5e5SAndroid Build Coastguard Worker
71*858ea5e5SAndroid Build Coastguard Worker### feature-disassembler-four-args
72*858ea5e5SAndroid Build Coastguard Worker
73*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring disassembler-four-args,$(FEATURE_TESTS)),)
74*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE := '$(pound)include <dis-asm.h>\n'
75*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE += 'int main(void) {'
76*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE += '	disassembler((enum bfd_architecture)0, 0, 0, NULL);'
77*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE += '	return 0;'
78*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE += '}'
79*858ea5e5SAndroid Build Coastguard Worker
80*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_PROBE_CMD = printf '%b\n' $(1) | \
81*858ea5e5SAndroid Build Coastguard Worker  $(CC) $(CFLAGS) -Wall -Werror -x c - -lbfd -lopcodes -S -o - >/dev/null
82*858ea5e5SAndroid Build Coastguard Workerdefine disassembler_build
83*858ea5e5SAndroid Build Coastguard Worker  $(call detect,$(DISASSEMBLER_PROBE_CMD))
84*858ea5e5SAndroid Build Coastguard Workerendef
85*858ea5e5SAndroid Build Coastguard Worker
86*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-disassembler-four-args)
87*858ea5e5SAndroid Build Coastguard Workerfeature-disassembler-four-args := \
88*858ea5e5SAndroid Build Coastguard Worker    $(findstring 1, $(call disassembler_build,$(DISASSEMBLER_PROBE)))
89*858ea5e5SAndroid Build Coastguard Workerendif # disassembler-four-args
90*858ea5e5SAndroid Build Coastguard Worker
91*858ea5e5SAndroid Build Coastguard Worker### feature-disassembler-init-styled
92*858ea5e5SAndroid Build Coastguard Worker
93*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring disassembler-init-styled,$(FEATURE_TESTS)),)
94*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_STYLED_PROBE := '$(pound)include <dis-asm.h>\n'
95*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_STYLED_PROBE += 'int main(void) {'
96*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_STYLED_PROBE += '	init_disassemble_info(NULL, 0, NULL, NULL);'
97*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_STYLED_PROBE += '	return 0;'
98*858ea5e5SAndroid Build Coastguard WorkerDISASSEMBLER_STYLED_PROBE += '}'
99*858ea5e5SAndroid Build Coastguard Worker
100*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-disassembler-styled)
101*858ea5e5SAndroid Build Coastguard Workerfeature-disassembler-init-styled := \
102*858ea5e5SAndroid Build Coastguard Worker    $(findstring 1, $(call disassembler_build,$(DISASSEMBLER_STYLED_PROBE)))
103*858ea5e5SAndroid Build Coastguard Workerendif # disassembler-init-styled
104*858ea5e5SAndroid Build Coastguard Worker
105*858ea5e5SAndroid Build Coastguard Worker### feature-libcap
106*858ea5e5SAndroid Build Coastguard Worker
107*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring libcap,$(FEATURE_TESTS)),)
108*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE := '$(pound)include <sys/capability.h>\n'
109*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE += 'int main(void) {'
110*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE += '	cap_free(0);'
111*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE += '	return 0;'
112*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE += '}'
113*858ea5e5SAndroid Build Coastguard WorkerLIBCAP_PROBE_CMD = printf '%b\n' $(LIBCAP_PROBE) | \
114*858ea5e5SAndroid Build Coastguard Worker  $(CC) $(CFLAGS) -Wall -Werror -x c - -lcap -S -o - >/dev/null
115*858ea5e5SAndroid Build Coastguard Worker
116*858ea5e5SAndroid Build Coastguard Workerdefine libcap_build
117*858ea5e5SAndroid Build Coastguard Worker  $(call detect,$(LIBCAP_PROBE_CMD))
118*858ea5e5SAndroid Build Coastguard Workerendef
119*858ea5e5SAndroid Build Coastguard Worker
120*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-libcap)
121*858ea5e5SAndroid Build Coastguard Workerfeature-libcap := $(findstring 1, $(call libcap_build))
122*858ea5e5SAndroid Build Coastguard Workerendif # libcap
123*858ea5e5SAndroid Build Coastguard Worker
124*858ea5e5SAndroid Build Coastguard Worker### feature-llvm
125*858ea5e5SAndroid Build Coastguard Worker
126*858ea5e5SAndroid Build Coastguard Workerifneq ($(findstring llvm,$(FEATURE_TESTS)),)
127*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE := '$(pound)include <llvm-c/Core.h>\n'
128*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += '$(pound)include <llvm-c/TargetMachine.h>\n'
129*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += 'int main(void) {'
130*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += '	char *triple = LLVMNormalizeTargetTriple("");'
131*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += '	LLVMDisposeMessage(triple);'
132*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += '	return 0;'
133*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE += '}'
134*858ea5e5SAndroid Build Coastguard Worker
135*858ea5e5SAndroid Build Coastguard Worker# We need some adjustments for the flags.
136*858ea5e5SAndroid Build Coastguard Worker# - $(CFLAGS) was set to parent $(EXTRA_CFLAGS) at the beginning of this file.
137*858ea5e5SAndroid Build Coastguard Worker# - $(EXTRA_LDFLAGS) from parent Makefile should be kept as well.
138*858ea5e5SAndroid Build Coastguard Worker# - Libraries to use depend on whether we have a static or shared version of
139*858ea5e5SAndroid Build Coastguard Worker#   LLVM, pass the llvm-config flag and adjust the list of libraries
140*858ea5e5SAndroid Build Coastguard Worker#   accordingly.
141*858ea5e5SAndroid Build Coastguard WorkerFEATURE_LLVM_CFLAGS := $(CFLAGS) $(shell $(LLVM_CONFIG) --cflags 2>/dev/null)
142*858ea5e5SAndroid Build Coastguard WorkerFEATURE_LLVM_LIBS := $(shell $(LLVM_CONFIG) --libs target 2>/dev/null)
143*858ea5e5SAndroid Build Coastguard Workerifeq ($(shell $(LLVM_CONFIG) --shared-mode 2>/dev/null),static)
144*858ea5e5SAndroid Build Coastguard Worker  FEATURE_LLVM_LIBS += $(shell $(LLVM_CONFIG) --system-libs target 2>/dev/null)
145*858ea5e5SAndroid Build Coastguard Worker  FEATURE_LLVM_LIBS += -lstdc++
146*858ea5e5SAndroid Build Coastguard Workerendif
147*858ea5e5SAndroid Build Coastguard WorkerFEATURE_LDFLAGS := $(EXTRA_LDFLAGS) $(shell $(LLVM_CONFIG) --ldflags 2>/dev/null)
148*858ea5e5SAndroid Build Coastguard Worker
149*858ea5e5SAndroid Build Coastguard WorkerLLVM_PROBE_CMD = printf '%b\n' $(LLVM_PROBE) | \
150*858ea5e5SAndroid Build Coastguard Worker  $(CC) $(FEATURE_LLVM_CFLAGS) $(FEATURE_LDFLAGS) \
151*858ea5e5SAndroid Build Coastguard Worker    -Wall -Werror -x c - $(FEATURE_LLVM_LIBS) \
152*858ea5e5SAndroid Build Coastguard Worker    -o /dev/null >/dev/null
153*858ea5e5SAndroid Build Coastguard Worker
154*858ea5e5SAndroid Build Coastguard Workerdefine llvm_build
155*858ea5e5SAndroid Build Coastguard Worker  $(call detect,$(LLVM_PROBE_CMD))
156*858ea5e5SAndroid Build Coastguard Workerendef
157*858ea5e5SAndroid Build Coastguard Worker
158*858ea5e5SAndroid Build Coastguard Worker$(call LOG,Probing: feature-llvm)
159*858ea5e5SAndroid Build Coastguard Workerfeature-llvm := $(findstring 1, $(call llvm_build))
160*858ea5e5SAndroid Build Coastguard Workerendif # llvm
161*858ea5e5SAndroid Build Coastguard Worker
162*858ea5e5SAndroid Build Coastguard Worker### Print detection results
163*858ea5e5SAndroid Build Coastguard Worker
164*858ea5e5SAndroid Build Coastguard Workerdefine print_status
165*858ea5e5SAndroid Build Coastguard Worker  ifeq ($(1), 1)
166*858ea5e5SAndroid Build Coastguard Worker    MSG = $(shell printf '...%30s: [ \033[32mon\033[m  ]' $(2))
167*858ea5e5SAndroid Build Coastguard Worker  else
168*858ea5e5SAndroid Build Coastguard Worker    MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(2))
169*858ea5e5SAndroid Build Coastguard Worker  endif
170*858ea5e5SAndroid Build Coastguard Workerendef
171*858ea5e5SAndroid Build Coastguard Workerfeature_print_status = $(eval $(print_status)) $(info $(MSG))
172*858ea5e5SAndroid Build Coastguard Worker
173*858ea5e5SAndroid Build Coastguard Worker$(call feature_print_status,$(HAS_LIBBFD),libbfd)
174*858ea5e5SAndroid Build Coastguard Worker
175*858ea5e5SAndroid Build Coastguard Worker$(foreach feature,$(filter-out libbfd%,$(FEATURE_DISPLAY)), \
176*858ea5e5SAndroid Build Coastguard Worker  $(call feature_print_status,$(feature-$(feature)),$(feature)))
177*858ea5e5SAndroid Build Coastguard Worker
178*858ea5e5SAndroid Build Coastguard WorkerCFLAGS := $(CFLAGS_BACKUP)
179*858ea5e5SAndroid Build Coastguard Workerundefine LOG LOG_RES
180