stdenv: don't set NIX_LIB*_IN_SELF_RPATH by default#223861
stdenv: don't set NIX_LIB*_IN_SELF_RPATH by default#223861trofi merged 1 commit intoNixOS:stagingfrom
Conversation
|
Hey, thank you for the change, such changes triggers mass rebuilds, therefore you need to target staging, I will let you read carefully the CONTRIBUTING guide to understand how to do it without masspinging everyone, in the meantime, I will put this PR to draft. |
pkgs/stdenv/linux/default.nix
Outdated
There was a problem hiding this comment.
I'm afraid it's not that easy and depends on specific ports.
In theory non-multilib targets should just use lib. In practice what is a multilib has a moot definition: for example x86_64-linux-glibc is always multilib while x86_64-linux-musl is (or, should be) never multilib.
You can see remnants of multilib in gcc itself:
$ gcc -print-multi-os-directory
../lib64
Sometimes packages are diligent enough to have lib -> lib64 symlink (or the other way around). Sometimes they are not.
The question here is: What API do we expect for nixpkgs to provide and packages to use for non-multilib? Is it always lib or something else (lib64)? Today we do both with lib64 being a canonical path.
This change effectively says lib64 is not considered anymore as a searchpath.
There was a problem hiding this comment.
I think I follow, and quite possibly this change is too ambitious. My naïve thinking was that given the explicit dependencies of Nix, there shouldn't ever be multiple library search paths, only one set of paths per target.
However, assuming nixpkgs wants to keep the NIX_LIB*_IN_SELF_RPATH API, this change also fixes what I consider a genuine bug: that NIX_LIB*_IN_SELF_RPATH are set according to the build platform, not the target platform.
See #221350 for an example where the builder platform (x86_64-linux vs aarch64-linux) decides whether NIX_LIB*_IN_SELF_RPATH is set, not the target platform which is the same (and non-multilib).
So, can I move the setting of NIX_LIB*_IN_SELF_RPATH somewhere that depends on the target/host platform? pkgs/stdenv/linux/default.nix is itself prefixed with
assert crossSystem == localSystem;
and thus cannot decide whether to set NIX_LIB*_IN_SELF_RPATH. No?
There was a problem hiding this comment.
Cross-compilation case is a great point! I'll spend some time today to understand how nixpkgs plumbs rpath details there and get back.
There was a problem hiding this comment.
Is it fair to say NIX_LIB*_IN_SELF_RPATH should only be set for multiStdenv? If so, the variables could be set conditionally there.
There was a problem hiding this comment.
Is it fair to say NIX_LIB*_IN_SELF_RPATH should only be set for multiStdenv? If so, the variables could be set conditionally there.
Ideally (if non-multilib environment used lib everywhere consistently) - yes. In practice I don't think we are there yet. We probably want both lib and lib64 to still be pulled in. Normally I would expect NIX_LDFLAGS to apply to host toolchains (and NIX_LDFLAGS_FOR_BUILD / NIX_LDFLAGS_FOR_TARGET be disambiguating variables).
On the other hand looking at the history far back it was added before cross-compilation was a well-supported target: d9213df . It probably outlived it's purpose and we have many other ways to influence the driver.
Let's try your change as is and see if it works on multilib.
There was a problem hiding this comment.
Let's try your change as is and see if it works on multilib.
Nice, thank you.
It probably outlived it's purpose and we have many other ways to influence the driver.
By "other means to influence the driver", do you mean the corresponding (and only) users of the NIX_LIB*_IN_SELF_RPATH,
nixpkgs/pkgs/stdenv/generic/setup.sh
Lines 314 to 319 in 2ba1f86
should be removed as well?
There was a problem hiding this comment.
Yeah, let's remove those as well.
451b831 to
02df378
Compare
|
@RaitoBezarius retargeted |
you nailed it :) |
pkgs/stdenv/linux/default.nix
Outdated
There was a problem hiding this comment.
Is it fair to say NIX_LIB*_IN_SELF_RPATH should only be set for multiStdenv? If so, the variables could be set conditionally there.
Ideally (if non-multilib environment used lib everywhere consistently) - yes. In practice I don't think we are there yet. We probably want both lib and lib64 to still be pulled in. Normally I would expect NIX_LDFLAGS to apply to host toolchains (and NIX_LDFLAGS_FOR_BUILD / NIX_LDFLAGS_FOR_TARGET be disambiguating variables).
On the other hand looking at the history far back it was added before cross-compilation was a well-supported target: d9213df . It probably outlived it's purpose and we have many other ways to influence the driver.
Let's try your change as is and see if it works on multilib.
|
@ofborg build tests.cc-multilib-gcc |
02df378 to
3ecb6e1
Compare
The NIX_LIB64|32_IN_SELF_RPATH environment variables control whether to add lib64 and lib32 to rpaths. However, they're set depending on the build paltform, not the target platform and thus their values are incorrect for for cross-builds. On the other hand, setting them according to the build platform introduce pointless differences in build outputs; see NixOS#221350 for details. This change fixes the issues by boldly removes the NIX_LIB*_IN_SELF_RPATH facility altogether, in the hope that it is no longer necessary. They were introduced in 2009, long before nixpkgs had good support for cross-builds. Fixes NixOS#221350
3ecb6e1 to
88fd660
Compare
|
@ofborg build freshBootstrapTools.mips64el-linux-gnuabin32 |
|
Hey, I'm generally in favor of the goal here. I need a bit more time to review this; I recall from the last time I dealt with this stuff that it was hairy.
To test the effect of this deletion requires MIPS hardware (i.e. a native build) which Hydra doesn't have: nixpkgs/pkgs/stdenv/linux/default.nix Line 119 in 77c642a I'm working on starting a build on one of my mips machines to confirm this. |
|
Alright, started on a mips64 host, which can native-compile mips32: Needed #224325 (I thought I fixed the mips32-seccomp-sandbox-on-mips64-hosts situation, but I guess not... needed |
It's on the final (stage4) build of @trofi were you planning on merging this now or after the |
|
Waiting should be fine. |
ghost
left a comment
There was a problem hiding this comment.
LGTM if we can wait until staging branch-off on 2023-May-15.
Built on:
-
mipsel-linux
Thank you for the review! As I understand it, cache.nixos.org won't have packages with this PR applied in at least 40 days. |
|
Yeah, it's a bit unfortunate timing before a next major release preparation. Past history shows that we need to make sure toolchains are not too broken before we pull in major desktop environment updates right before NixOS release (like Note that I personally use Otherwise large-scale changes with many incremental steps might warrant a separate jobset on hydra to allow multiple iterations to get something into shape. This approach is usually used for |
I considered enabling content-adressing, however it's my understanding it won't help because this PR does change the binaries (in particular, |
|
Yeah, in this case it does change |
I suppose what you're saying is to keep working on reproducibility, ignoring this problem. That may work. However, I did see another indeterministic variation in binaries output by gcc that I suspect are caused by object files being different. |
|
Yup. Or use this change locally and keep getting world rebuilds. |
This is so cool; I really need to start doing it.
@eliasnaur I see you noticed the problem with that... |
Indeed. I hope to avoid some/all use of |
Similar to PR NixOS#223861 and the issue NixOS#221350, NIX_COREFOUNDATION_RPATH is set unconditionally in the darwin stdenv. This is wrong for cross- compiles and results in `rpaths` depending on the builder platform. This change makes another bold move and deletes the NIX_COREFOUNDATION_RPATH facility completely, in the hope it is no longer needed, or that any breakage is manageable. As an added bonus we can delete a darwin specific hack in glibc.
|
Can this be merged now that the branch-off date has passed? |
|
Now that the staging restrictions doesn't apply anymore, I believe this can proceed with standard reviewing as far as I know. |
|
Branch off is in 5 days though. |
|
Yeah, branch-off was an unfortunate label, sorry. I referred to the unrestricting of breaking changes to |
|
Let's pull it in. |
There doesn't seem to be a point in having separate /lib64 nor /lib32 directories in rpath in NixOS. Further, the setting of the environment variables
NIX_LIB64|32_IN_SELF_RPATHdepends on the build platform, not the target platform; see details in issues #221350.Fixes #221350
This change removes a Chesterton's Fence, and so is probably incomplete as is. I'm posting it anyway to start the discussion: only packages that need
NIX_LIB64|32_IN_SELF_RPATHshould define them, and only for the required target platforms. If possible, support forNIX_LIB64|32_IN_SELF_RPATHshould be removed altogether.Tested with
nix run .#hello. I can test with a more representative package set once the approach is validated.Things done
sandbox = trueset innix.conf? (See Nix manual)nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage./result/bin/)