Cross Compiling: Difference between revisions

From NixOS Wiki
imported>Symphorien
add an example shell file
imported>Samueldr
Line 13: Line 13:
== How to obtain a shell with a cross compiler ==
== How to obtain a shell with a cross compiler ==
Create a file as follows:
Create a file as follows:
{{file|crossShell.nix|nix|<nowiki>
<syntaxhighlight lang="nix">
with import <nixpkgs> {
with import <nixpkgs> {
   crossSystem = {
   crossSystem = {
Line 23: Line 23:
   buildInputs = [ zlib ]; # your dependencies here
   buildInputs = [ zlib ]; # your dependencies here
}
}
</nowiki>}}
</syntaxhighlight>
and then use it to obtain a shell:
and then use it to obtain a shell:
{{commands|nix-shell crossShell.nix}}
{{commands|nix-shell crossShell.nix}}

Revision as of 21:04, 9 February 2019

For building arm software check out the Article NixOS on ARM
If you are looking for building 32bit software, check out Packaging/32bit Applications
Quick example to cross compile a package: Cheatsheet#Cross-compile_packages.

Cross-Compiling in nixpkgs unstable (pre-18.09)

A lot has happened in 2018 and now cross-compilation is well supported within the unstable branch of nixpkgs. The basic idea is to use pkgsCross.platform instead of pkgs:

nix build -f channel:nixos-unstable pkgsCross.raspberryPi.emacs

How to obtain a shell with a cross compiler

Create a file as follows:

with import <nixpkgs> {
  crossSystem = {
    config = "aarch64-unknown-linux-gnu";
  };
};

mkShell {
  buildInputs = [ zlib ]; # your dependencies here
}

and then use it to obtain a shell:

nix-shell crossShell.nix

The resulting shell will have $CC etc. set to the right compiler.

How to specify dependencies

Depending in which if packages are required at build time or at runtime they need to go to different inputs the derivation.

  • If it is used at build-time it's depsBuildXXX
    • compiler producing native binaries go to depsBuildBuild
    • compiler producing cross binaries, all setup hooks and programs executed by the builder go to depsBuildHost
      • common examples: pkgconfig, autoreconfHook, makeWrapper, intltool, bison, flex
  • If it is used at run-time it's depsHostXXX. [Stack linking doesn't effect this, even if it allows us to forget where things came from.]
    • if it’s an interpreter that will be needed by an installed script, it should go in depsHostTarget.
    • otherwise it is probably only needed at build time and can go in depsBuildHost
  • If it is a tool and "acts" (e.g. helps build) on build-time stuff, then it's depsXXXBuild
  • If it is a tool and "acts" on run-time stuff, then it's depsXXXHost
  • if it is not a tool, it's depsXXX(XXX+1)(build + 1 == host, host +1 == target) for backwards compatibility, use nativeBuildInputs instead of depsBuildHost and buildInputs instead of depsHostTarget.

Source: https://github.com/NixOS/nixpkgs/pull/50881#issuecomment-440772499


References

Additional resources