diff options
author | Ekaitz Zarraga <ekaitz@elenq.tech> | 2024-04-05 14:35:02 +0200 |
---|---|---|
committer | Ekaitz Zarraga <ekaitz@elenq.tech> | 2024-04-05 14:36:31 +0200 |
commit | c83e76374fba54ca2694e5013e0eab4ecf7a38a2 (patch) | |
tree | 8037eef9a6b0726c62e3f24477ead80030590ed7 /content/bootstrapGcc | |
parent | 3550be337199ca3f872b7074d69c03e59a515c22 (diff) |
Update bootstrapGcc12 with a working gcc7.5
Diffstat (limited to 'content/bootstrapGcc')
-rw-r--r-- | content/bootstrapGcc/12_gcc_backported_works.md | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/content/bootstrapGcc/12_gcc_backported_works.md b/content/bootstrapGcc/12_gcc_backported_works.md new file mode 100644 index 0000000..9747c41 --- /dev/null +++ b/content/bootstrapGcc/12_gcc_backported_works.md @@ -0,0 +1,193 @@ +Title: GCC 4.6.4 with RISC-V support in Guix +Date: 2024-04-02 +Modified: 2024-04-05 +Category: +Tags: Bootstrapping GCC in RISC-V +Slug: bootstrapGcc12 +Lang: en +Summary: + We built GCC 4.6.4 with RISC-V support and C++ and all that and we made it + run in Guix, finally. + +Short post now, following what we did in [previous +episodes](/bootstrapGcc10.html) where we explained how to build it and +run it in Debian, now we can run it in Guix thanks to Efraim Flashner's help. + +We didn't get rid of the GCC Bootstrapping issue we explained in that post +(comparing binaries and all that, you remember). But we patched around it +because the differences were minimal, and this is not going to be a production +compiler after all. If this causes trouble in the future, we'll fix it, but I +don't think it will (I've said this before...). + +### How to use this thing + +We provide a `guix.scm` file in [the repository][gcc] you can use for your own +packages. If you know Guix, that's probably all you need to know. + +[gcc]: https://github.com/ekaitz-zarraga/gcc + +In my case, I did some ugly testing on this thing, so I made another folder, +adjacent to the `gcc` project folder and made this[^ugly]: + +[^ugly]: Oh yes, I said ugly. If you know Guix you'll understand what I mean. + There are plenty of ways to do this clean, but I don't care. I'm ugly. + +I added a `guix.scm` file: + +``` scheme +(use-modules (gnu packages base) + (gnu packages) + (guix licenses) + (guix gexp) + (guix utils) + (guix build-system gnu) + (guix packages)) + +(load "../gcc/guix.scm") + +(define-public my-hello + (package + (inherit hello) + (source (local-file (string-append (dirname (current-filename)) "/hola.cpp") + #:recursive? #t)) + (inputs (list gcc-mine)) + (arguments + `(#:tests? #f + #:phases (modify-phases %standard-phases + (delete 'configure) + (delete 'install) + (replace 'build (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/bin")) + (invoke "g++" "--version") + (invoke "g++" "hola.cpp" "-o" (string-append out "/bin/hola")))))))))) +my-hello +``` + +And a `hola.cpp` file: + +``` clike +#include<iostream> +int main (){ + std::cout << "Hola!\n"; + return 0; +} +``` + +Jumped into the folder and called this: + +``` bash +guix build -f guix.scm --system=riscv64-linux-gnu -K +``` + +Which gave me something like this, but way longer (beware of the `BLABLABLAH`): + +``` something +$ guix build -f guix.scm --system=riscv64-linux -K +fatal: not a git repository (or any parent up to mount point /) +Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). +substitute: updating substitutes from 'https://substitutes.nonguix.org'... 100.0% +substitute: updating substitutes from 'https://ci.guix.gnu.org'... 100.0% +substitute: updating substitutes from 'https://bordeaux.guix.gnu.org'... 100.0% +The following derivation will be built: + /gnu/store/niszn6sh1hd6hqwg0xjcw2q7q4lbjvbb-hello-2.12.1.drv +building /gnu/store/niszn6sh1hd6hqwg0xjcw2q7q4lbjvbb-hello-2.12.1.drv... + +... BLABLABLAH ... + +starting phase `build' +g++ (GCC) 4.6.4 +Copyright (C) 2011 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +phase `build' succeeded after 1.4 seconds +successfully built /gnu/store/niszn6sh1hd6hqwg0xjcw2q7q4lbjvbb-hello-2.12.1.drv +The following graft will be made: + /gnu/store/hnvji18y322q408x3h6i0wafmd6hqmdf-hello-2.12.1.drv +applying 2 grafts for hello-2.12.1 ... + +... BLABLABLAH ... + +successfully built /gnu/store/hnvji18y322q408x3h6i0wafmd6hqmdf-hello-2.12.1.drv +/gnu/store/dbkz567v66ry813svva2j3lnmdchb5r5-hello-2.12.1 +``` + +And that I could run (using Qemu binfmt magic): + +``` bash +$ /gnu/store/dbkz567v66ry813svva2j3lnmdchb5r5-hello-2.12.1/bin/hola +Hola! +``` + +Let's use `file` command just in case: + +``` bash +$ file /gnu/store/dbkz567v66ry813svva2j3lnmdchb5r5-hello-2.12.1/bin/hola +/gnu/store/dbkz567v66ry813svva2j3lnmdchb5r5-hello-2.12.1/bin/hola: ELF 64-bit +LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), +dynamically linked, interpreter +/gnu/store/fpqqyym3w1ym24jr2xiwz94hjfgr5hjm-glibc-2.35/lib/ld-linux-riscv64-lp64d.so.1, +for GNU/Linux 2.6.32, stripped +``` + +No tricks here, it's a RISC-V file, and you can see up in the Guix output it +was built using GCC 4.6.4. That's what we promised, isn't it? + +### Next + +Next we need to connect this thing to the bootstrapping chain. It needs to be +built using TinyCC and it needs to be able to build a modern GCC that is more +stable. + +With that, we might be able to build the whole RISC-V world. + +Wish us luck. + + +#### Extra (added 2024-04-05) + +In a similar fashion to the `my-hello` I shared as an example, I just tried +this: + +``` scheme +(use-modules (gnu packages gcc) + (ice-9 rdelim) + (gnu packages) + (guix licenses) + (guix gexp) + (guix utils) + (guix build-system gnu) + (guix packages)) + +(load "../gcc/guix.scm") + +(define-public gcc-with-mine + (package + (inherit gcc-7) + (inputs `(("gcc" ,gcc-mine) ,@(alist-delete "gcc" (package-inputs gcc-7)))) + (arguments (substitute-keyword-arguments (package-arguments gcc-7) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'setenv + ;; We don't want gcc-11:lib in CPLUS_INCLUDE_PATH, it messes with + ;; libstdc++ from gcc-4.6. + (lambda _ + (setenv "CPLUS_INCLUDE_PATH" (getenv "C_INCLUDE_PATH")))) )))))) + +gcc-with-mine +``` + +And guess what? It worked. + +This is really interesting because GCC 7.5 is the first one with official +RISC-V support. Being able to build it means from here we can follow the +existing bootstrapping chain and build the world. Also, GCC is a huge program +and, as I told you before, it does some checks during the build, building +itself twice and then comparing the resulting binaries to make sure it's +stable. Building an stable GCC that is also able to build itself means a lot. + +At this point we can consider my GCC-4.6.4 backport is correct, and not only +that, our package definition is, too. In projects like this bootstrapping thing +it still feels weird when things just work, it makes you be suspicious... I'll +try to ignore that feeling and be happy, just for once. |