mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
When building tools/perf the CFLAGS can contain a directory for the
installed headers.
As the headers may be being installed while building libperf.a this can
cause headers to be partially installed and found in the include path
while building an object file for libperf.a.
The installed header may reference other installed headers that are
missing given the partial nature of the install and then the build fails
with a missing header file.
Avoid this by ensuring the libperf source headers are always first in
the CFLAGS.
Fixes: 3143504918 ("libperf: Make libperf.a part of the perf build")
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
202 lines
5.4 KiB
Makefile
202 lines
5.4 KiB
Makefile
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
|
# Most of this file is copied from tools/lib/bpf/Makefile
|
|
|
|
LIBPERF_VERSION = 0
|
|
LIBPERF_PATCHLEVEL = 0
|
|
LIBPERF_EXTRAVERSION = 1
|
|
|
|
MAKEFLAGS += --no-print-directory
|
|
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
#$(info Determined 'srctree' to be $(srctree))
|
|
endif
|
|
|
|
INSTALL = install
|
|
|
|
# Use DESTDIR for installing into a different root directory.
|
|
# This is useful for building a package. The program will be
|
|
# installed in this directory as if it was the root directory.
|
|
# Then the build tool can move it later.
|
|
DESTDIR ?=
|
|
DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
|
|
|
|
include $(srctree)/tools/scripts/Makefile.include
|
|
include $(srctree)/tools/scripts/Makefile.arch
|
|
|
|
ifeq ($(LP64), 1)
|
|
libdir_relative = lib64
|
|
else
|
|
libdir_relative = lib
|
|
endif
|
|
|
|
prefix ?=
|
|
libdir = $(prefix)/$(libdir_relative)
|
|
|
|
# Shell quotes
|
|
libdir_SQ = $(subst ','\'',$(libdir))
|
|
libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
|
|
|
|
TEST_ARGS := $(if $(V),-v)
|
|
|
|
INCLUDES = \
|
|
-I$(srctree)/tools/lib/perf/include \
|
|
-I$(srctree)/tools/lib/ \
|
|
-I$(srctree)/tools/include \
|
|
-I$(srctree)/tools/arch/$(SRCARCH)/include/ \
|
|
-I$(srctree)/tools/arch/$(SRCARCH)/include/uapi \
|
|
-I$(srctree)/tools/include/uapi
|
|
|
|
# Append required CFLAGS
|
|
override CFLAGS := $(INCLUDES) $(CFLAGS)
|
|
override CFLAGS += -g -Werror -Wall
|
|
override CFLAGS += -fPIC
|
|
override CFLAGS += -fvisibility=hidden
|
|
override CFLAGS += $(EXTRA_WARNINGS)
|
|
override CFLAGS += $(EXTRA_CFLAGS)
|
|
|
|
all:
|
|
|
|
export srctree OUTPUT CC LD CFLAGS V
|
|
export DESTDIR DESTDIR_SQ
|
|
|
|
include $(srctree)/tools/build/Makefile.include
|
|
|
|
VERSION_SCRIPT := libperf.map
|
|
|
|
PATCHLEVEL = $(LIBPERF_PATCHLEVEL)
|
|
EXTRAVERSION = $(LIBPERF_EXTRAVERSION)
|
|
VERSION = $(LIBPERF_VERSION).$(LIBPERF_PATCHLEVEL).$(LIBPERF_EXTRAVERSION)
|
|
|
|
LIBPERF_SO := $(OUTPUT)libperf.so.$(VERSION)
|
|
LIBPERF_A := $(OUTPUT)libperf.a
|
|
LIBPERF_IN := $(OUTPUT)libperf-in.o
|
|
LIBPERF_PC := $(OUTPUT)libperf.pc
|
|
|
|
LIBPERF_ALL := $(LIBPERF_A) $(OUTPUT)libperf.so*
|
|
|
|
LIB_DIR := $(srctree)/tools/lib/api/
|
|
|
|
ifneq ($(OUTPUT),)
|
|
ifneq ($(subdir),)
|
|
API_PATH=$(OUTPUT)/../lib/api/
|
|
else
|
|
API_PATH=$(OUTPUT)
|
|
endif
|
|
else
|
|
API_PATH=$(LIB_DIR)
|
|
endif
|
|
|
|
LIBAPI = $(API_PATH)libapi.a
|
|
export LIBAPI
|
|
|
|
$(LIBAPI): FORCE
|
|
$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
|
|
|
|
$(LIBAPI)-clean:
|
|
$(call QUIET_CLEAN, libapi)
|
|
$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null
|
|
|
|
$(LIBPERF_IN): FORCE
|
|
$(Q)$(MAKE) $(build)=libperf
|
|
|
|
$(LIBPERF_A): $(LIBPERF_IN)
|
|
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN)
|
|
|
|
$(LIBPERF_SO): $(LIBPERF_IN) $(LIBAPI)
|
|
$(QUIET_LINK)$(CC) --shared -Wl,-soname,libperf.so \
|
|
-Wl,--version-script=$(VERSION_SCRIPT) $^ -o $@
|
|
@ln -sf $(@F) $(OUTPUT)libperf.so
|
|
@ln -sf $(@F) $(OUTPUT)libperf.so.$(LIBPERF_VERSION)
|
|
|
|
|
|
libs: $(LIBPERF_A) $(LIBPERF_SO) $(LIBPERF_PC)
|
|
|
|
all: fixdep
|
|
$(Q)$(MAKE) libs
|
|
|
|
clean: $(LIBAPI)-clean
|
|
$(call QUIET_CLEAN, libperf) $(RM) $(LIBPERF_A) \
|
|
*.o *~ *.a *.so *.so.$(VERSION) *.so.$(LIBPERF_VERSION) .*.d .*.cmd tests/*.o LIBPERF-CFLAGS $(LIBPERF_PC) \
|
|
$(TESTS_STATIC) $(TESTS_SHARED)
|
|
|
|
TESTS_IN = tests-in.o
|
|
|
|
TESTS_STATIC = $(OUTPUT)tests-static
|
|
TESTS_SHARED = $(OUTPUT)tests-shared
|
|
|
|
$(TESTS_IN): FORCE
|
|
$(Q)$(MAKE) $(build)=tests
|
|
|
|
$(TESTS_STATIC): $(TESTS_IN) $(LIBPERF_A) $(LIBAPI)
|
|
$(QUIET_LINK)$(CC) -o $@ $^
|
|
|
|
$(TESTS_SHARED): $(TESTS_IN) $(LIBAPI)
|
|
$(QUIET_LINK)$(CC) -o $@ -L$(or $(OUTPUT),.) $^ -lperf
|
|
|
|
make-tests: libs $(TESTS_SHARED) $(TESTS_STATIC)
|
|
|
|
tests: make-tests
|
|
@echo "running static:"
|
|
@./$(TESTS_STATIC) $(TEST_ARGS)
|
|
@echo "running dynamic:"
|
|
@LD_LIBRARY_PATH=. ./$(TESTS_SHARED) $(TEST_ARGS)
|
|
|
|
$(LIBPERF_PC):
|
|
$(QUIET_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
|
|
-e "s|@LIBDIR@|$(libdir_SQ)|" \
|
|
-e "s|@VERSION@|$(VERSION)|" \
|
|
< libperf.pc.template > $@
|
|
|
|
define do_install_mkdir
|
|
if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
|
|
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
|
|
fi
|
|
endef
|
|
|
|
define do_install
|
|
if [ ! -d '$2' ]; then \
|
|
$(INSTALL) -d -m 755 '$2'; \
|
|
fi; \
|
|
$(INSTALL) $1 $(if $3,-m $3,) '$2'
|
|
endef
|
|
|
|
install_lib: libs
|
|
$(call QUIET_INSTALL, $(LIBPERF_ALL)) \
|
|
$(call do_install_mkdir,$(libdir_SQ)); \
|
|
cp -fpR $(LIBPERF_ALL) $(DESTDIR)$(libdir_SQ)
|
|
|
|
HDRS := bpf_perf.h core.h cpumap.h threadmap.h evlist.h evsel.h event.h mmap.h
|
|
HDRS += schedstat-v15.h schedstat-v16.h schedstat-v17.h
|
|
INTERNAL_HDRS := cpumap.h evlist.h evsel.h lib.h mmap.h rc_check.h threadmap.h xyarray.h
|
|
|
|
INSTALL_HDRS_PFX := $(DESTDIR)$(prefix)/include/perf
|
|
INSTALL_HDRS := $(addprefix $(INSTALL_HDRS_PFX)/, $(HDRS))
|
|
INSTALL_INTERNAL_HDRS_PFX := $(DESTDIR)$(prefix)/include/internal
|
|
INSTALL_INTERNAL_HDRS := $(addprefix $(INSTALL_INTERNAL_HDRS_PFX)/, $(INTERNAL_HDRS))
|
|
|
|
$(INSTALL_HDRS): $(INSTALL_HDRS_PFX)/%.h: include/perf/%.h
|
|
$(call QUIET_INSTALL, $@) \
|
|
$(call do_install,$<,$(INSTALL_HDRS_PFX)/,644)
|
|
|
|
$(INSTALL_INTERNAL_HDRS): $(INSTALL_INTERNAL_HDRS_PFX)/%.h: include/internal/%.h
|
|
$(call QUIET_INSTALL, $@) \
|
|
$(call do_install,$<,$(INSTALL_INTERNAL_HDRS_PFX)/,644)
|
|
|
|
install_headers: $(INSTALL_HDRS) $(INSTALL_INTERNAL_HDRS)
|
|
$(call QUIET_INSTALL, libperf_headers)
|
|
|
|
install_pkgconfig: $(LIBPERF_PC)
|
|
$(call QUIET_INSTALL, $(LIBPERF_PC)) \
|
|
$(call do_install,$(LIBPERF_PC),$(DESTDIR_SQ)$(libdir_SQ)/pkgconfig,644)
|
|
|
|
install_doc:
|
|
$(Q)$(MAKE) -C Documentation install-man install-html install-examples
|
|
|
|
install: install_lib install_headers install_pkgconfig install_doc
|
|
|
|
FORCE:
|
|
|
|
.PHONY: all install clean tests FORCE
|