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
nix-dev@lists.science.uu.nl
http://lists.science.uu.nl/mailman/listinfo/nix-dev

Reply via email to