mirror of
https://github.com/torvalds/linux.git
synced 2026-11-10 17:11:02 +01:00
Three build configurations broke recently without the build test suite
noticing, as none of them were covered:
- "CC=clang" on its own. CXX is only set to clang++ by "make LLVM=1",
so CXX stays as g++ and used to be passed clang's flags.
- "CC=clang BUILD_NONDISTRO=1", where libbfd.c failed clang's
-Wthread-safety analysis.
- "BUILD_NONDISTRO=1 NO_DEMANGLE=1", the only combination that
compiles the libbfd demangling in symbol.c, which referred to
identifiers nothing declared.
Add the three. The clang ones need clang installed, and the libbfd ones
reuse the existing binutils check.
Testing that perf was built isn't enough for the first one. Feature
tests are allowed to fail, so a broken C++ compiler command line doesn't
fail the build, it silently turns off every feature needing a C++
compiler and the build still produces a working perf. Check that libLLVM
is still built in, which is the C++ dependent feature perf can report
on, so the test fails instead of quietly producing a perf with less in
it than the default build has.
Only make that check when libLLVM can be built in the first place. The
llvm-perf feature test compiles and links against the llvm-devel/llvm-dev
headers and libraries and needs version 13 or newer, so the presence of
llvm-config on its own says nothing. Probe the same way the feature test
does and fall back to only testing that perf was built when the probe
fails, rather than turning a machine without the LLVM development files
into a spurious failure.
For the same reason the clang tests must not reuse a feature dump made
with the default compiler, so exclude them from REUSE_FEATURES_DUMP.
Signed-off-by: Ian Rogers <irogers@google.com>
Assisted-by: Antigravity:gemini-3.1-pro
Acked-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
473 lines
16 KiB
Plaintext
473 lines
16 KiB
Plaintext
include ../scripts/Makefile.include
|
|
|
|
ifndef MK
|
|
ifeq ($(MAKECMDGOALS),)
|
|
# no target specified, trigger the whole suite
|
|
all:
|
|
@echo "Testing Makefile"; $(MAKE) -sf tests/make MK=Makefile
|
|
@echo "Testing Makefile.perf"; $(MAKE) -sf tests/make MK=Makefile.perf SET_PARALLEL=1 SET_O=1
|
|
else
|
|
# run only specific test over 'Makefile'
|
|
%:
|
|
@echo "Testing Makefile"; $(MAKE) -sf tests/make MK=Makefile $@
|
|
endif
|
|
else
|
|
PERF := .
|
|
PERF_O := $(PERF)
|
|
O_OPT :=
|
|
FULL_O := $(shell readlink -f $(PERF_O) || echo $(PERF_O))
|
|
|
|
ifneq ($(O),)
|
|
FULL_O := $(shell readlink -f $(O) || echo $(O))
|
|
PERF_O := $(FULL_O)
|
|
ifeq ($(SET_O),1)
|
|
O_OPT := 'O=$(FULL_O)'
|
|
endif
|
|
K_O_OPT := 'O=$(FULL_O)'
|
|
endif
|
|
|
|
PARALLEL_OPT=
|
|
ifeq ($(SET_PARALLEL),1)
|
|
ifeq ($(findstring jobserver,$(MAKEFLAGS))$(findstring -j,$(MAKEFLAGS)),)
|
|
ifeq ($(JOBS),)
|
|
cores := $(shell (getconf _NPROCESSORS_ONLN || grep -E -c '^processor|^CPU[0-9]' /proc/cpuinfo) 2>/dev/null)
|
|
ifeq ($(cores),0)
|
|
cores := 1
|
|
endif
|
|
else
|
|
cores=$(JOBS)
|
|
endif
|
|
PARALLEL_OPT="-j$(cores)"
|
|
endif
|
|
endif
|
|
|
|
# As per kernel Makefile, avoid funny character set dependencies
|
|
unexport LC_ALL
|
|
LC_COLLATE=C
|
|
LC_NUMERIC=C
|
|
export LC_COLLATE LC_NUMERIC
|
|
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
#$(info Determined 'srctree' to be $(srctree))
|
|
endif
|
|
|
|
include $(srctree)/tools/scripts/Makefile.arch
|
|
|
|
# FIXME looks like x86 is the only arch running tests ;-)
|
|
# we need some IS_(32/64) flag to make this generic
|
|
ifeq ($(ARCH)$(IS_64_BIT), x861)
|
|
lib = lib64
|
|
else
|
|
lib = lib
|
|
endif
|
|
|
|
has = $(shell which $1 2>/dev/null)
|
|
python_perf_so := $(shell $(MAKE) python_perf_target|grep "Target is:"|awk '{print $$3}')
|
|
|
|
# standard single make variable specified
|
|
make_clean_all := clean all
|
|
make_python_perf_so := $(python_perf_so)
|
|
make_debug := DEBUG=1
|
|
make_nondistro := BUILD_NONDISTRO=1
|
|
make_nondistro_no_demangle := BUILD_NONDISTRO=1 NO_DEMANGLE=1
|
|
make_clang := CC=clang
|
|
make_clang_nondistro := CC=clang BUILD_NONDISTRO=1
|
|
make_extra_tests := EXTRA_TESTS=1
|
|
make_no_jevents := NO_JEVENTS=1
|
|
make_jevents_all := JEVENTS_ARCH=all
|
|
make_no_bpf_skel := BUILD_BPF_SKEL=0
|
|
make_gen_vmlinux_h := GEN_VMLINUX_H=1
|
|
make_libperl := LIBPERL=1
|
|
make_no_libpython := NO_LIBPYTHON=1
|
|
make_no_scripts := NO_LIBPYTHON=1
|
|
make_no_slang := NO_SLANG=1
|
|
make_no_demangle := NO_DEMANGLE=1
|
|
make_no_libelf := NO_LIBELF=1
|
|
make_no_libdw := NO_LIBDW=1
|
|
make_libunwind := LIBUNWIND=1
|
|
make_no_backtrace := NO_BACKTRACE=1
|
|
make_no_libcapstone := NO_CAPSTONE=1
|
|
make_libcapstone_dlopen := LIBCAPSTONE_DLOPEN=1
|
|
make_no_libnuma := NO_LIBNUMA=1
|
|
make_no_libbionic := NO_LIBBIONIC=1
|
|
make_no_libbpf := NO_LIBBPF=1
|
|
make_libbpf_dynamic := LIBBPF_DYNAMIC=1
|
|
make_no_libbpf_DEBUG := NO_LIBBPF=1 DEBUG=1
|
|
make_no_libllvm := NO_LIBLLVM=1
|
|
make_no_babeltrace2 := NO_BABELTRACE2=1
|
|
make_with_coresight := CORESIGHT=1
|
|
make_no_sdt := NO_SDT=1
|
|
make_no_libpfm4 := NO_LIBPFM4=1
|
|
make_with_gtk4 := GTK4=1
|
|
make_refcnt_check := EXTRA_CFLAGS="-DREFCNT_CHECKING=1"
|
|
make_tags := tags
|
|
make_cscope := cscope
|
|
make_help := help
|
|
make_doc := doc
|
|
make_perf_o := perf.o
|
|
make_util_map_o := util/map.o
|
|
make_util_pmu_bison_o := util/pmu-bison.o
|
|
make_install := install
|
|
make_install_bin := install-bin
|
|
make_install_doc := install-doc
|
|
make_install_man := install-man
|
|
make_install_html := install-html
|
|
make_install_info := install-info
|
|
make_install_pdf := install-pdf
|
|
make_install_prefix := install prefix=/tmp/krava
|
|
make_install_prefix_slash := install prefix=/tmp/krava/
|
|
make_static := LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 NO_LIBTRACEEVENT=1 NO_LIBELF=1
|
|
|
|
# all the NO_* variable combined
|
|
make_minimal := NO_LIBPYTHON=1
|
|
make_minimal += NO_DEMANGLE=1 NO_LIBELF=1 NO_BACKTRACE=1
|
|
make_minimal += NO_LIBNUMA=1 NO_LIBBIONIC=1 NO_LIBDW=1
|
|
make_minimal += NO_LIBBPF=1
|
|
make_minimal += NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1
|
|
make_minimal += NO_CAPSTONE=1
|
|
|
|
# binutils 2_42 and newer have bfd_thread_init()
|
|
new_libbfd := $(shell echo '#include <bfd.h>' | $(CC) -E -x c - | grep bfd_thread_init)
|
|
|
|
# Whether libLLVM can be built, which needs the llvm-devel/llvm-dev headers and
|
|
# libraries of version 13 or newer, not just llvm-config. This mirrors the
|
|
# llvm-perf feature test in tools/build/feature/test-llvm-perf.cpp so that
|
|
# libLLVM is only asserted below when the default compiler can really build it.
|
|
ifneq ($(call has,$(LLVM_CONFIG)),)
|
|
have_libllvm := $(shell printf '#include <llvm/Support/ManagedStatic.h>\n#include <llvm/Support/raw_ostream.h>\n#if LLVM_VERSION_MAJOR < 13\n#error "llvm-devel/llvm-dev version 13 or greater is required"\n#endif\nint main(){llvm::errs()<<"";llvm::llvm_shutdown();return 0;}\n' | \
|
|
$(CXX) -x c++ -std=gnu++17 -I$(shell $(LLVM_CONFIG) --includedir 2>/dev/null) - -o /dev/null \
|
|
-L$(shell $(LLVM_CONFIG) --libdir 2>/dev/null) \
|
|
$(shell $(LLVM_CONFIG) --libs Core BPF 2>/dev/null) \
|
|
$(shell $(LLVM_CONFIG) --system-libs 2>/dev/null) >/dev/null 2>&1 && echo y)
|
|
endif
|
|
|
|
# $(run) contains all available tests
|
|
run := make_pure
|
|
# Targets 'clean all' can be run together only through top level
|
|
# Makefile because we detect clean target in Makefile.perf and
|
|
# disable features detection
|
|
ifeq ($(MK),Makefile)
|
|
run += make_clean_all
|
|
MAKE_F := $(MAKE)
|
|
else
|
|
MAKE_F := $(MAKE) -f $(MK)
|
|
endif
|
|
run += make_python_perf_so
|
|
run += make_debug
|
|
ifneq ($(new_libbfd),)
|
|
run += make_nondistro
|
|
# Demangling with libbfd is only built when the C++ ABI's __cxa_demangle
|
|
# isn't available, so it needs a build of its own to be compiled at all.
|
|
run += make_nondistro_no_demangle
|
|
endif
|
|
# CXX is only set to clang++ by LLVM=1, so a CC=clang build has to cope with
|
|
# a C compiler and a C++ compiler that don't match.
|
|
ifneq ($(call has,clang),)
|
|
run += make_clang
|
|
ifneq ($(new_libbfd),)
|
|
run += make_clang_nondistro
|
|
endif
|
|
endif
|
|
run += make_extra_tests
|
|
run += make_no_jevents
|
|
run += make_jevents_all
|
|
run += make_no_bpf_skel
|
|
run += make_gen_vmlinux_h
|
|
run += make_libperl
|
|
run += make_no_libpython
|
|
run += make_no_scripts
|
|
run += make_no_slang
|
|
run += make_no_demangle
|
|
run += make_no_libelf
|
|
run += make_no_libdw
|
|
run += make_libunwind
|
|
run += make_no_backtrace
|
|
run += make_no_libcapstone
|
|
run += make_libcapstone_dlopen
|
|
run += make_no_libnuma
|
|
run += make_no_libbionic
|
|
run += make_no_libbpf
|
|
run += make_no_libbpf_DEBUG
|
|
run += make_no_libllvm
|
|
run += make_no_sdt
|
|
run += make_no_babeltrace2
|
|
run += make_with_coresight
|
|
run += make_no_libpfm4
|
|
run += make_refcnt_check
|
|
run += make_help
|
|
run += make_doc
|
|
run += make_perf_o
|
|
run += make_util_map_o
|
|
run += make_util_pmu_bison_o
|
|
run += make_install
|
|
run += make_install_bin
|
|
run += make_install_prefix
|
|
run += make_install_prefix_slash
|
|
# FIXME 'install-*' commented out till they're fixed
|
|
# run += make_install_doc
|
|
# run += make_install_man
|
|
# run += make_install_html
|
|
# run += make_install_info
|
|
# run += make_install_pdf
|
|
run += make_minimal
|
|
|
|
old_libbpf := $(shell echo '\#include <bpf/libbpf.h>' | $(CC) -E -dM -x c -| grep -q -E "define[[:space:]]+LIBBPF_MAJOR_VERSION[[:space:]]+0{1}")
|
|
|
|
ifneq ($(old_libbpf),)
|
|
run += make_libbpf_dynamic
|
|
endif
|
|
|
|
ifneq ($(call has,ctags),)
|
|
run += make_tags
|
|
endif
|
|
ifneq ($(call has,cscope),)
|
|
run += make_cscope
|
|
endif
|
|
|
|
# $(run_O) contains same portion of $(run) tests with '_O' attached
|
|
# to distinguish O=... tests
|
|
run_O := $(addsuffix _O,$(run))
|
|
|
|
# disable some tests for O=...
|
|
run_O := $(filter-out make_python_perf_so_O,$(run_O))
|
|
|
|
# define test for each compile as 'test_NAME' variable
|
|
# with the test itself as a value
|
|
test_make_tags = test -f tags
|
|
test_make_cscope = test -f cscope.out
|
|
|
|
test_make_tags_O := $(test_make_tags)
|
|
test_make_cscope_O := $(test_make_cscope)
|
|
|
|
test_ok := true
|
|
test_make_help := $(test_ok)
|
|
test_make_doc := $(test_ok)
|
|
test_make_help_O := $(test_ok)
|
|
test_make_doc_O := $(test_ok)
|
|
|
|
test_make_python_perf_so := test -f $(PERF_O)/$(python_perf_so)
|
|
|
|
test_make_perf_o := test -f $(PERF_O)/perf.o
|
|
test_make_util_map_o := test -f $(PERF_O)/util/map.o
|
|
test_make_util_pmu_bison_o := test -f $(PERF_O)/util/pmu-bison.o
|
|
|
|
define test_dest_files
|
|
for file in $(1); do \
|
|
if [ ! -f $$TMP_DEST/$$file ]; then \
|
|
echo " failed to find: $$file"; \
|
|
fi \
|
|
done
|
|
endef
|
|
|
|
installed_files_bin := bin/perf
|
|
installed_files_bin += etc/bash_completion.d/perf
|
|
installed_files_bin += libexec/perf-core/perf-archive
|
|
|
|
installed_files_all := $(installed_files_bin)
|
|
|
|
test_make_install := $(call test_dest_files,$(installed_files_all))
|
|
test_make_install_O := $(call test_dest_files,$(installed_files_all))
|
|
test_make_install_bin := $(call test_dest_files,$(installed_files_bin))
|
|
test_make_install_bin_O := $(call test_dest_files,$(installed_files_bin))
|
|
|
|
# We prefix all installed files for make_install_prefix(_slash)
|
|
# with '/tmp/krava' to match installed/prefix-ed files.
|
|
installed_files_all_prefix := $(addprefix /tmp/krava/,$(installed_files_all))
|
|
test_make_install_prefix := $(call test_dest_files,$(installed_files_all_prefix))
|
|
test_make_install_prefix_O := $(call test_dest_files,$(installed_files_all_prefix))
|
|
|
|
test_make_install_prefix_slash := $(test_make_install_prefix)
|
|
test_make_install_prefix_slash_O := $(test_make_install_prefix_O)
|
|
|
|
# FIXME nothing gets installed
|
|
test_make_install_man := test -f $$TMP_DEST/share/man/man1/perf.1
|
|
test_make_install_man_O := $(test_make_install_man)
|
|
|
|
# FIXME nothing gets installed
|
|
test_make_install_doc := $(test_ok)
|
|
test_make_install_doc_O := $(test_ok)
|
|
|
|
# FIXME nothing gets installed
|
|
test_make_install_html := $(test_ok)
|
|
test_make_install_html_O := $(test_ok)
|
|
|
|
# FIXME nothing gets installed
|
|
test_make_install_info := $(test_ok)
|
|
test_make_install_info_O := $(test_ok)
|
|
|
|
# FIXME nothing gets installed
|
|
test_make_install_pdf := $(test_ok)
|
|
test_make_install_pdf_O := $(test_ok)
|
|
|
|
test_make_libbpf_dynamic := ldd $(PERF_O)/perf | grep -q libbpf
|
|
test_make_libbpf_dynamic_O := ldd $$TMP_O/perf | grep -q libbpf
|
|
|
|
# Feature tests are allowed to fail, so a broken C++ compiler command line
|
|
# doesn't fail the build, it just quietly turns off everything that needs a
|
|
# C++ compiler. Check a feature that does, otherwise these tests would pass
|
|
# while producing a perf with less in it than the default build has.
|
|
ifneq ($(have_libllvm),)
|
|
test_make_clang := test -x $(PERF_O)/perf && $(PERF_O)/perf check -q feature libLLVM
|
|
test_make_clang_O := test -x $$TMP_O/perf && $$TMP_O/perf check -q feature libLLVM
|
|
test_make_clang_nondistro := $(test_make_clang)
|
|
test_make_clang_nondistro_O := $(test_make_clang_O)
|
|
endif
|
|
|
|
test_make_python_perf_so_O := test -f $$TMP_O/python/perf.so
|
|
test_make_perf_o_O := test -f $$TMP_O/perf.o
|
|
test_make_util_map_o_O := test -f $$TMP_O/util/map.o
|
|
test_make_util_pmu_bison_o_O := test -f $$TMP_O/util/pmu-bison.o
|
|
|
|
test_default = test -x $(PERF_O)/perf
|
|
test = $(if $(test_$1),$(test_$1),$(test_default))
|
|
|
|
test_default_O = test -x $$TMP_O/perf
|
|
test_O = $(if $(test_$1),$(test_$1),$(test_default_O))
|
|
|
|
all:
|
|
|
|
ifdef SHUF
|
|
run := $(shell shuf -e $(run))
|
|
run_O := $(shell shuf -e $(run_O))
|
|
endif
|
|
|
|
max_width := $(shell echo $(run_O) | sed 's/ /\n/g' | wc -L)
|
|
|
|
ifdef DEBUG
|
|
d := $(info run $(run))
|
|
d := $(info run_O $(run_O))
|
|
endif
|
|
|
|
MAKEFLAGS := --no-print-directory
|
|
|
|
clean := @(cd $(PERF); $(MAKE_F) -s $(O_OPT) clean >/dev/null && $(MAKE) -s $(O_OPT) -C ../build clean >/dev/null)
|
|
|
|
$(run):
|
|
$(call clean)
|
|
+@TMP_DEST=$$(mktemp -d); \
|
|
trap 'rm -rf $@ $$TMP_DEST; exit 130' INT TERM; \
|
|
cmd="cd $(PERF) && $(MAKE_F) $($@) $(PARALLEL_OPT) $(O_OPT) DESTDIR=$$TMP_DEST"; \
|
|
printf "%*.*s: %s\n" $(max_width) $(max_width) "$@" "$$cmd" && echo $$cmd > $@ && \
|
|
( eval $$cmd ) >> $@ 2>&1; \
|
|
echo " test: $(call test,$@)" >> $@ 2>&1; \
|
|
$(call test,$@) && \
|
|
rm -rf $@ $$TMP_DEST || (cat $@ ; false)
|
|
|
|
make_with_gtk4:
|
|
$(call clean)
|
|
+@TMP_DEST=$$(mktemp -d); \
|
|
trap 'rm -rf $@ $$TMP_DEST; exit 130' INT TERM; \
|
|
cmd="cd $(PERF) && $(MAKE_F) $($@) $(PARALLEL_OPT) $(O_OPT) DESTDIR=$$TMP_DEST"; \
|
|
printf "%*.*s: %s\n" $(max_width) $(max_width) "$@" "$$cmd" && echo $$cmd > $@ && \
|
|
( eval $$cmd ) >> $@ 2>&1; \
|
|
echo " test: $(call test,$@)" >> $@ 2>&1; \
|
|
$(call test,$@) && \
|
|
rm -rf $@ $$TMP_DEST || (cat $@ ; false)
|
|
|
|
make_static:
|
|
$(call clean)
|
|
+@TMP_DEST=$$(mktemp -d); \
|
|
trap 'rm -rf $@ $$TMP_DEST; exit 130' INT TERM; \
|
|
cmd="cd $(PERF) && $(MAKE_F) $($@) $(PARALLEL_OPT) $(O_OPT) DESTDIR=$$TMP_DEST"; \
|
|
printf "%*.*s: %s\n" $(max_width) $(max_width) "$@" "$$cmd" && echo $$cmd > $@ && \
|
|
( eval $$cmd ) >> $@ 2>&1; \
|
|
echo " test: $(call test,$@)" >> $@ 2>&1; \
|
|
$(call test,$@) && \
|
|
rm -rf $@ $$TMP_DEST || (cat $@ ; false)
|
|
|
|
$(run_O):
|
|
ifneq ($(O_CLEAN),0)
|
|
$(call clean)
|
|
endif
|
|
+@TMP_O=$$(mktemp -d); \
|
|
TMP_DEST=$$(mktemp -d); \
|
|
trap 'rm -rf $@ $$TMP_O $$TMP_DEST; exit 130' INT TERM; \
|
|
cmd="cd $(PERF) && $(MAKE_F) $($(patsubst %_O,%,$@)) $(PARALLEL_OPT) O=$$TMP_O DESTDIR=$$TMP_DEST"; \
|
|
printf "%*.*s: %s\n" $(max_width) $(max_width) "$@" "$$cmd" && echo $$cmd > $@ && \
|
|
( eval $$cmd ) >> $@ 2>&1 && \
|
|
echo " test: $(call test_O,$@)" >> $@ 2>&1; \
|
|
$(call test_O,$@) && \
|
|
rm -rf $@ $$TMP_O $$TMP_DEST || (cat $@ ; false)
|
|
|
|
tarpkg:
|
|
@cmd="$(PERF)/tests/perf-targz-src-pkg $(PERF)"; \
|
|
echo "- $@: $$cmd" && echo $$cmd > $@ && \
|
|
( eval $$cmd ) >> $@ 2>&1 && \
|
|
rm -f $@
|
|
|
|
KERNEL_O := ../..
|
|
ifneq ($(O),)
|
|
KERNEL_O := $(O)
|
|
endif
|
|
|
|
make_kernelsrc:
|
|
@echo "- make -C <kernelsrc> $(PARALLEL_OPT) $(K_O_OPT) tools/perf"
|
|
$(call clean); \
|
|
($(MAKE) -C ../.. $(PARALLEL_OPT) $(K_O_OPT) tools/perf) > $@ 2>&1 && \
|
|
test -x $(KERNEL_O)/tools/perf/perf && rm -f $@ || (cat $@ ; false)
|
|
|
|
make_kernelsrc_tools:
|
|
@echo "- make -C <kernelsrc>/tools $(PARALLEL_OPT) $(K_O_OPT) perf"
|
|
$(call clean); \
|
|
($(MAKE) -C ../../tools $(PARALLEL_OPT) $(K_O_OPT) perf) > $@ 2>&1 && \
|
|
test -x $(KERNEL_O)/tools/perf/perf && rm -f $@ || (cat $@ ; false)
|
|
|
|
make_libperf:
|
|
@echo "- make -C lib";
|
|
$(MAKE) -C lib clean >$@ 2>&1; $(MAKE) -C lib >>$@ 2>&1 && rm $@
|
|
|
|
FEATURES_DUMP_FILE := $(FULL_O)/BUILD_TEST_FEATURE_DUMP
|
|
FEATURES_DUMP_FILE_STATIC := $(FULL_O)/BUILD_TEST_FEATURE_DUMP_STATIC
|
|
|
|
all: $(run) $(run_O) tarpkg make_kernelsrc make_kernelsrc_tools
|
|
@echo OK
|
|
@rm -f $(FEATURES_DUMP_FILE) $(FEATURES_DUMP_FILE_STATIC)
|
|
|
|
out:
|
|
$(call clean)
|
|
@$(MAKE) -f tests/make $(run_O) PARALLEL_OPT= O_CLEAN=0 $(if $(findstring jobserver,$(MAKEFLAGS))$(findstring -j,$(MAKEFLAGS)),,$(if $(cores),-j$(cores)))
|
|
@echo OK
|
|
@rm -f $(FEATURES_DUMP_FILE) $(FEATURES_DUMP_FILE_STATIC)
|
|
|
|
ifeq ($(REUSE_FEATURES_DUMP),1)
|
|
$(FEATURES_DUMP_FILE):
|
|
$(call clean)
|
|
@cmd="cd $(PERF) && $(MAKE) FEATURE_DUMP_COPY=$@ $(O_OPT) feature-dump"; \
|
|
echo "- $@: $$cmd" && echo $$cmd && \
|
|
( eval $$cmd ) > /dev/null 2>&1
|
|
|
|
$(FEATURES_DUMP_FILE_STATIC):
|
|
$(call clean)
|
|
@cmd="cd $(PERF) && $(MAKE) FEATURE_DUMP_COPY=$@ $(O_OPT) LDFLAGS='-static' feature-dump"; \
|
|
echo "- $@: $$cmd" && echo $$cmd && \
|
|
( eval $$cmd ) > /dev/null 2>&1
|
|
|
|
# The clang tests exist to run feature detection with a compiler other than
|
|
# the default one, so they have to do their own and are left out of both the
|
|
# dependency and the 'FEATURES_DUMP=' append below.
|
|
no_features_dump := make_clang make_clang_nondistro
|
|
no_features_dump += $(addsuffix _O,$(no_features_dump))
|
|
|
|
# Add feature dump dependency for run/run_O targets
|
|
$(foreach t,$(filter-out $(no_features_dump),$(run) $(run_O)),$(eval \
|
|
$(t): $(if $(findstring make_static,$(t)),\
|
|
$(FEATURES_DUMP_FILE_STATIC),\
|
|
$(FEATURES_DUMP_FILE))))
|
|
|
|
# Append 'FEATURES_DUMP=' option to all test cases. For example:
|
|
# make_no_libbpf: NO_LIBBPF=1 --> NO_LIBBPF=1 FEATURES_DUMP=/a/b/BUILD_TEST_FEATURE_DUMP
|
|
# make_static: LDFLAGS=-static --> LDFLAGS=-static FEATURES_DUMP=/a/b/BUILD_TEST_FEATURE_DUMP_STATIC
|
|
$(foreach t,$(filter-out $(no_features_dump),$(run)),$(if $(findstring make_static,$(t)),\
|
|
$(eval $(t) := $($(t)) FEATURES_DUMP=$(FEATURES_DUMP_FILE_STATIC)),\
|
|
$(eval $(t) := $($(t)) FEATURES_DUMP=$(FEATURES_DUMP_FILE))))
|
|
endif
|
|
|
|
.PHONY: all $(run) $(run_O) tarpkg clean make_kernelsrc make_kernelsrc_tools make_libperf
|
|
endif # ifndef MK
|
|
|
|
# Serialize execution of tasks writing to shared in-tree files
|
|
make_tags_O: | make_clean_all_O
|
|
make_cscope_O: | make_clean_all_O
|