Hi,
I'm using nix in single user mode in a non-standard location
(${HOME}/nix/store) on a CentOS host on which I don't have root-access, and
which I don't want to flood with lots of build jobs. I'm looking for a good way
to "cross-compile" binaries on my laptop (nix in single user mode in standard
location /nix/store) which I can then export and install on the CentOS machine.
---
Here is my current approach (Thanks to another exchange on the mailing list a
while ago). It works, but feels a bit hacky, is hard to automate, and doesn't
offer hardware specific compiler flags:
I created a new user on my laptop, which has the same name, and home as my user
on the CentOS machine. That user has its own nix installation, which was
configured to use the non-standard store path. I open a login shell in that
user's name, and use nix-build to build whatever package I want to install on
the CentOS machine. Finally, I use nix-store export/import to install it.
---
Is there a way to skip the extra user on my laptop? I tried a cross-compilation
configuration. However, it doesn't seem to pick up the non-standard nix-store
location, and actually fails to compile gcc4.9.
Here is the cross-compile config:
let
pkgsFun = import <nixpkgs>;
pkgsNoParams = pkgsFun { };
in
pkgsFun {
crossSystem = {
config = "i686-pc-linux";
arch = "x86_64";
libc = "glibc";
withTLS = true;
float = "hard";
platform = pkgsNoParams.platforms.pc64 // {
kernelMajor = "2.6";
};
gcc.arch = "corei7-avx";
};
config = pkgs: {
packageOverrides = pkgs: {
nix = pkgs.nix.override {
storeDir = "/home/user/nix/store";
stateDir = "/home/user/nix/store";
};
};
};
}
I had to apply the following patch to nixpkgs because the linker name was
missing for this platform:
diff --git a/pkgs/build-support/gcc-wrapper/default.nix
b/pkgs/build-support/gcc-wrapper/default.nix
index 8e8b0b9..9a014b7 100644
--- a/pkgs/build-support/gcc-wrapper/default.nix
+++ b/pkgs/build-support/gcc-wrapper/default.nix
@@ -70,6 +70,7 @@ stdenv.mkDerivation {
(if stdenv.cross.arch == "arm" then "ld-linux.so.3" else
if stdenv.cross.arch == "mips" then "ld.so.1" else
if stdenv.lib.hasSuffix "pc-gnu" stdenv.cross.config then "ld.so.1"
else
+ if stdenv.cross.arch == "x86_64" then "ld-linux-x86-64.so.2" else
abort "don't know the name of the dynamic linker for this
platform");
};
When I try to build gcc4.9 with `nix-build -A gcc49.crossDrv beo.nix` then it
fails with this message:
checking for .preinit_array/.init_array/.fini_array support... no
configure: error: Need linker with .init_array/.fini_array support.
builder for
`/nix/store/hfix8jkynaj5r32kavyg2n1r5mp38092-glibc-2.19-i686-pc-linux.drv'
failed with exit code 1
cannot build derivation
`/nix/store/x3z0v3szgv4wd9icdbbwk2x6zhxky35m-gcc-wrapper-4.9.1-i686-pc-linux.drv':
1 dependencies couldn't be built
error: build of
`/nix/store/x3z0v3szgv4wd9icdbbwk2x6zhxky35m-gcc-wrapper-4.9.1-i686-pc-linux.drv'
failed
It seems that something is wrong with this linker configuration.
And it doesn't seem to pick up the non-standard nix-store path, as this is only
an override for the nix package.
---
What is the best way to achieve what I'm trying to do? Is there a way to avoid
the extra user on my laptop?
Thanks!
Andreas
_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev