blob: a7b7077350c4c466ee30659b3f1cbe880703d6b5 [file] [log] [blame]
# 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)