Cross Compiling: Difference between revisions
imported>Symphorien add an example shell file |
imported>Samueldr m fixes escaping issue →How to obtain a shell with a cross compiler |
||
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: | ||
<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 | ||
} | } | ||
</ | </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
- common examples:
- compiler producing native binaries go to
- 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’s an interpreter that will be needed by an installed script, it should go in
- 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, usenativeBuildInputs
instead ofdepsBuildHost
andbuildInputs
instead ofdepsHostTarget
.
Source: https://github.com/NixOS/nixpkgs/pull/50881#issuecomment-440772499
References
- Nixpkgs manual on cross compiling
- Nixpkgs manual on Specifying dependencies