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