I would like to have a buildFHSUserEnv
-shell in which I can use a “raw” gcc
that picks up libraries from system-locations like /usr/lib
etc. to build things.
So far I have this shell.nix
:
{ pkgs ? import <nixpkgs> { } }:
(pkgs.buildFHSUserEnv.override { stdenv = pkgs.stdenvNoCC; } {
name = "fhs";
targetPkgs = pkgs: (with pkgs; [
gcc-unwrapped
binutils-unwrapped
]);
multiPkgs = null;
}).env
Entering this shell gives me:
these 6 derivations will be built:
/nix/store/8jl4fgm5mrv3xgrdy75lzfgclhsnvfy9-profile.drv
/nix/store/1l7qh9p856b3pibrgvnk59ys9i2n1sqx-fhs-chrootenv-etc.drv
/nix/store/7zw4ijckcacgij9jqfa9wjinh7qa7b7v-builder.pl.drv
/nix/store/vlklkhis1p4wd4l9r8r8ydcxdfp4b345-fhs-usr-target.drv
/nix/store/q9z97giwiiz4agxd6jqqm7kzrsinkf0l-fhs-fhs.drv
/nix/store/pqw56xqy7xyyqni1a9cqslsibsyr7qv5-fhs-init.drv
these 4 paths will be fetched (0.08 MiB download, 0.37 MiB unpacked):
/nix/store/4y965wrv3shgg2s1ca431qpbrsb4dbag-stdenv-linux
/nix/store/a9g7p6fwanw66j5djzila7ql1hky759z-bash-interactive-4.4-p23-dev
/nix/store/j5cv3kba4cwx4dcnmsmhb25lfla0snzq-chrootenv
/nix/store/wgap303sj9zqz63gw7nqxvf4dqz2hgai-stdenv-linux
copying path '/nix/store/j5cv3kba4cwx4dcnmsmhb25lfla0snzq-chrootenv' from 'https://cache.nixos.org'...
copying path '/nix/store/a9g7p6fwanw66j5djzila7ql1hky759z-bash-interactive-4.4-p23-dev' from 'https://cache.nixos.org'...
copying path '/nix/store/4y965wrv3shgg2s1ca431qpbrsb4dbag-stdenv-linux' from 'https://cache.nixos.org'...
copying path '/nix/store/wgap303sj9zqz63gw7nqxvf4dqz2hgai-stdenv-linux' from 'https://cache.nixos.org'...
building '/nix/store/7zw4ijckcacgij9jqfa9wjinh7qa7b7v-builder.pl.drv'...
building '/nix/store/8jl4fgm5mrv3xgrdy75lzfgclhsnvfy9-profile.drv'...
building '/nix/store/1l7qh9p856b3pibrgvnk59ys9i2n1sqx-fhs-chrootenv-etc.drv'...
building '/nix/store/vlklkhis1p4wd4l9r8r8ydcxdfp4b345-fhs-usr-target.drv'...
collision between `/nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/locale/locale-archive' and `/nix/store/20dyxqvd9rnwzdnpdzb8vnv8w3vwa8wx-glibc-locales-2.31-74/lib/locale/locale-archive'
collision between `/nix/store/c10296m7xgm3ksibcklb2xf48jr635x3-gcc-9.3.0-lib/lib/libgcc_s.so' and `/nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/libgcc_s.so'
collision between `/nix/store/c10296m7xgm3ksibcklb2xf48jr635x3-gcc-9.3.0-lib/lib/libgcc_s.so.1' and `/nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib/libgcc_s.so.1'
collision between `/nix/store/c10296m7xgm3ksibcklb2xf48jr635x3-gcc-9.3.0-lib/lib64/libgcc_s.so' and `/nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib64/libgcc_s.so'
collision between `/nix/store/c10296m7xgm3ksibcklb2xf48jr635x3-gcc-9.3.0-lib/lib64/libgcc_s.so.1' and `/nix/store/0c7c96gikmzv87i7lv3vq5s1cmfjd6zf-glibc-2.31-74/lib64/libgcc_s.so.1'
Use of uninitialized value in string eq at /nix/store/w3awmn2x43g2yymp7yzb3985r3b89f3i-builder.pl line 133.
collision between `/nix/store/jki00pcw0npk9hfmxc5ln41003225b1h-shadow-4.8.1/etc/pam.d' and `/nix/store/m267yyzj9y73827wh3wjgy02nv2b9pxz-fhs-chrootenv-etc/etc/pam.d'
Use of uninitialized value in string eq at /nix/store/w3awmn2x43g2yymp7yzb3985r3b89f3i-builder.pl line 133.
collision between `/nix/store/jki00pcw0npk9hfmxc5ln41003225b1h-shadow-4.8.1/etc/login.defs' and `/nix/store/m267yyzj9y73827wh3wjgy02nv2b9pxz-fhs-chrootenv-etc/etc/login.defs'
created 1332 symlinks in user environment
building '/nix/store/q9z97giwiiz4agxd6jqqm7kzrsinkf0l-fhs-fhs.drv'...
building '/nix/store/pqw56xqy7xyyqni1a9cqslsibsyr7qv5-fhs-init.drv'...
So there are at least some collisions because I think buildFHSUserEnv
pulls in glibc
by itself.
But the actual problem is that this gcc
/ld
doesn’t work:
$ gcc test.c
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find crtn.o: No such file
(test.c
is a simple “Hello, World!”)
But all of these, i.e., crt1.o
, crti.o
, libgcc_s.so
, libc.so
and crtn.o
do exist in /usr/lib
inside the FHS-env.
Output of gcc -print-search-dirs
:
$ gcc -print-search-dirs
install: /nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/
programs: =/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/libexec/gcc/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/libexec/gcc/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/libexec/gcc/x86_64-unknown-linux-gnu/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../x86_64-unknown-linux-gnu/bin/
libraries: =/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../x86_64-unknown-linux-gnu/lib/x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../x86_64-unknown-linux-gnu/lib/../lib64/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../x86_64-unknown-linux-gnu/9.3.0/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../lib64/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../../x86_64-unknown-linux-gnu/lib/:/nix/store/fvf3qjqa5qpcjjkq37pb6ypnk1mzhf5h-gcc-9.3.0/lib/gcc/x86_64-unknown-linux-gnu/9.3.0/../../../
So these actually still point into /nix/store
, and locations like /usr/lib
don’t seem to be part of it?
Thanks!
Edit: Okay, the following actually kind of works, but I don’t really like it:
runScript = ''
env LIBRARY_PATH=/usr/lib C_INCLUDE_PATH=/usr/include CPLUS_INCLUDE_PATH=/usr/include CMAKE_LIBRARY_PATH=/usr/lib CMAKE_INCLUDE_PATH=/usr/include bash
'';
I’d like it if “normal” paths would be searched by default, and I wouldn’t need to specify this again for individual build-tools etc. What’s the magic that makes this work in “other” distros, and where does nix remove this magic?