From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Nieuwenhuizen Subject: Re: 04/05: gnu: autoconf: Support cross-build. Date: Tue, 21 Apr 2020 20:12:23 +0200 Message-ID: <87r1wg908o.fsf@gnu.org> References: <20200419090521.13083.63849@vcs0.savannah.gnu.org> <20200419090523.C255A2049B@vcs0.savannah.gnu.org> <87tv1cx1yo.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:41378) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jQxNk-00027f-G4 for guix-devel@gnu.org; Tue, 21 Apr 2020 14:12:29 -0400 In-Reply-To: <87tv1cx1yo.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Tue, 21 Apr 2020 18:01:19 +0200") List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane-mx.org@gnu.org Sender: "Guix-devel" To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: Hello, >> gnu: autoconf: Support cross-build. > Thanks for fixing it! Some comments: >> + (inputs >> + (if (%current-target-system) >> + `(("perl" ,perl) >> + ("m4" ,m4)) >> + '())) >> (native-inputs >> - `(("perl" ,perl) >> - ("m4" ,m4))) >> + (if (%current-target-system) >> + `(("perl-for-build" ,perl) >> + ("m4-for-build" ,m4)) >> + `(("perl" ,perl) >> + ("m4" ,m4)))) > > You can remove the =E2=80=98if=E2=80=99 in both cases: we always need Per= l/M4 both as a > native input and as an input in both cases. ...yes > However, that might trigger a rebuild, so perhaps you=E2=80=99ll have to = leave > the ifs, but with a TODO telling to remove it on the next rebuild or > Marius will be mad at us. Indeed; so changed to: (inputs ;; TODO: remove `if' in the next rebuild cycle. (if (%current-target-system) `(("perl" ,perl) ("m4" ,m4)) '())) (native-inputs `(("perl" ,perl) ("m4" ,m4))) >> + (arguments >> + `(#:tests? #f > > Nope. :-) Ahum, yes, well...this made me blush for a moment ("I should not rely on a review by Ludovic for catching such a development hack") but look at the three preceeding lines: ;; XXX: testsuite: 209 and 279 failed. The latter is an impurity. It ;; should use our own "cpp" instead of "/lib/cpp". - (arguments `(#:tests? #f)) Tests are disabled currently (even on master!), so I guess that inserting this line break is fine :-) >> + ,@(if (%current-target-system) >> + `(#:phases >> + (modify-phases %standard-phases >> + ;; Autoconf cannot be cross-built properly: it lacks t= he >> + ;; concept of -for-build. It even runs the host >> + ;; `autom4te' (a perl script) during build. >> + (add-after 'install 'fake-cross-build >> + (lambda* (#:key build inputs outputs #:allow-other-k= eys) >> + (let ((m4 (assoc-ref inputs "m4")) >> + (perl (assoc-ref inputs "perl")) >> + (out (assoc-ref outputs "out"))) >> + (substitute* (find-files (string-append out "/bin= ")) >> + (("/gnu/store/[^/]*-m4-[^/]*") m4) >> + (("/gnu/store/[^/]*-perl-[^/]*") perl)) >> + #t))))) > > Why is this needed? The =E2=80=98patch-shebangs=E2=80=99 phase normally = takes the > inputs, not the native inputs, when changing shebangs. Because it's not only the shebangs...but Good question...especially because it teaches me about patch-shebangs! Also, I failed to determine exactly what went wrong. Without m4, perl in INPUTS, the shebangs are wrong (obviously). After adding m4,perl in INPUTS, the shebangs are indeed correct. I hadn't noticed that before, because look: --8<---------------cut here---------------start------------->8--- $ head $(./pre-inst-env guix build --target=3Di586-pc-gnu autoconf)/bin/aut= oheader #!/gnu/store/ drz7805gcsrqkgr8v43r1f7zydlsxh05-perl-5.30.2/bin/perl # -*- Perl -*- # Generated from autoheader.in; do not edit by hand. eval 'case $# in 0) exec /gnu/store/8zvc5mvk0xm3ygrxsgpyy5ilxb5rzjry-perl-5= .30.2/bin/perl -S "$0";; *) exec /gnu/store/8zvc5mvk0xm3ygrxsgpyy5ilxb5rzjr= y-perl-5.30.2/bin/perl -S "$0" "$@";; esac' if 0; --8<---------------cut here---------------end--------------->8--- shebangs correct, re-execute EVALs: wrong. I have now changed this bit to: ,@(if (%current-target-system) `(#:phases (modify-phases %standard-phases ;; `patch-shebangs' patches shebangs only, and the Perl ;; scripts use a re-exec feature that references the build ;; hosts' perl. Also, M4 store references hide in the ;; scripts. (add-after 'install 'patch-non-shebang-references (lambda* (#:key build inputs outputs #:allow-other-keys) (let ((m4 (assoc-ref inputs "m4")) (perl (assoc-ref inputs "perl")) (out (assoc-ref outputs "out")) (store-directory (%store-directory))) (substitute* (find-files (string-append out "/bin")) (((string-append store-directory "/[^/]*-m4-[^/]*")= ) m4) (((string-append store-directory "/[^/]*-perl-[^/]*= ")) perl)) #t))))) > (You previously found that something=E2=80=99s wrong there, but I forgot = what=E2=80=A6) (yes, and I did not have the whole story) Attaching the updated patch in full. (automake is pretty similar, i'll send an updated patch for that right after this review is finished). Greetings, janneke --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-gnu-autoconf-Support-cross-build.patch >From 3d776e0077d62000f20d23a1b42b32fef718a503 Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Sat, 18 Apr 2020 19:49:54 +0200 Subject: [PATCH] gnu: autoconf: Support cross-build. Autoconf cannot be cross-built properly: it lacks the concept of -for-build. It runs the host `autom4te' (a perl script) during build. * gnu/packages/autotools.scm (autoconf)[inputs]: When cross-building, add perl and m4. [native-inputs]: when cross-building, use -for-build names. [arguments]: When cross-building, add `fake-cross-build' phase to substitute m4 and perl. --- gnu/packages/autotools.scm | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/gnu/packages/autotools.scm b/gnu/packages/autotools.scm index 99ca52730e..fa3ced182f 100644 --- a/gnu/packages/autotools.scm +++ b/gnu/packages/autotools.scm @@ -55,12 +55,38 @@ (base32 "113nlmidxy9kjr45kg9x3ngar4951mvag1js2a3j8nxcz34wxsv4")))) (build-system gnu-build-system) + (inputs + ;; TODO: remove `if' in the next rebuild cycle. + (if (%current-target-system) + `(("perl" ,perl) + ("m4" ,m4)) + '())) (native-inputs `(("perl" ,perl) ("m4" ,m4))) ;; XXX: testsuite: 209 and 279 failed. The latter is an impurity. It ;; should use our own "cpp" instead of "/lib/cpp". - (arguments `(#:tests? #f)) + (arguments + `(#:tests? #f + ,@(if (%current-target-system) + `(#:phases + (modify-phases %standard-phases + ;; `patch-shebangs' patches shebangs only, and the Perl + ;; scripts use a re-exec feature that references the build + ;; hosts' perl. Also, M4 store references hide in the + ;; scripts. + (add-after 'install 'patch-non-shebang-references + (lambda* (#:key build inputs outputs #:allow-other-keys) + (let ((m4 (assoc-ref inputs "m4")) + (perl (assoc-ref inputs "perl")) + (out (assoc-ref outputs "out")) + (store-directory (%store-directory))) + (substitute* (find-files (string-append out "/bin")) + (((string-append store-directory "/[^/]*-m4-[^/]*")) m4) + (((string-append store-directory "/[^/]*-perl-[^/]*")) + perl)) + #t))))) + '()))) (home-page "https://www.gnu.org/software/autoconf/") (synopsis "Create source code configuration scripts") (description -- 2.26.0 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.com --=-=-=--