| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | |
| pound := \# | |
| CFLAGS_BACKUP := $(CFLAGS) | |
| ifneq ($(LLVM),) | |
| CFLAGS += -Wno-unused-command-line-argument | |
| endif | |
| ### feature-clang-bpf-co-re | |
| feature-clang-bpf-co-re := \ | |
| $(shell printf '%s\n' 'struct s { int i; } __attribute__((preserve_access_index)); struct s foo;' | \ | |
| $(CLANG) -g -target bpf -S -o - -x c - 2>/dev/null | grep -q BTF_KIND_VAR && echo 1) | |
| ### feature-reallocarray | |
| # This mirror re-implements reallocarray(), so the function is always available. | |
| feature-reallocarray := 1 | |
| ### feature-libbfd | |
| LIBBFD_PROBE := '$(pound)include <bfd.h>\n' | |
| LIBBFD_PROBE += 'int main(void) {' | |
| LIBBFD_PROBE += ' bfd_demangle(0, 0, 0);' | |
| LIBBFD_PROBE += ' return 0;' | |
| LIBBFD_PROBE += '}' | |
| define libbfd_build | |
| $(shell printf '%b\n' $(LIBBFD_PROBE) | \ | |
| $(CC) $(CFLAGS) -Wall -Werror $(LDFLAGS) -x c - $(1) -S -o - >/dev/null 2>&1 \ | |
| && echo 1) | |
| endef | |
| feature-libbfd := \ | |
| $(findstring 1,$(call libbfd_build,-lbfd -ldl)) | |
| ifneq ($(feature-libbfd),1) | |
| feature-libbfd-liberty := \ | |
| $(findstring 1,$(call libbfd_build,-lbfd -ldl -liberty)) | |
| ifneq ($(feature-libbfd-liberty),1) | |
| $(findstring 1,feature-libbfd-liberty-z := \ | |
| $(call libbfd_build,-lbfd -ldl -liberty -lz)) | |
| endif | |
| endif | |
| HAS_LIBBFD := $(findstring 1, \ | |
| $(feature-libbfd)$(feature-libbfd-liberty)$(feature-libbfd-liberty-z)) | |
| ### feature-disassembler-four-args | |
| DISASSEMBLER_PROBE := '$(pound)include <dis-asm.h>\n' | |
| DISASSEMBLER_PROBE += 'int main(void) {' | |
| DISASSEMBLER_PROBE += ' disassembler((enum bfd_architecture)0, 0, 0, NULL);' | |
| DISASSEMBLER_PROBE += ' return 0;' | |
| DISASSEMBLER_PROBE += '}' | |
| define disassembler_build | |
| $(shell printf '%b\n' $(DISASSEMBLER_PROBE) | \ | |
| $(CC) $(CFLAGS) -Wall -Werror $(LDFLAGS) -x c - -lbfd -lopcodes -S -o - >/dev/null 2>&1 \ | |
| && echo 1) | |
| endef | |
| feature-disassembler-four-args := $(findstring 1, $(call disassembler_build)) | |
| ### feature-zlib | |
| ZLIB_PROBE := '$(pound)include <zlib.h>\n' | |
| ZLIB_PROBE += 'int main(void) {' | |
| ZLIB_PROBE += ' gzopen(NULL, "r");' | |
| ZLIB_PROBE += ' return 0;' | |
| ZLIB_PROBE += '}' | |
| define zlib_build | |
| $(shell printf '%b\n' $(ZLIB_PROBE) | \ | |
| $(CC) $(CFLAGS) -Wall -Werror $(LDFLAGS) -x c - -lz -S -o - >/dev/null 2>&1 \ | |
| && echo 1) | |
| endef | |
| feature-zlib := $(findstring 1, $(call zlib_build)) | |
| ### feature-libcap | |
| LIBCAP_PROBE := '$(pound)include <sys/capability.h>\n' | |
| LIBCAP_PROBE += 'int main(void) {' | |
| LIBCAP_PROBE += ' cap_free(0);' | |
| LIBCAP_PROBE += ' return 0;' | |
| LIBCAP_PROBE += '}' | |
| define libcap_build | |
| $(shell printf '%b\n' $(LIBCAP_PROBE) | \ | |
| $(CC) $(CFLAGS) -Wall -Werror $(LDFLAGS) -x c - -lcap -S -o - >/dev/null 2>&1 \ | |
| && echo 1) | |
| endef | |
| feature-libcap := $(findstring 1, $(call libcap_build)) | |
| ### Print detection results | |
| define print_status | |
| ifeq ($(1), 1) | |
| MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(2)) | |
| else | |
| MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(2)) | |
| endif | |
| endef | |
| feature_print_status = $(eval $(print_status)) $(info $(MSG)) | |
| $(call feature_print_status,$(HAS_LIBBFD),libbfd) | |
| $(foreach feature,$(filter-out libbfd,$(FEATURE_DISPLAY)), \ | |
| $(call feature_print_status,$(feature-$(feature)),$(feature))) | |
| CFLAGS := $(CFLAGS_BACKUP) |