diff mbox series

[bpf-next,v4] tools/bpf: generate pkg-config file for libbpf

Message ID 20190321102531.31810-1-luca.boccassi@gmail.com
State Changes Requested
Delegated to: BPF Maintainers
Headers show
Series [bpf-next,v4] tools/bpf: generate pkg-config file for libbpf | expand

Commit Message

Luca Boccassi March 21, 2019, 10:25 a.m. UTC
From: Luca Boccassi <bluca@debian.org>

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>
---
v2: use QUIET_GEN instead of QUIET_LINK to generate pc file,
    save kernel version in its own variable instead of calling
    make inline
v3: use LIBBPF_VERSION instead of kernel_version
v4: use -I${prefix}/include rather than -I${prefix}/include/bpf
    in the Cflags field as requested, to keep consistency with
    how the headers are used now and to avoid a dependency from
    the pc file to the headers installation

 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

Comments

Andrey Ignatov March 21, 2019, 4 p.m. UTC | #1
luca.boccassi@gmail.com <luca.boccassi@gmail.com> [Thu, 2019-03-21 03:26 -0700]:
> From: Luca Boccassi <bluca@debian.org>
> 
> 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>
> ---
> v2: use QUIET_GEN instead of QUIET_LINK to generate pc file,
>     save kernel version in its own variable instead of calling
>     make inline
> v3: use LIBBPF_VERSION instead of kernel_version
> v4: use -I${prefix}/include rather than -I${prefix}/include/bpf
>     in the Cflags field as requested, to keep consistency with
>     how the headers are used now and to avoid a dependency from
>     the pc file to the headers installation

Thanks for the change Luca!
The other part about install target is nit, so no strong preference.

Acked-by: Andrey Ignatov <rdna@fb.com>


>  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 61aaacf0cfa1..891fe3da1410 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
>  
> @@ -180,6 +181,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_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
> +		-e "s|@LIBDIR@|$(libdir_SQ)|" \
> +		-e "s|@VERSION@|$(LIBBPF_VERSION)|" \
> +		< $@.template > $@
> +
>  check: check_abi
>  
>  check_abi: $(OUTPUT)libbpf.so
> @@ -209,7 +216,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
>  
> @@ -219,7 +231,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..0ecd334c109f
> --- /dev/null
> +++ b/tools/lib/bpf/libbpf.pc.template
> @@ -0,0 +1,11 @@
> +prefix=@PREFIX@
> +libdir=@LIBDIR@
> +includedir=${prefix}/include
> +
> +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
>
Alexei Starovoitov March 21, 2019, 10:01 p.m. UTC | #2
On Thu, Mar 21, 2019 at 04:00:46PM +0000, Andrey Ignatov wrote:
> luca.boccassi@gmail.com <luca.boccassi@gmail.com> [Thu, 2019-03-21 03:26 -0700]:
> > From: Luca Boccassi <bluca@debian.org>
> > 
> > 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>
...
> > diff --git a/tools/lib/bpf/libbpf.pc.template b/tools/lib/bpf/libbpf.pc.template
> > new file mode 100644
> > index 000000000000..0ecd334c109f
> > --- /dev/null
> > +++ b/tools/lib/bpf/libbpf.pc.template
> > @@ -0,0 +1,11 @@
> > +prefix=@PREFIX@
> > +libdir=@LIBDIR@
> > +includedir=${prefix}/include
> > +
> > +Name: libbpf
> > +URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> > +Description: Linux kernel BPF library

github/libbpf/libbpf is a true mirror of kernel's libbpf.
I think if we start shipping libbpf.so from kernel and from github
it will be very confusing to the users...
Which one is the true libbpf?
Also the package should mention the license.
And the license for libbpf is dual lgpl/bsd.
But if we point to the url above it will not make much sense.
I think the packages URL should point to github/libbpf/libbpf
and packaging scripts should be in github only.

Daniel,
what do you think?
Daniel Borkmann March 21, 2019, 10:19 p.m. UTC | #3
On 03/21/2019 11:01 PM, Alexei Starovoitov wrote:
> On Thu, Mar 21, 2019 at 04:00:46PM +0000, Andrey Ignatov wrote:
>> luca.boccassi@gmail.com <luca.boccassi@gmail.com> [Thu, 2019-03-21 03:26 -0700]:
>>> From: Luca Boccassi <bluca@debian.org>
>>>
>>> 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>
> ...
>>> diff --git a/tools/lib/bpf/libbpf.pc.template b/tools/lib/bpf/libbpf.pc.template
>>> new file mode 100644
>>> index 000000000000..0ecd334c109f
>>> --- /dev/null
>>> +++ b/tools/lib/bpf/libbpf.pc.template
>>> @@ -0,0 +1,11 @@
>>> +prefix=@PREFIX@
>>> +libdir=@LIBDIR@
>>> +includedir=${prefix}/include
>>> +
>>> +Name: libbpf
>>> +URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
>>> +Description: Linux kernel BPF library
> 
> github/libbpf/libbpf is a true mirror of kernel's libbpf.
> I think if we start shipping libbpf.so from kernel and from github
> it will be very confusing to the users...
> Which one is the true libbpf?
> Also the package should mention the license.
> And the license for libbpf is dual lgpl/bsd.
> But if we point to the url above it will not make much sense.
> I think the packages URL should point to github/libbpf/libbpf
> and packaging scripts should be in github only.
> 
> Daniel,
> what do you think?

Looking at [0], I don't see where license would be part of the keyword. Given
this is just a pkg-config file where folks using it care mainly about the
needed cflags/libs, it would make sense to me to ship it and have it under
tools/lib/bpf/ in kernel tree (since this is distro independent). If the URL
and Description causes confusion, I would probably just remove the URL field
since it's not mandatory either. And description, I'd put something like
'official BPF library' or such, so it's generic enough.

  [0] https://autotools.io/pkgconfig/file-format.html
      https://dev.gentoo.org/~mgorny/pkg-config-spec.html#keywords
Luca Boccassi March 21, 2019, 10:23 p.m. UTC | #4
On Thu, 2019-03-21 at 15:01 -0700, Alexei Starovoitov wrote:
> On Thu, Mar 21, 2019 at 04:00:46PM +0000, Andrey Ignatov wrote:
> > luca.boccassi@gmail.com <luca.boccassi@gmail.com> [Thu, 2019-03-21
> > 03:26 -0700]:
> > > From: Luca Boccassi <bluca@debian.org>
> > > 
> > > 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>
> ...
> > > diff --git a/tools/lib/bpf/libbpf.pc.template
> > > b/tools/lib/bpf/libbpf.pc.template
> > > new file mode 100644
> > > index 000000000000..0ecd334c109f
> > > --- /dev/null
> > > +++ b/tools/lib/bpf/libbpf.pc.template
> > > @@ -0,0 +1,11 @@
> > > +prefix=@PREFIX@
> > > +libdir=@LIBDIR@
> > > +includedir=${prefix}/include
> > > +
> > > +Name: libbpf
> > > +URL: 
> > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> > > +Description: Linux kernel BPF library
> 
> github/libbpf/libbpf is a true mirror of kernel's libbpf.
> I think if we start shipping libbpf.so from kernel and from github
> it will be very confusing to the users...
> Which one is the true libbpf?

I'm afraid that ship already sailed :-) Users and distributions are
already consuming libbpf from the kernel tree.

> Also the package should mention the license.
> And the license for libbpf is dual lgpl/bsd.

I followed the template from the other pkgconfig file (in traceevent)
which does not have it, but I can add it in v5.

> But if we point to the url above it will not make much sense.
> I think the packages URL should point to github/libbpf/libbpf
> and packaging scripts should be in github only.

If only one side ships the pc file, then you'll have half the users
installing libbpf without a pc file, and the other half with it, so it
would defeat the point of having one in the first place.

> Daniel,
> what do you think?
>
Luca Boccassi March 21, 2019, 10:34 p.m. UTC | #5
On Thu, 2019-03-21 at 23:19 +0100, Daniel Borkmann wrote:
> On 03/21/2019 11:01 PM, Alexei Starovoitov wrote:
> > On Thu, Mar 21, 2019 at 04:00:46PM +0000, Andrey Ignatov wrote:
> > > luca.boccassi@gmail.com <luca.boccassi@gmail.com> [Thu, 2019-03-
> > > 21 03:26 -0700]:
> > > > From: Luca Boccassi <bluca@debian.org>
> > > > 
> > > > 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>
> > ...
> > > > diff --git a/tools/lib/bpf/libbpf.pc.template
> > > > b/tools/lib/bpf/libbpf.pc.template
> > > > new file mode 100644
> > > > index 000000000000..0ecd334c109f
> > > > --- /dev/null
> > > > +++ b/tools/lib/bpf/libbpf.pc.template
> > > > @@ -0,0 +1,11 @@
> > > > +prefix=@PREFIX@
> > > > +libdir=@LIBDIR@
> > > > +includedir=${prefix}/include
> > > > +
> > > > +Name: libbpf
> > > > +URL: 
> > > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> > > > +Description: Linux kernel BPF library
> > 
> > github/libbpf/libbpf is a true mirror of kernel's libbpf.
> > I think if we start shipping libbpf.so from kernel and from github
> > it will be very confusing to the users...
> > Which one is the true libbpf?
> > Also the package should mention the license.
> > And the license for libbpf is dual lgpl/bsd.
> > But if we point to the url above it will not make much sense.
> > I think the packages URL should point to github/libbpf/libbpf
> > and packaging scripts should be in github only.
> > 
> > Daniel,
> > what do you think?
> 
> Looking at [0], I don't see where license would be part of the
> keyword. Given
> this is just a pkg-config file where folks using it care mainly about
> the
> needed cflags/libs, it would make sense to me to ship it and have it
> under
> tools/lib/bpf/ in kernel tree (since this is distro independent). If
> the URL
> and Description causes confusion, I would probably just remove the
> URL field
> since it's not mandatory either. And description, I'd put something
> like
> 'official BPF library' or such, so it's generic enough.
> 
>   [0] https://autotools.io/pkgconfig/file-format.html
>       https://dev.gentoo.org/~mgorny/pkg-config-spec.html#keywords

I assumed the license referred to the file itself, so I added the SDPX
comment. It's not too uncommon for pc files to have the license comment
at the top.

Removed URL and changed Descriptin in v6, thanks for reviewing!
diff mbox series

Patch

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 61aaacf0cfa1..891fe3da1410 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
 
@@ -180,6 +181,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_GEN)sed -e "s|@PREFIX@|$(prefix)|" \
+		-e "s|@LIBDIR@|$(libdir_SQ)|" \
+		-e "s|@VERSION@|$(LIBBPF_VERSION)|" \
+		< $@.template > $@
+
 check: check_abi
 
 check_abi: $(OUTPUT)libbpf.so
@@ -209,7 +216,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
 
@@ -219,7 +231,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..0ecd334c109f
--- /dev/null
+++ b/tools/lib/bpf/libbpf.pc.template
@@ -0,0 +1,11 @@ 
+prefix=@PREFIX@
+libdir=@LIBDIR@
+includedir=${prefix}/include
+
+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}