Message ID | 8fc771beb3f0f1e2886a238e0ef9087908c98fc1.camel@free.fr |
---|---|
State | Accepted |
Headers | show |
Series | [bug#45252] gnu: libffi: Add unreleased patch to fix float128 on powerpc64le. | expand |
Context | Check | Description |
---|---|---|
cbaines/submitting builds | success | |
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | fail | View Laminar job |
cbaines/issue | success | View issue |
Hi, dftxbs3e <dftxbs3e@free.fr> writes: > Based on previous discussions to apply < > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=44778> on the master > branch instead I submit this new patch (attached) so that it does not > cause a world rebuild by not altering the package definition hash on > other platforms. My understanding is as follows: - Patch 44778, linked above, was committed on core-updates branch in 4fff5ab24126a152b50c036b9bf8dc6f2740f094. - The libffi patch in this patch (45252) is the same as it was in 44778, but the scheme code has been changed so that we can apply this patch to the master branch without causing a rebuild of many packages. Is that right? > + '()) > + ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system) > + (%current-system))) > + '(#:phases (modify-phases %standard-phases > + (add-after 'unpack 'apply-patch2 > + (lambda* (#:key inputs #:allow-other-keys) > + (let ((patch (assoc-ref inputs > + "powerpc64le-patch"))) > + (invoke "patch" "--batch" "-p1" > + "-i" patch)))))) > '()))) > (inputs > - (if (string-prefix? "powerpc-" (or (%current-target-system) > + (cond > + ((string-prefix? "powerpc-" (or (%current-target-system) > (%current-system))) > - `(("powerpc-patch" ,@(search-patches > - "libffi-3.3-powerpc-fixes.patch"))) > - '())) > + `(("powerpc-patch" ,@(search-patches > + "libffi-3.3-powerpc-fixes.patch")))) > + ((string-prefix? "powerpc64le-" (or (%current-target-system) > + (%current-system))) > + `(("powerpc64le-patch" ,@(search-patches > + "libffi-float128-powerpc64le.patch")))) > + (else '()))) Looks good to me. I'll test it locally and update here once I've confirmed that it doesn't cause a full rebuild when applied to master. Assuming all goes well, I intend to revert 4fff5ab24126a152b50c036b9bf8dc6f2740f094 on core-updates and apply this patch to master. > +++ b/gnu/packages/patches/libffi-float128-powerpc64le.patch Based on... https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/ ...it sounds like upstream libffi maintainers may not have merged this patch yet. We should probably check with them to see when they plan to merge it into upstream, but in the meantime there's no reason not to use the patch if it works. Based on what Fabrice said in that thread, it sounds like the libffi maintainers may be a bit slow in responding to power-related bugs.
On Sun, 2020-12-20 at 12:32 -0800, Chris Marusich wrote: > Hi, Hello! > My understanding is as follows: > > - Patch 44778, linked above, was committed on core-updates branch in > 4fff5ab24126a152b50c036b9bf8dc6f2740f094. > - The libffi patch in this patch (45252) is the same as it was in > 44778, > but the scheme code has been changed so that we can apply this > patch > to the master branch without causing a rebuild of many packages. > > Is that right? Exactly! > Based on... > > https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/ > > ...it sounds like upstream libffi maintainers may not have merged > this > patch yet. We should probably check with them to see when they plan > to > merge it into upstream, but in the meantime there's no reason not to > use > the patch if it works. Based on what Fabrice said in that thread, it > sounds like the libffi maintainers may be a bit slow in responding to > power-related bugs. > That's not true, they've merged the patch: < https://github.com/libffi/libffi/pull/561> - they just did not make a release yet. Leo
Hi, dftxbs3e <dftxbs3e@free.fr> writes: >> Based on... >> >> https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/ >> >> ...it sounds like upstream libffi maintainers may not have merged >> this >> patch yet. We should probably check with them to see when they plan >> to >> merge it into upstream, but in the meantime there's no reason not to >> use >> the patch if it works. Based on what Fabrice said in that thread, it >> sounds like the libffi maintainers may be a bit slow in responding to >> power-related bugs. >> > > That's not true, they've merged the patch: < > https://github.com/libffi/libffi/pull/561> - they just did not make a > release yet. Ah, OK. That's good to know! I've committed this patch in 7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99 on master. I've also reverted 4fff5ab24126a152b50c036b9bf8dc6f2740f094 in commit b50341dba9811c048bed852c0279b828c7ddba66 on core-updates. I think we should be good to go to try building powerpc64-linux-gnu bootstrap-tarballs now! I confirmed that this commit on master would not cause dependents of libffi to be rebuilt by verifying that the derivation for one of its dependent packages, guile, did not change before/after the change.
Hi, There's a problem with the following commit: > commit 7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99 > Author: John Doe <dftxbs3e@free.fr> > Date: Tue Dec 15 10:23:44 2020 +0100 > > gnu: libffi: Add unreleased patch to fix float128 on powerpc64le. > > Fixes <https://bugs.gnu.org/45252>. > > * gnu/packages/patches/libffi-float128-powerpc64le.patch: Import patch file > from <https://github.com/libffi/libffi/pull/561.patch>. > * gnu/packages/libffi.scm (libffi)[arguments]: Apply patch conditionally for > powerpc64le-* systems in a phase. > [inputs]: Add patch as input conditionally for powerpc64le-* systems. > * gnu/local.mk (dist_patch_DATA): Add patch file to build system. > > Signed-off-by: Chris Marusich <cmmarusich@gmail.com> The problem is in how the 'patch' program is invoked, here: > diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm > index d324892330..66239e0363 100644 > --- a/gnu/packages/libffi.scm > +++ b/gnu/packages/libffi.scm [...] > @@ -67,13 +68,28 @@ > "powerpc-patch"))) > (invoke "patch" "--batch" "-p1" > "-i" patch)))))) > + '()) > + ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system) > + (%current-system))) > + '(#:phases (modify-phases %standard-phases > + (add-after 'unpack 'apply-patch2 > + (lambda* (#:key inputs #:allow-other-keys) > + (let ((patch (assoc-ref inputs > + "powerpc64le-patch"))) > + (invoke "patch" "--batch" "-p1" > + "-i" patch)))))) > '()))) When invoking 'patch' in Guix, you should *always* use "--force" instead of "--batch". There's a crucial difference between these two options: If 'patch' finds that the given patch has already been applied, then "--batch" will automatically *revert* the patch, whereas "--force" will raise an error. Here's the relevant section of the 'diffutils' manual: > 10.11.2 Inhibiting Keyboard Input > --------------------------------- > > There are two ways you can prevent 'patch' from asking you any > questions. The '--force' ('-f') option assumes that you know what you > are doing. It causes 'patch' to do the following: > > * Skip patches that do not contain file names in their headers. > > * Patch files even though they have the wrong version for the > 'Prereq:' line in the patch; > > * Assume that patches are not reversed even if they look like they > are. > > The '--batch' ('-t') option is similar to '-f', in that it suppresses > questions, but it makes somewhat different assumptions: > > * Skip patches that do not contain file names in their headers (the > same as '-f'). > > * Skip patches for which the file has the wrong version for the > 'Prereq:' line in the patch; > > * Assume that patches are reversed if they look like they are. Now consider what will happen when we upgrade 'libffi' to a newer version that already includes this fix. If the Guix developer who performs the upgrade forgets to remove this patch, the 'patch' invocation above will start silently re-inserting the old bug. We ran into this exact problem in the early years of Guix, and henceforth changed all of the invocations of 'patch' to use '--force'. Can we fix this right away, before many powerpc64le-* binaries are built on top of it? In any case, thanks very much for working on the powerpc64le port! Regards, Mark
Earlier, I wrote: > When invoking 'patch' in Guix, you should *always* use "--force" instead > of "--batch". (See <https://bugs.gnu.org/45252#19> for my earlier message). Since writing the message above, I've found another problem in the same commit (7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99): it searches for the 'patch' program in 'inputs'. This is a mistake, because when cross-compiling, 'inputs' will contain software compiled to run on the target system instead of the build system. If 'native-inputs' is not #f, we should search for the 'patch' program in 'native-inputs' instead of 'inputs'. Unless there's now a better way that I don't know, I suggest adding 'native-inputs' to the list of keyword arguments accepted by the 'lambda*', and changing 'inputs' to "(or native-inputs inputs)" in the call to 'assoc-ref'. Something like this (untested): _ ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system) __________________________________________ (%current-system))) _______ '(#:phases (modify-phases %standard-phases ____________________ (add-after 'unpack 'apply-patch2 ______________________ (lambda* (#:key inputs native-inputs ________________________________ #:allow-other-keys) ________________________ (let ((patch (assoc-ref (or native-inputs inputs) ________________________________________________ "powerpc64le-patch"))) __________________________ (invoke "patch" "--force" "-p1" __________________________________ "-i" patch)))))) _______ '()) I see now that both of these mistakes were already present in the "powerpc-*" case immediately above the recently-added "powerpc64le-*" case. The "powerpc-*" case was added earlier this year in the following commit: https://git.sv.gnu.org/cgit/guix.git/commit/?id=02f5ee01c96589fc13f1e21b85b0b48100aec4e8 I'm CC'ing 'guix-devel' to raise awareness about these common mistakes, in the hopes that reviewers will be more likely to notice them in the future. Thanks, Mark
From 05c3dc588745240fb790f9a39111be70c153d70c Mon Sep 17 00:00:00 2001 From: John Doe <dftxbs3e@free.fr> Date: Tue, 15 Dec 2020 10:24:11 +0100 Subject: [PATCH] gnu: libffi: Add unreleased patch to fix float128 on powerpc64le. * gnu/packages/patches/libffi-float128-powerpc64le.patch: Import patch file from <https://github.com/libffi/libffi/pull/561.patch>. * gnu/packages/libffi.scm (libffi): [arguments]: Apply patch conditionally for powerpc64le-* systems in a phase. [inputs]: Add patch as input conditionally for powerpc64le-* systems. * gnu/local.mk (dist_patch_DATA): Add patch file to build system. --- gnu/local.mk | 1 + gnu/packages/libffi.scm | 25 ++++++-- .../patches/libffi-float128-powerpc64le.patch | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 gnu/packages/patches/libffi-float128-powerpc64le.patch diff --git a/gnu/local.mk b/gnu/local.mk index 0b4cf23838..e190df0667 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1208,6 +1208,7 @@ dist_patch_DATA = \ %D%/packages/patches/julia-SOURCE_DATE_EPOCH-mtime.patch \ %D%/packages/patches/kdbusaddons-kinit-file-name.patch \ %D%/packages/patches/libffi-3.3-powerpc-fixes.patch \ + %D%/packages/patches/libffi-float128-powerpc64le.patch \ %D%/packages/patches/libvirt-create-machine-cgroup.patch \ %D%/packages/patches/libziparchive-add-includes.patch \ %D%/packages/patches/localed-xorg-keyboard.patch \ diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm index d324892330..e4bfe6731b 100644 --- a/gnu/packages/libffi.scm +++ b/gnu/packages/libffi.scm @@ -57,7 +57,7 @@ ;; compiler. See "ax_cc_maxopt.m4" and "ax_gcc_archflag.m4". #:configure-flags '("--enable-portable-binary" "--without-gcc-arch") - ;; TODO: Inline patch on next rebuild cycle. + ;; TODO: Inline patches on next rebuild cycle. ,@(if (string-prefix? "powerpc-" (or (%current-target-system) (%current-system))) '(#:phases (modify-phases %standard-phases @@ -67,13 +67,28 @@ "powerpc-patch"))) (invoke "patch" "--batch" "-p1" "-i" patch)))))) + '()) + ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system) + (%current-system))) + '(#:phases (modify-phases %standard-phases + (add-after 'unpack 'apply-patch2 + (lambda* (#:key inputs #:allow-other-keys) + (let ((patch (assoc-ref inputs + "powerpc64le-patch"))) + (invoke "patch" "--batch" "-p1" + "-i" patch)))))) '()))) (inputs - (if (string-prefix? "powerpc-" (or (%current-target-system) + (cond + ((string-prefix? "powerpc-" (or (%current-target-system) (%current-system))) - `(("powerpc-patch" ,@(search-patches - "libffi-3.3-powerpc-fixes.patch"))) - '())) + `(("powerpc-patch" ,@(search-patches + "libffi-3.3-powerpc-fixes.patch")))) + ((string-prefix? "powerpc64le-" (or (%current-target-system) + (%current-system))) + `(("powerpc64le-patch" ,@(search-patches + "libffi-float128-powerpc64le.patch")))) + (else '()))) (outputs '("out" "debug")) (synopsis "Foreign function call interface library") (description diff --git a/gnu/packages/patches/libffi-float128-powerpc64le.patch b/gnu/packages/patches/libffi-float128-powerpc64le.patch new file mode 100644 index 0000000000..4fd32b0102 --- /dev/null +++ b/gnu/packages/patches/libffi-float128-powerpc64le.patch @@ -0,0 +1,58 @@ +From de93adfb6f48100946bba2c3abad2a77a0cfde0b Mon Sep 17 00:00:00 2001 +From: Fabrice Fontaine <fontaine.fabrice@gmail.com> +Date: Sun, 24 Nov 2019 09:52:01 +0100 +Subject: [PATCH] ffi_powerpc.h: fix build failure with powerpc7 + +This is a patch pulled down from the following: +https://github.com/buildroot/buildroot/blob/78926f610b1411b03464152472fd430012deb9ac/package/libffi/0004-ffi_powerpc.h-fix-build-failure-with-powerpc7.patch + +This issue is being hit on OpenBMC code when pulling the latest +libffi tag and building on a P8 ppc64le machine. I verified this +patch fixes the issue we are seeing. + +Below is the original commit message: + +Sicne commit 73dd43afc8a447ba98ea02e9aad4c6898dc77fb0, build on powerpc7 +fails on: + +In file included from ../src/powerpc/ffi.c:33:0: +../src/powerpc/ffi_powerpc.h:61:9: error: '_Float128' is not supported on this target + typedef _Float128 float128; + ^~~~~~~~~ + +Fix this build failure by checking for __HAVE_FLOAT128 before using +_Float128, as _Float128 is enabled only on specific conditions, see +output/host/powerpc64-buildroot-linux-gnu/sysroot/usr/include/bits/floatn.h: + + /* Defined to 1 if the current compiler invocation provides a + floating-point type with the IEEE 754 binary128 format, and this glibc + includes corresponding *f128 interfaces for it. */ + #if defined _ARCH_PWR8 && defined __LITTLE_ENDIAN__ && (_CALL_ELF == 2) \ + && defined __FLOAT128__ && !defined __NO_LONG_DOUBLE_MATH + # define __HAVE_FLOAT128 1 + #else + # define __HAVE_FLOAT128 0 + #endif + +Fixes: + - http://autobuild.buildroot.org/results/5c9dd8fb3b6a128882b6250f197c80232d8a3b53 + +Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> +Signed-off-by: Andrew Geissler <geissonator@yahoo.com> +--- + src/powerpc/ffi_powerpc.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/powerpc/ffi_powerpc.h b/src/powerpc/ffi_powerpc.h +index 8e2f2f0e..960a5c42 100644 +--- a/src/powerpc/ffi_powerpc.h ++++ b/src/powerpc/ffi_powerpc.h +@@ -57,7 +57,7 @@ typedef union + double d; + } ffi_dblfl; + +-#if defined(__FLOAT128_TYPE__) ++#if defined(__FLOAT128_TYPE__) && defined(__HAVE_FLOAT128) + typedef _Float128 float128; + #elif defined(__FLOAT128__) + typedef __float128 float128; -- 2.29.2