From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 05 11:21:28 2022 Received: (at 54239) by debbugs.gnu.org; 5 Mar 2022 16:21:28 +0000 Received: from localhost ([127.0.0.1]:48933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nQX9r-000858-VV for submit@debbugs.gnu.org; Sat, 05 Mar 2022 11:21:28 -0500 Received: from mout.gmx.net ([212.227.17.20]:59033) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nQX9p-00084v-Rt for 54239@debbugs.gnu.org; Sat, 05 Mar 2022 11:21:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1646497278; bh=QhBprqL/9hOqHxTU3D00xGUhGf2qO4++MIeXCraJ4Ro=; h=X-UI-Sender-Class:References:From:To:Cc:Subject:Date:In-reply-to; b=hHpi7ZXCzdRzJJhB0L1UkzLYIUWdhtlWPfXPXoJL0hIocx753FCYl+7NXWQjsj1V8 Ez/43wlK+mfCKgbsFhLe/0YlVyzfxTpj5kCOfDf5YQKRBoK4aE3hTvCX9xS0I66BBx GYiIwQmshbLn36oRlXTlyvSK17fjlue45iUwlJGw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from labiere ([82.69.64.142]) by mail.gmx.net (mrgmx104 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MTAFb-1nbtnF1Mjv-00UdE6; Sat, 05 Mar 2022 17:21:18 +0100 References: <499e5dba47ef40df93a8b33fbb8e41cc2354e7a1.1646387919.git.julien@lepiller.eu> User-agent: mu4e 1.6.10; emacs 27.2 From: Pierre Langlois To: Julien Lepiller Subject: Re: [bug#54239] [PATCH v2 2/5] gnu: Add cross-clang. Date: Sat, 05 Mar 2022 16:05:43 +0000 In-reply-to: Message-ID: <87wnh8gykq.fsf@gmx.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Provags-ID: V03:K1:83EpukF15SqGaAp7230/ZegFEOF0/furozBJNQbgpEiarBPvQhL wpijfAN6wVjbfn6wVR2j+lluuvsXzIvM9lmVEFSt4uN3XeHTktPiGlC5SVeuU97L4L0eXvu O0gDA8tDmvnPhs5uu+KnsIJH+Bx1MrFPBi9xwjIZpiKxehvNTbq8l4X0Y3XlbERkW6T/+ny OaItJDHM4NXx2OOtqn39w== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:LN6IrCs+k/8=:pvwNU7sQthlrN6x/j8i89v sHymauDVupqAVDzeYytrwEeQLy87HJQuDr+tQf0EP2S5rM2PpFOANxA+47Lu9Y/AaaqR8BRsn 8ZKSfQy8L/5gTu60+Myn//vPTf7jmws/MzyuXTOsZDmz5SjYk+V/NnnxzznHfiKUtMZMvm6h1 ZB7a7fiOnfoT5f579kTtghV2Os8qQpEBi+goKRZd7rBLmSC28Nu1VMR4VToe+RPXXPHoTBTIZ wkYLv630PzXRzjIJjNkS07YPQwyPTfUHWSKsH4hp7GBXa6IPw02zsikgHmWA2JM2rGKAtNWp9 QU1Zreo0IaaFc3dGYCNVz2sib1zzkDwsd+TA/5uSUdY7wQTWP0jDvaEqiDRB4x4tJM68ummp0 MEgiaNllqwK8ljIRWpNawJbMyh/mUAK+dJxn5IEnKuwA5XdLCFjs1YX4DDy65JWbb2QlzEhyw m1veJChir+AjB/UsCGxlEgxPXfxe8TguXKEaln2SH07q6P3d0Y0QY7kOlI53XocZnNfic4K/t lB8t+B5Z99JC+muBMIq2v9/xEfS+YrPIX6UFHiDWONgiS9Ly1N3SFMZkMuKg8Kjortd5hkmJy i4CkvG3dQsO6H96vVMbQ5TEB2VKqTGGSniQmzBrSiqYQgtZXftEfM81fhuNeio/mi3CPfsrrJ 2x3haLOhM2zHjsvZxZ3dgT3SY1MPFdOmh0xRu/K9UJpuSJXq/RSMC6Unjr+OhGIp+MyzpCY3J NpPlK7E81azb+zCn+A1lSsKyLUAyz+wG4fRQ9dGsJeOlBAzlTnRfEyUJT5aAJimrPPjbzEGOX +HfjKvavHGUAb7iSKZ2dxIWI0dWs9PgbzfuKLJr48t0BiOvrEA4piAh4c+GT1zk85a7ydo24X kAF8tWJG1CXpFS0R7iINSKV4JKc9ayr4CgzMzg2DOy5ExQ3A+WIvjDdYMf1zpv+My//zrAg5I 5MWWwf5MfPUtCn/4+ZX8ccAT8Lc3c6vaK+8T0yb0YiPd6krMzaRIuQ9ckFtZTNmet1Vu98iFZ I2PQKxY9XKZUOdPgXI4zL+Ap0vOvrHO0B48xT4NwtUr2nFrRA0WEjMW5q3ZZylITCP9ITKnzj ijqCmvRZp8nKuA= X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 54239 Cc: 54239@debbugs.gnu.org, guix-patches@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hi, A couple of comments from me while testing this trying to build a cross-toolchain with llvm-13. Hope this is helpful! Julien Lepiller writes: > * gnu/packages/llvm.scm (cross-clang): New variable. > --- > gnu/packages/llvm.scm | 144 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 143 insertions(+), 1 deletion(-) > > diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm > index d6e9846699..c277e2ac35 100644 > --- a/gnu/packages/llvm.scm > +++ b/gnu/packages/llvm.scm > @@ -54,6 +54,7 @@ (define-module (gnu packages llvm) > #:use-module (guix build-system trivial) > #:use-module (gnu packages) > #:use-module (gnu packages base) > + #:use-module (gnu packages cross-base) > #:use-module (gnu packages gcc) > #:use-module (gnu packages bootstrap) ;glibc-dynamic-linker > #:use-module (gnu packages check) ;python-lit > @@ -75,7 +76,9 @@ (define-module (gnu packages llvm) > #:use-module (ice-9 match) > #:export (make-lld-wrapper > system->llvm-target > - cross-llvm)) > + cross-llvm > + cross-clang > + clang-for-target)) >=20=20 > (define* (system->llvm-target #:optional > (system (or (and=3D> (%current-target-syst= em) > @@ -1023,6 +1026,145 @@ (define-public clang-runtime clang-runtime-13) > (define-public clang clang-13) > (define-public clang-toolchain clang-toolchain-13) >=20=20 > +(define* (cross-clang target > + #:key > + (libc (cross-libc target)) > + (xgcc (cross-gcc target > + #:xbinutils (cross-binutils target) > + #:libc (cross-libc target))) > + (clang clang)) > + "Return a cross-clang compiler for target." > + (define cross-clang-aux > + (mlambda (target libc xgcc clang) > + (package > + (inherit clang) > + (name (string-append "clang-cross-" target)) > + (version (package-version clang)) > + ;; Support the same variables as clang, even in cross-compilatio= n context. > + ;; Clang does not make a difference between native and cross-com= pilation. > + (search-paths > + (list > + (search-path-specification > + (variable "CROSS_LIBRARY_PATH") > + (files '("lib"))) > + (search-path-specification > + (variable "CROSS_C_INCLUDE_PATH") > + (files '("include"))) > + (search-path-specification > + (variable "CROSS_CPLUS_INCLUDE_PATH") > + (files '("include/c++" "include"))))) > + (native-search-paths '()) > + (arguments > + (substitute-keyword-arguments (package-arguments clang) > + ((#:configure-flags _) > + `(list "-DCLANG_INCLUDE_TESTS=3DTrue" > + (string-append "-DGCC_INSTALL_PREFIX=3D" > + (assoc-ref %build-inputs "cross-gcc-li= b")) > + (string-append "-DC_INCLUDE_DIRS=3D" > + (assoc-ref %build-inputs "target-libc") > + "/include"))) > + ((#:phases phases) > + `(modify-phases ,phases > + (add-after 'unpack 'add-missing-libdir > + (lambda _ > + ;; cross-gcc installs its libraries in /lib i= nstead of > + ;; lib. > + (substitute* "lib/Driver/ToolChain.cpp" > + (("\"-L\"\\) \\+ LibPath\\)\\);") > + ,(string-append "\"-L\") + LibPath)); > + CmdArgs.push_back(Args.MakeArgString(StringRef(\"-L\") + " > + "StringRef(GCC_INSTALL_PREFIX) + St= ringRef(\"/" > + target "/lib\"))); > + CmdArgs.push_back(Args.MakeArgString(StringRef(\"-rpath=3D\") + " > + "StringRef(GCC_INSTALL_PREFIX) + St= ringRef(\"/" > + target "/lib\")));"))))) > + (add-after 'unpack 'support-cross-include-path > + (lambda _ > + (substitute* "lib/Driver/ToolChains/Clang.cpp" > + (("C_INCLUDE_PATH") "CROSS_C_INCLUDE_PATH") > + (("CPLUS_INCLUDE_PATH") "CROSS_CPLUS_INCLUDE_PATH")= ))) > + (add-after 'unpack 'support-cross-library-path > + (lambda _ > + ;; LIBRARY_PATH is only supported for native builds, = but we still > + ;; need it (or CROSS_LIBRARY_PATH to be precise) when > + ;; cross-compiling > + (substitute* "lib/Driver/ToolChains/CommonArgs.cpp" > + (("LIBRARY_PATH\"") > + "LIBRARY_PATH\"); > + } else { > + addDirectoryList(Args, CmdArgs, \"-L\", \"CROSS_LIBRARY_PATH\"")))) Testing this with llvm-13, this substitution doesn't look quite right and causes the build to fail, they might have removed braces between versions: https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/Driver/Too= lChains/CommonArgs.cpp#L236 Doing a blame points to this commit, which suggest it's changed with LLVM 10 release I believe. https://github.com/llvm/llvm-project/commit/7dbdc8de183e7aa2dc0a9c3a4f47314= 2ddd460bf, > + (replace 'set-glibc-file-names > + (lambda* (#:key inputs #:allow-other-keys) > + (let ((libc (assoc-ref inputs "target-libc")) > + (compiler-rt (assoc-ref inputs "clang-runtime")) Quick question, compiler-rt here is the host's runtime right? Do we not need to cross-compile it as well? It's not always clear to me what is part of compiler-rt vs libc vs libgcc, it could be target-dependent. For example when trying to target WebAssembly, I needed a cross-compiled compiler-rt to provide the libclang_rt.builtins-wasm32.a library. > + (gcc (assoc-ref inputs "cross-gcc"))) > + (setenv "LIBRARY_PATH" > + (string-append > + (assoc-ref inputs "libc") "/lib:" (getenv= "LIBRARY_PATH"))) > + ,@(cond > + ((version>=3D? version "6.0") > + `(;; Link to libclang_rt files from clang-runti= me. > + (substitute* "lib/Driver/ToolChain.cpp" > + (("getDriver\\(\\)\\.ResourceDir") > + (string-append "\"" compiler-rt "\""))) > + > + ;; Make "LibDir" refer to /lib so that= it > + ;; uses the right dynamic linker file name. > + (substitute* "lib/Driver/ToolChains/Linux.cpp" > + (("(^[[:blank:]]+LibDir =3D ).*" _ declarat= ion) > + (string-append declaration "\"" libc "/lib= \";\n")) > + > + ;; Make clang look for libstdc++ in the rig= ht > + ;; location. > + (("LibStdCXXIncludePathCandidates\\[\\] =3D= \\{") > + (string-append > + "LibStdCXXIncludePathCandidates[] =3D { \= "" gcc > + "/include/c++\",")) > + > + ;; Make sure libc's libdir is on the search= path, to > + ;; allow crt1.o & co. to be found. > + (("@GLIBC_LIBDIR@") > + (string-append libc "/lib"))))) > + (else > + `((substitute* "lib/Driver/Tools.cpp" > + ;; Patch the 'getLinuxDynamicLinker' functi= on so that > + ;; it uses the right dynamic linker file na= me. > + (("/lib64/ld-linux-x86-64.so.2") > + (string-append libc ,(glibc-dynamic-linker= )))) > + > + ;; Link to libclang_rt files from clang-runti= me. > + ;; This substitution needed slight adjustment= in 3.8. > + ,@(if (version>=3D? version "3.8") > + '((substitute* "lib/Driver/Tools.cpp" > + (("TC\\.getDriver\\(\\)\\.ResourceD= ir") > + (string-append "\"" compiler-rt "\= "")))) > + '((substitute* "lib/Driver/ToolChain.cp= p" > + (("getDriver\\(\\)\\.ResourceDir") > + (string-append "\"" compiler-rt "\= ""))))) > + > + ;; Make sure libc's libdir is on the search p= ath, to > + ;; allow crt1.o & co. to be found. > + (substitute* "lib/Driver/ToolChains.cpp" > + (("@GLIBC_LIBDIR@") > + (string-append libc "/lib"))))))))))))) > + (inputs > + `(("target-libc" ,libc) > + ("cross-gcc-lib" ,xgcc "lib") > + ("cross-gcc" ,xgcc) > + ,@(package-inputs clang))) > + (propagated-inputs > + (modify-inputs (package-propagated-inputs clang) > + (replace "llvm" > + (cross-llvm > + (car (assoc-ref (package-propagated-inputs clang) "llvm"= )) > + target))))))) > + (cross-clang-aux target libc xgcc clang)) > + > +(define* (clang-for-target #:optional (clang clang)) > + (if (%current-target-system) > + (cross-clang (%current-target-system) #:clang clang) > + clang)) > + > (define-public llvm-for-rocm > (package > ;; Actually based on LLVM 13 as of v4.3, but llvm-12 works just fine. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFMBAEBCgA2FiEEctU9gYy29KFyWDdMqPyeRH9PfVQFAmIjjfUYHHBpZXJyZS5s YW5nbG9pc0BnbXguY29tAAoJEKj8nkR/T31UWZ8H/RkJveoN8jLYnHtYmxuNW3d5 C856RQ2StnV+QJGaspgT90iQRwsyGGxUplJBVt5I2Whwtutsq10bIH0/eD6WQQ55 ZipUbb8jLeHJqx1hy4Slc6G41ZDr3j5r213AXWj67K6t3d2mYwnkwbxypR/EeLQy OVM6rjPBkfU+86buBsBOVFlwfBEQWvgI67oNa/68E9fzZNwAt9HgTiFgpO5KnfLA M7tbCXhmoul21mxXIcijE3tsHGPQ4A+H2QjNT45TxXb6DEh2ZtrVJDfODItpS/kS VpWYAauqYsb8lFsHfbtah6TJUTn0YVQLo/w6KJh/rnYHHu4pSBv/GzOKYrBIyk0= =M4mc -----END PGP SIGNATURE----- --=-=-=--