Custom Cross Compiler with Nix
This post is about trying to do something seemingly simple. You have an unusual system that you want to write code for. You even have a cross compiler! But how can you get this working with nix? Although the answer turned out to be simple, the journey to getting there was super long and undocumented. I hope this post saves you a lot of time! My Motivations Link to heading I have a deep love for an operating system called Risc Os . It is a really old operating system made by Acorn Computers Ltd. for their Archimedes range of computers and you can still run it on Raspberry Pi! I love it for a few reasons: It’s so simple It was one of the first things I nerded out over after seeing at the national computing museum in Bletchley Park Programming it in C helped is where pretty much all of my C knowledge comes from But programming it is not easy. It predates every programming convention we have. There are no good text editors on it, and compiling is a pain! But there is a cross compiler! The only issue is that when you try to build it, it becomes obvious that you need a seriously old version of ubuntu on X86_64 linux (it’s a patched GCC 4.7.4) and these days, I sport an Arm Mac which won’t even build a compiler that old! Can we nix it? Link to heading Well of course we can. I cannot think of a better use of a flake! And then we can use something like the rosetta builder from Mac OS to cross build software! I thought that would be easy, but my god it was not! Nix was a dream, but building old versions of GCC is a task I would not wish upon my worst enemies! But it is at this point we fast forward because this is the point I assume you are reading this. You have a cross toolchain built in nix (maybe because you have followed a great tutorial like this one ). And that’s all well and good.... but it’s a bit annoying. Every time you want to build something, you have to manually invoke the correct compiler (e.g. arm-unknown-riscos-gcc ), or you have to manually pass the correct --target to ./configure or whatever. What you want is something more like a pkgsCross."your platform".callPackage ... that does all of that for you! You want a custom cross-stdenv! How C compilers work in Nix Link to heading So if you follow the tutorial I linked , you will have noticed that the entire compiler, and tools, was built in one package. Why? The reason is that if you do as I did instead, and build binutils and GCC separately, when you finally try to invoke your cross GCC, it will weirdly try to use ar and as instead of arm-unkonwn...-ar and arm-unknown...-as . My initial solution was to build a wrapper for GCC (Nix has...
Preview: ~500 words
Continue reading at Hacker News
Read Full Article