Message ID | 20190319210639.6282-1-bluca@debian.org |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | [bpf-next] tools/bpf: generate pkg-config file for libbpf | expand |
On 03/19, Luca Boccassi wrote: > Generate a libbpf.pc file at build time so that users can rely > on pkg-config to find the library, its CFLAGS and LDFLAGS. > > Signed-off-by: Luca Boccassi <bluca@debian.org> > --- > tools/lib/bpf/.gitignore | 1 + > tools/lib/bpf/Makefile | 18 +++++++++++++++--- > tools/lib/bpf/libbpf.pc.template | 11 +++++++++++ > 3 files changed, 27 insertions(+), 3 deletions(-) > create mode 100644 tools/lib/bpf/libbpf.pc.template > > diff --git a/tools/lib/bpf/.gitignore b/tools/lib/bpf/.gitignore > index 4db74758c674..7d9e182a1f51 100644 > --- a/tools/lib/bpf/.gitignore > +++ b/tools/lib/bpf/.gitignore > @@ -1,3 +1,4 @@ > libbpf_version.h > +libbpf.pc > FEATURE-DUMP.libbpf > test_libbpf > diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile > index a05c43468bd0..542c64e2a6d9 100644 > --- a/tools/lib/bpf/Makefile > +++ b/tools/lib/bpf/Makefile > @@ -80,6 +80,7 @@ libdir_SQ = $(subst ','\'',$(libdir)) > libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) > > LIB_FILE = libbpf.a libbpf.so > +PC_FILE = libbpf.pc > > VERSION = $(BPF_VERSION) > PATCHLEVEL = $(BPF_PATCHLEVEL) > @@ -137,7 +138,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN) | \ > VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \ > grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l) > > -CMD_TARGETS = $(LIB_FILE) > +CMD_TARGETS = $(LIB_FILE) $(PC_FILE) > > CXX_TEST_TARGET = $(OUTPUT)test_libbpf > > @@ -179,6 +180,12 @@ $(OUTPUT)libbpf.a: $(BPF_IN) > $(OUTPUT)test_libbpf: test_libbpf.cpp $(OUTPUT)libbpf.a > $(QUIET_LINK)$(CXX) $(INCLUDES) $^ -lelf -o $@ > > +$(OUTPUT)libbpf.pc: > + $(QUIET_LINK)sed -e "s|@PREFIX@|$(prefix)|" \ Maybe QUIET_GEN instead? Or QUIET_INSTALL (tools/lib/traceevent/Makefile)? > + -e "s|@LIBDIR@|$(libdir_SQ)|" \ > + -e "s|@VERSION@|$(shell make --no-print-directory -sC ../../.. kernelversion)|" \ Make it its own variable, like we do in bpftool? https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/bpf/bpftool/Makefile#n26 Also, I wonder what would happen in the case of out-of-tree libbpf: https://github.com/libbpf/libbpf Should there be some fallback? > + < $@.template > $@ > + > check: check_abi > > check_abi: $(OUTPUT)libbpf.so > @@ -208,7 +215,12 @@ install_headers: > $(call do_install,libbpf.h,$(prefix)/include/bpf,644); > $(call do_install,btf.h,$(prefix)/include/bpf,644); > > -install: install_lib > +install_pkgconfig: $(PC_FILE) > + $(call QUIET_INSTALL, $(PC_FILE)) \ > + $(call do_install,$(PC_FILE),$(libdir_SQ)/pkgconfig,644) > + > + > +install: install_lib install_pkgconfig > > ### Cleaning rules > > @@ -218,7 +230,7 @@ config-clean: > > clean: > $(call QUIET_CLEAN, libbpf) $(RM) $(TARGETS) $(CXX_TEST_TARGET) \ > - *.o *~ *.a *.so .*.d .*.cmd LIBBPF-CFLAGS > + *.o *~ *.a *.so .*.d .*.cmd *.pc LIBBPF-CFLAGS > $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf > > > diff --git a/tools/lib/bpf/libbpf.pc.template b/tools/lib/bpf/libbpf.pc.template > new file mode 100644 > index 000000000000..0cac2f5f54a6 > --- /dev/null > +++ b/tools/lib/bpf/libbpf.pc.template > @@ -0,0 +1,11 @@ > +prefix=@PREFIX@ > +libdir=@LIBDIR@ > +includedir=${prefix}/include/bpf > + > +Name: libbpf > +URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git > +Description: Linux kernel BPF library > +Version: @VERSION@ > +Libs: -L${libdir} -lbpf > +Requires.private: libelf > +Cflags: -I${includedir} > -- > 2.20.1 >
On Tue, 2019-03-19 at 14:23 -0700, Stanislav Fomichev wrote: > On 03/19, Luca Boccassi wrote: > > Generate a libbpf.pc file at build time so that users can rely > > on pkg-config to find the library, its CFLAGS and LDFLAGS. > > > > Signed-off-by: Luca Boccassi <bluca@debian.org> > > --- > > tools/lib/bpf/.gitignore | 1 + > > tools/lib/bpf/Makefile | 18 +++++++++++++++--- > > tools/lib/bpf/libbpf.pc.template | 11 +++++++++++ > > 3 files changed, 27 insertions(+), 3 deletions(-) > > create mode 100644 tools/lib/bpf/libbpf.pc.template > > > > diff --git a/tools/lib/bpf/.gitignore b/tools/lib/bpf/.gitignore > > index 4db74758c674..7d9e182a1f51 100644 > > --- a/tools/lib/bpf/.gitignore > > +++ b/tools/lib/bpf/.gitignore > > @@ -1,3 +1,4 @@ > > libbpf_version.h > > +libbpf.pc > > FEATURE-DUMP.libbpf > > test_libbpf > > diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile > > index a05c43468bd0..542c64e2a6d9 100644 > > --- a/tools/lib/bpf/Makefile > > +++ b/tools/lib/bpf/Makefile > > @@ -80,6 +80,7 @@ libdir_SQ = $(subst ','\'',$(libdir)) > > libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) > > > > LIB_FILE = libbpf.a libbpf.so > > +PC_FILE = libbpf.pc > > > > VERSION = $(BPF_VERSION) > > PATCHLEVEL = $(BPF_PATCHLEVEL) > > @@ -137,7 +138,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s --wide > > $(BPF_IN) | \ > > VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so > > | \ > > grep -Eo '[^ ]+@LIBBPF_' | cut -d@ > > -f1 | sort -u | wc -l) > > > > -CMD_TARGETS = $(LIB_FILE) > > +CMD_TARGETS = $(LIB_FILE) $(PC_FILE) > > > > CXX_TEST_TARGET = $(OUTPUT)test_libbpf > > > > @@ -179,6 +180,12 @@ $(OUTPUT)libbpf.a: $(BPF_IN) > > $(OUTPUT)test_libbpf: test_libbpf.cpp $(OUTPUT)libbpf.a > > $(QUIET_LINK)$(CXX) $(INCLUDES) $^ -lelf -o $@ > > > > +$(OUTPUT)libbpf.pc: > > + $(QUIET_LINK)sed -e "s|@PREFIX@|$(prefix)|" \ > > Maybe QUIET_GEN instead? Or QUIET_INSTALL > (tools/lib/traceevent/Makefile)? Changed to QUIET_GEN in v2. > > + -e "s|@LIBDIR@|$(libdir_SQ)|" \ > > + -e "s|@VERSION@|$(shell make --no-print-directory > > -sC ../../.. kernelversion)|" \ > > Make it its own variable, like we do in bpftool? > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tr > ee/tools/bpf/bpftool/Makefile#n26 Done in v2. > Also, I wonder what would happen in the case of out-of-tree libbpf: > https://github.com/libbpf/libbpf > > Should there be some fallback? That tree looks like it's autosynced from the kernel tree, isn't it? Then it will just pick up the change and start generating the pc file as well, won't it?
On 03/19, Luca Boccassi wrote: > On Tue, 2019-03-19 at 14:23 -0700, Stanislav Fomichev wrote: > > On 03/19, Luca Boccassi wrote: > > > Generate a libbpf.pc file at build time so that users can rely > > > on pkg-config to find the library, its CFLAGS and LDFLAGS. > > > > > > Signed-off-by: Luca Boccassi <bluca@debian.org> > > > --- > > > tools/lib/bpf/.gitignore | 1 + > > > tools/lib/bpf/Makefile | 18 +++++++++++++++--- > > > tools/lib/bpf/libbpf.pc.template | 11 +++++++++++ > > > 3 files changed, 27 insertions(+), 3 deletions(-) > > > create mode 100644 tools/lib/bpf/libbpf.pc.template > > > > > > diff --git a/tools/lib/bpf/.gitignore b/tools/lib/bpf/.gitignore > > > index 4db74758c674..7d9e182a1f51 100644 > > > --- a/tools/lib/bpf/.gitignore > > > +++ b/tools/lib/bpf/.gitignore > > > @@ -1,3 +1,4 @@ > > > libbpf_version.h > > > +libbpf.pc > > > FEATURE-DUMP.libbpf > > > test_libbpf > > > diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile > > > index a05c43468bd0..542c64e2a6d9 100644 > > > --- a/tools/lib/bpf/Makefile > > > +++ b/tools/lib/bpf/Makefile > > > @@ -80,6 +80,7 @@ libdir_SQ = $(subst ','\'',$(libdir)) > > > libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) > > > > > > LIB_FILE = libbpf.a libbpf.so > > > +PC_FILE = libbpf.pc > > > > > > VERSION = $(BPF_VERSION) > > > PATCHLEVEL = $(BPF_PATCHLEVEL) > > > @@ -137,7 +138,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s --wide > > > $(BPF_IN) | \ > > > VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so > > > | \ > > > grep -Eo '[^ ]+@LIBBPF_' | cut -d@ > > > -f1 | sort -u | wc -l) > > > > > > -CMD_TARGETS = $(LIB_FILE) > > > +CMD_TARGETS = $(LIB_FILE) $(PC_FILE) > > > > > > CXX_TEST_TARGET = $(OUTPUT)test_libbpf > > > > > > @@ -179,6 +180,12 @@ $(OUTPUT)libbpf.a: $(BPF_IN) > > > $(OUTPUT)test_libbpf: test_libbpf.cpp $(OUTPUT)libbpf.a > > > $(QUIET_LINK)$(CXX) $(INCLUDES) $^ -lelf -o $@ > > > > > > +$(OUTPUT)libbpf.pc: > > > + $(QUIET_LINK)sed -e "s|@PREFIX@|$(prefix)|" \ > > > > Maybe QUIET_GEN instead? Or QUIET_INSTALL > > (tools/lib/traceevent/Makefile)? > > Changed to QUIET_GEN in v2. > > > > + -e "s|@LIBDIR@|$(libdir_SQ)|" \ > > > + -e "s|@VERSION@|$(shell make --no-print-directory > > > -sC ../../.. kernelversion)|" \ > > > > Make it its own variable, like we do in bpftool? > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tr > > ee/tools/bpf/bpftool/Makefile#n26 > > Done in v2. > > > Also, I wonder what would happen in the case of out-of-tree libbpf: > > https://github.com/libbpf/libbpf > > > > Should there be some fallback? > > That tree looks like it's autosynced from the kernel tree, isn't it? > Then it will just pick up the change and start generating the pc file > as well, won't it? Yes, it's autosynched, but it autosyncs only tools/lib/bpf directory and it lacks top-level makefile with kernelversion target. I guess in this case make will spill out an error to stderr and version will be empty. > > -- > Kind regards, > Luca Boccassi
diff --git a/tools/lib/bpf/.gitignore b/tools/lib/bpf/.gitignore index 4db74758c674..7d9e182a1f51 100644 --- a/tools/lib/bpf/.gitignore +++ b/tools/lib/bpf/.gitignore @@ -1,3 +1,4 @@ libbpf_version.h +libbpf.pc FEATURE-DUMP.libbpf test_libbpf diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile index a05c43468bd0..542c64e2a6d9 100644 --- a/tools/lib/bpf/Makefile +++ b/tools/lib/bpf/Makefile @@ -80,6 +80,7 @@ libdir_SQ = $(subst ','\'',$(libdir)) libdir_relative_SQ = $(subst ','\'',$(libdir_relative)) LIB_FILE = libbpf.a libbpf.so +PC_FILE = libbpf.pc VERSION = $(BPF_VERSION) PATCHLEVEL = $(BPF_PATCHLEVEL) @@ -137,7 +138,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN) | \ VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \ grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l) -CMD_TARGETS = $(LIB_FILE) +CMD_TARGETS = $(LIB_FILE) $(PC_FILE) CXX_TEST_TARGET = $(OUTPUT)test_libbpf @@ -179,6 +180,12 @@ $(OUTPUT)libbpf.a: $(BPF_IN) $(OUTPUT)test_libbpf: test_libbpf.cpp $(OUTPUT)libbpf.a $(QUIET_LINK)$(CXX) $(INCLUDES) $^ -lelf -o $@ +$(OUTPUT)libbpf.pc: + $(QUIET_LINK)sed -e "s|@PREFIX@|$(prefix)|" \ + -e "s|@LIBDIR@|$(libdir_SQ)|" \ + -e "s|@VERSION@|$(shell make --no-print-directory -sC ../../.. kernelversion)|" \ + < $@.template > $@ + check: check_abi check_abi: $(OUTPUT)libbpf.so @@ -208,7 +215,12 @@ install_headers: $(call do_install,libbpf.h,$(prefix)/include/bpf,644); $(call do_install,btf.h,$(prefix)/include/bpf,644); -install: install_lib +install_pkgconfig: $(PC_FILE) + $(call QUIET_INSTALL, $(PC_FILE)) \ + $(call do_install,$(PC_FILE),$(libdir_SQ)/pkgconfig,644) + + +install: install_lib install_pkgconfig ### Cleaning rules @@ -218,7 +230,7 @@ config-clean: clean: $(call QUIET_CLEAN, libbpf) $(RM) $(TARGETS) $(CXX_TEST_TARGET) \ - *.o *~ *.a *.so .*.d .*.cmd LIBBPF-CFLAGS + *.o *~ *.a *.so .*.d .*.cmd *.pc LIBBPF-CFLAGS $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP.libbpf diff --git a/tools/lib/bpf/libbpf.pc.template b/tools/lib/bpf/libbpf.pc.template new file mode 100644 index 000000000000..0cac2f5f54a6 --- /dev/null +++ b/tools/lib/bpf/libbpf.pc.template @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +libdir=@LIBDIR@ +includedir=${prefix}/include/bpf + +Name: libbpf +URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git +Description: Linux kernel BPF library +Version: @VERSION@ +Libs: -L${libdir} -lbpf +Requires.private: libelf +Cflags: -I${includedir}
Generate a libbpf.pc file at build time so that users can rely on pkg-config to find the library, its CFLAGS and LDFLAGS. Signed-off-by: Luca Boccassi <bluca@debian.org> --- tools/lib/bpf/.gitignore | 1 + tools/lib/bpf/Makefile | 18 +++++++++++++++--- tools/lib/bpf/libbpf.pc.template | 11 +++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 tools/lib/bpf/libbpf.pc.template