diff mbox series

[1/4] package/libbpf: fix cross compilation for 32-bit targets

Message ID 20221020141412.346992-2-tobias@waldekranz.com
State Accepted
Headers show
Series package/kmemd: new package | expand

Commit Message

Tobias Waldekranz Oct. 20, 2022, 2:14 p.m. UTC
Add upstream patch that sources the library path (lib vs. lib64) from
the compiler rather than from uname(1).

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
---
 ...cross-compilation-for-32-bit-targets.patch | 37 +++++++++++++++++++
 1 file changed, 37 insertions(+)
 create mode 100644 package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch

Comments

Thomas Petazzoni Oct. 26, 2022, 8 p.m. UTC | #1
Hello Tobias,

Thanks for this patch!

On Thu, 20 Oct 2022 16:14:09 +0200
Tobias Waldekranz <tobias@waldekranz.com> wrote:

> Add upstream patch that sources the library path (lib vs. lib64) from
> the compiler rather than from uname(1).

Could you copy/paste the details of the build failure that was
occurring, and provide details on the context it was occurring?

Indeed, when looking at the results of our autobuilders in terms of
failures when building libbpf, I don't see anything relevant:

  http://autobuild.buildroot.net/?reason=libbpf%

In recent months, we only had build failures on the S390x architecture,
that don't seem related to this.

>  ...cross-compilation-for-32-bit-targets.patch | 37 +++++++++++++++++++
>  1 file changed, 37 insertions(+)
>  create mode 100644 package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
> 
> diff --git a/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
> new file mode 100644
> index 0000000000..3730b2fa41

Please put the patch directly in package/libbpf/. Putting it in a
1.0.1/ sub-directory is not needed. We only do that for packages where
multiple versions are used (like package/gcc, package/binutils for
example).

> --- /dev/null
> +++ b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
> @@ -0,0 +1,37 @@
> +From 68e6f83f223ebf3fbf0d94c0f4592e5e6773f0c1 Mon Sep 17 00:00:00 2001
> +From: Tobias Waldekranz <tobias@waldekranz.com>
> +Date: Fri, 14 Oct 2022 21:14:14 +0200
> +Subject: [PATCH] Makefile: Fix cross-compilation for 32-bit targets
> +
> +Determining the correct library installation path (lib vs. lib64)
> +using uname(1) breaks in cross compilation scenarios where word widths
> +differ between the host and target system.
> +
> +Instead, source the information from the compilers '-dumpmachine'
> +option (supported by both GCC and Clang).
> +
> +We call this the "host" architecture, using the same nomenclature as
> +Autotools (--host configure option).
> +

Please add:

Upstream: https://github.com/libbpf/libbpf/commit/68e6f83f223ebf3fbf0d94c0f4592e5e6773f0c1

> +Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>

Could you send a v2 with those changes? I was about to do the changes
myself, but I really don't know which build failure this patch is
fixing so I couldn't fix that up myself in the commit log.

Thanks a lot!

Thomas
Tobias Waldekranz Oct. 26, 2022, 8:59 p.m. UTC | #2
On ons, okt 26, 2022 at 22:00, Thomas Petazzoni via buildroot <buildroot@buildroot.org> wrote:
> Hello Tobias,
>
> Thanks for this patch!

Thank you for reviewing!

> On Thu, 20 Oct 2022 16:14:09 +0200
> Tobias Waldekranz <tobias@waldekranz.com> wrote:
>
>> Add upstream patch that sources the library path (lib vs. lib64) from
>> the compiler rather than from uname(1).
>
> Could you copy/paste the details of the build failure that was
> occurring, and provide details on the context it was occurring?
>
> Indeed, when looking at the results of our autobuilders in terms of
> failures when building libbpf, I don't see anything relevant:
>
>   http://autobuild.buildroot.net/?reason=libbpf%
>
> In recent months, we only had build failures on the S390x architecture,
> that don't seem related to this.

Sorry, I should have explained the issue better:

Building libbpf "works" without this patch, so I'm not surprised that
there are no autobuild errors. It is just that shared objects and
pkg-config files are always (assuming a 64-bit build system) installed
to /lib64 in target & staging.

If you then try to build something that _depends_ on libbpf, pkg-config
won't be able to find it since /lib64 is not in its path. Hence why I
stumbled upon this - kmemd was the first package to depend on libbpf.

Here's a log when building kmemd for 32-bit PowerPC without this patch:

~/src/buildroot/x-ppc$ make kmemd
>>> kmemd 1.0.0 Configuring
(cd /home/wkz/src/buildroot/x-ppc/build/kmemd-1.0.0/ && rm -rf config.cache && PATH="/home/wkz/src/buildroot/x-ppc/host/bin:/home/wkz/src/buildroot/x-ppc/host/sbin:/home/wkz/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" AR="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc-ar" AS="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-as" LD="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-ld" NM="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc-nm" CC="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc" GCC="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc" CPP="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-cpp" CXX="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-g++" FC="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gfortran" F77="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gfortran" RANLIB="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc-ranlib" READELF="
 /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-readelf" STRIP="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-strip" OBJCOPY="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-objcopy" OBJDUMP="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-objdump" AR_FOR_BUILD="/usr/bin/ar" AS_FOR_BUILD="/usr/bin/as" CC_FOR_BUILD="/usr/bin/gcc" GCC_FOR_BUILD="/usr/bin/gcc" CXX_FOR_BUILD="/usr/bin/g++" LD_FOR_BUILD="/usr/bin/ld" CPPFLAGS_FOR_BUILD="-I/home/wkz/src/buildroot/x-ppc/host/include" CFLAGS_FOR_BUILD="-O2 -I/home/wkz/src/buildroot/x-ppc/host/include" CXXFLAGS_FOR_BUILD="-O2 -I/home/wkz/src/buildroot/x-ppc/host/include" LDFLAGS_FOR_BUILD="-L/home/wkz/src/buildroot/x-ppc/host/lib -Wl,-rpath,/home/wkz/src/buildroot/x-ppc/host/lib" FCFLAGS_FOR_BUILD="" DEFAULT_ASSEMBLER="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-as" DEFAULT_LINKER="/home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-ld" CPPFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 " CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os -g0 -D_FORTIFY_SOURCE=1" CXXFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os -g0 -D_FORTIFY_SOURCE=1" LDFLAGS="" FCFLAGS=" -Os -g0" FFLAGS=" -Os -g0" PKG_CONFIG="/home/wkz/src/buildroot/x-ppc/host/bin/pkg-config" STAGING_DIR="/home/wkz/src/buildroot/x-ppc/host/powerpc-buildroot-linux-gnu/sysroot" INTLTOOL_PERL=/usr/bin/perl ac_cv_lbl_unaligned_fail=no ac_cv_func_mmap_fixed_mapped=yes ac_cv_func_memcmp_working=yes ac_cv_have_decl_malloc=yes gl_cv_func_malloc_0_nonnull=yes ac_cv_func_malloc_0_nonnull=yes ac_cv_func_calloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes lt_cv_sys_lib_search_path_spec="" ac_cv_c_bigendian=yes   CONFIG_SITE=/dev/null ./configure --target=powerpc-buildroot-linux-gnu --host=powerpc-buildroot-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var --program-prefix="" --disable-gtk-doc --disable-gtk-
 doc-html --disable-doc --disable-docs --disable-documentation --with-xmlto=no --with-fop=no --disable-dependency-tracking --enable-ipv6 --disable-nls --disable-static --enable-shared   )
configure: WARNING: unrecognized options: --disable-gtk-doc, --disable-gtk-doc-html, --disable-doc, --disable-docs, --disable-documentation, --with-xmlto, --with-fop, --enable-ipv6, --disable-nls, --disable-static, --enable-shared
checking for powerpc-buildroot-linux-gnu-gcc... /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc accepts -g... yes
checking for /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc option to enable C11 features... none needed
checking whether /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc understands -c and -o together... yes
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for wchar.h... yes
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking whether _XOPEN_SOURCE should be defined... no
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for powerpc-buildroot-linux-gnu-strip... /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-strip
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports the include directive... yes (GNU style)
checking whether make supports nested variables... yes
checking dependency style of /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc... none
checking whether make supports nested variables... (cached) yes
checking for powerpc-buildroot-linux-gnu-gcc... (cached) /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc
checking whether the compiler supports GNU C... (cached) yes
checking whether /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc accepts -g... (cached) yes
checking for /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc option to enable C11 features... (cached) none needed
checking whether /home/wkz/src/buildroot/x-ppc/host/bin/powerpc-linux-gcc understands -c and -o together... (cached) yes
checking pkg-config is at least version 0.9.0... yes
checking for libbpf >= 1.0.0... no
configure: error: Package requirements (libbpf >= 1.0.0) were not met:

Package 'libbpf', required by 'virtual:world', not found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables libbpf_CFLAGS
and libbpf_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
make[1]: *** [package/pkg-generic.mk:283: /home/wkz/src/buildroot/x-ppc/build/kmemd-1.0.0/.stamp_configured] Error 1
make: *** [Makefile:23: _all] Error 2

And this is the source of the problem:

~/src/buildroot/x-ppc$ find host/powerpc-buildroot-linux-gnu/sysroot/ -name libbpf.pc
host/powerpc-buildroot-linux-gnu/sysroot/usr/lib64/pkgconfig/libbpf.pc

>>  ...cross-compilation-for-32-bit-targets.patch | 37 +++++++++++++++++++
>>  1 file changed, 37 insertions(+)
>>  create mode 100644 package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
>> 
>> diff --git a/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
>> new file mode 100644
>> index 0000000000..3730b2fa41
>
> Please put the patch directly in package/libbpf/. Putting it in a
> 1.0.1/ sub-directory is not needed. We only do that for packages where
> multiple versions are used (like package/gcc, package/binutils for
> example).

Will fix in v2.

>> --- /dev/null
>> +++ b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
>> @@ -0,0 +1,37 @@
>> +From 68e6f83f223ebf3fbf0d94c0f4592e5e6773f0c1 Mon Sep 17 00:00:00 2001
>> +From: Tobias Waldekranz <tobias@waldekranz.com>
>> +Date: Fri, 14 Oct 2022 21:14:14 +0200
>> +Subject: [PATCH] Makefile: Fix cross-compilation for 32-bit targets
>> +
>> +Determining the correct library installation path (lib vs. lib64)
>> +using uname(1) breaks in cross compilation scenarios where word widths
>> +differ between the host and target system.
>> +
>> +Instead, source the information from the compilers '-dumpmachine'
>> +option (supported by both GCC and Clang).
>> +
>> +We call this the "host" architecture, using the same nomenclature as
>> +Autotools (--host configure option).
>> +
>
> Please add:
>
> Upstream: https://github.com/libbpf/libbpf/commit/68e6f83f223ebf3fbf0d94c0f4592e5e6773f0c1

Sure thing.

>> +Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
>
> Could you send a v2 with those changes? I was about to do the changes
> myself, but I really don't know which build failure this patch is
> fixing so I couldn't fix that up myself in the commit log.
>
> Thanks a lot!
>
> Thomas
> -- 
> Thomas Petazzoni, co-owner and CEO, Bootlin
> Embedded Linux and Kernel engineering and training
> https://bootlin.com
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
Thomas Petazzoni Oct. 26, 2022, 9:28 p.m. UTC | #3
On Wed, 26 Oct 2022 22:00:09 +0200
Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:

> Could you copy/paste the details of the build failure that was
> occurring, and provide details on the context it was occurring?

By building kmemd, I figured out what the issue was, and it's now
clear. I have applied your PATCH 1/4 with an extended explanation.

Thanks!

Thomas
Thomas Petazzoni Oct. 27, 2022, 6:46 a.m. UTC | #4
On Thu, 20 Oct 2022 16:14:09 +0200
Tobias Waldekranz <tobias@waldekranz.com> wrote:

> Add upstream patch that sources the library path (lib vs. lib64) from
> the compiler rather than from uname(1).
> 
> Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
> ---
>  ...cross-compilation-for-32-bit-targets.patch | 37 +++++++++++++++++++
>  1 file changed, 37 insertions(+)
>  create mode 100644 package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch

Thanks, applied with a rework commit log:

    package/libbpf: install in the correct lib directory
    
    The libbpf build system currently uses the output of "uname -m" to
    determine if the library should be installed in "lib" or
    "lib64". However, uname -m returns the architecture of the build
    machine, which often has nothing to do with the target CPU
    architecture.
    
    A patch has been submitted and accepted upstream to address this
    issue, by using the $(CC) -dumpmachine output instead. This ensures
    libbpf is installed in either "lib" or "lib64" depending on the
    bitness of the target CPU architecture.
    
    Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
    Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>

The patch was also moved away from the version-specific directory, and
the upstream status of the patch was added in the patch itself.

Thanks!

Thomas
diff mbox series

Patch

diff --git a/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
new file mode 100644
index 0000000000..3730b2fa41
--- /dev/null
+++ b/package/libbpf/1.0.1/0001-Makefile-Fix-cross-compilation-for-32-bit-targets.patch
@@ -0,0 +1,37 @@ 
+From 68e6f83f223ebf3fbf0d94c0f4592e5e6773f0c1 Mon Sep 17 00:00:00 2001
+From: Tobias Waldekranz <tobias@waldekranz.com>
+Date: Fri, 14 Oct 2022 21:14:14 +0200
+Subject: [PATCH] Makefile: Fix cross-compilation for 32-bit targets
+
+Determining the correct library installation path (lib vs. lib64)
+using uname(1) breaks in cross compilation scenarios where word widths
+differ between the host and target system.
+
+Instead, source the information from the compilers '-dumpmachine'
+option (supported by both GCC and Clang).
+
+We call this the "host" architecture, using the same nomenclature as
+Autotools (--host configure option).
+
+Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
+---
+ src/Makefile | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/Makefile b/src/Makefile
+index 3cd0854..d535f81 100644
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -77,7 +77,8 @@ INSTALL = install
+ 
+ DESTDIR ?=
+ 
+-ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(shell uname -m)),)
++HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine)))
++ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),)
+ 	LIBSUBDIR := lib64
+ else
+ 	LIBSUBDIR := lib
+-- 
+2.34.1
+