mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-17 12:00:35 +00:00
When libperf is built alone in-source, $(OUTPUT) isn't set. This causes the generated uapi path to resolve to '/../arch' which results in a permissions error: mkdir: cannot create directory '/../arch': Permission denied Fix it by removing the preceding '/..' which means that it gets generated either in the tools/lib/perf part of the tree or the OUTPUT folder. Some other rules that rely on OUTPUT further refine this conditionally depending on whether it's an in-source or out-of-source build, but I don't think we need the extra complexity here. And this rule is slightly different to others because the header is needed by both libperf and Perf. This is further complicated by the fact that Perf always passes O=... to libperf even for in source builds, meaning that OUTPUT isn't set consistently between projects. Because we're no longer going one level up to try to generate the file in the tools/ folder, Perf's include rule needs to descend into libperf. Also fix the clean rule while we're here. Reported-by: Thorsten Leemhuis <linux@leemhuis.info> Closes: https://lore.kernel.org/linux-perf-users/7703f88e-ccb7-4c98-9da4-8aad224e780f@leemhuis.info/ Fixes: bfb713ea53c7 ("perf tools: Fix arm64 build by generating unistd_64.h") Signed-off-by: James Clark <james.clark@linaro.org> Tested-by: Thorsten Leemhuis <linux@leemhuis.info> Link: https://lore.kernel.org/r/20250429-james-perf-fix-libperf-in-source-build-v1-1-a1a827ac15e5@linaro.org Signed-off-by: Namhyung Kim <namhyung@kernel.org>
212 lines
5.8 KiB
Makefile
212 lines
5.8 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$(OUTPUT)arch/$(SRCARCH)/include/generated/uapi \
|
|
-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 += -g -Werror -Wall
|
|
override CFLAGS += -fPIC
|
|
override CFLAGS += $(INCLUDES)
|
|
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
|
|
|
|
uapi-asm := $(OUTPUT)arch/$(SRCARCH)/include/generated/uapi/asm
|
|
ifeq ($(SRCARCH),arm64)
|
|
syscall-y := $(uapi-asm)/unistd_64.h
|
|
endif
|
|
uapi-asm-generic:
|
|
$(if $(syscall-y),\
|
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-headers obj=$(uapi-asm) \
|
|
generic=include/uapi/asm-generic $(syscall-y),)
|
|
|
|
$(LIBPERF_IN): uapi-asm-generic 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) $(syscall-y)
|
|
|
|
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
|
|
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
|