forked from lix-project/lix
Merge pull request #4257 from hercules-ci/issue-4197-nix-build-output-order
Issue 4197 nix build output order
This commit is contained in:
commit
399c7f3f8b
|
@ -487,6 +487,7 @@ static void main_nix_build(int argc, char * * argv)
|
||||||
else {
|
else {
|
||||||
|
|
||||||
std::vector<StorePathWithOutputs> pathsToBuild;
|
std::vector<StorePathWithOutputs> pathsToBuild;
|
||||||
|
std::vector<std::pair<StorePath, std::string>> pathsToBuildOrdered;
|
||||||
|
|
||||||
std::map<StorePath, std::pair<size_t, StringSet>> drvMap;
|
std::map<StorePath, std::pair<size_t, StringSet>> drvMap;
|
||||||
|
|
||||||
|
@ -498,6 +499,7 @@ static void main_nix_build(int argc, char * * argv)
|
||||||
throw Error("derivation '%s' lacks an 'outputName' attribute", store->printStorePath(drvPath));
|
throw Error("derivation '%s' lacks an 'outputName' attribute", store->printStorePath(drvPath));
|
||||||
|
|
||||||
pathsToBuild.push_back({drvPath, {outputName}});
|
pathsToBuild.push_back({drvPath, {outputName}});
|
||||||
|
pathsToBuildOrdered.push_back({drvPath, {outputName}});
|
||||||
|
|
||||||
auto i = drvMap.find(drvPath);
|
auto i = drvMap.find(drvPath);
|
||||||
if (i != drvMap.end())
|
if (i != drvMap.end())
|
||||||
|
@ -513,25 +515,23 @@ static void main_nix_build(int argc, char * * argv)
|
||||||
|
|
||||||
std::vector<StorePath> outPaths;
|
std::vector<StorePath> outPaths;
|
||||||
|
|
||||||
for (auto & [drvPath, info] : drvMap) {
|
for (auto & [drvPath, outputName] : pathsToBuildOrdered) {
|
||||||
auto & [counter, wantedOutputs] = info;
|
auto & [counter, _wantedOutputs] = drvMap.at({drvPath});
|
||||||
std::string drvPrefix = outLink;
|
std::string drvPrefix = outLink;
|
||||||
if (counter)
|
if (counter)
|
||||||
drvPrefix += fmt("-%d", counter + 1);
|
drvPrefix += fmt("-%d", counter + 1);
|
||||||
|
|
||||||
auto builtOutputs = store->queryDerivationOutputMap(drvPath);
|
auto builtOutputs = store->queryDerivationOutputMap(drvPath);
|
||||||
|
|
||||||
for (auto & outputName : wantedOutputs) {
|
auto outputPath = builtOutputs.at(outputName);
|
||||||
auto outputPath = builtOutputs.at(outputName);
|
|
||||||
|
|
||||||
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
|
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
|
||||||
std::string symlink = drvPrefix;
|
std::string symlink = drvPrefix;
|
||||||
if (outputName != "out") symlink += "-" + outputName;
|
if (outputName != "out") symlink += "-" + outputName;
|
||||||
store2->addPermRoot(outputPath, absPath(symlink));
|
store2->addPermRoot(outputPath, absPath(symlink));
|
||||||
}
|
|
||||||
|
|
||||||
outPaths.push_back(outputPath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
outPaths.push_back(outputPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger->stop();
|
logger->stop();
|
||||||
|
|
33
tests/nix-build-examples.nix
Normal file
33
tests/nix-build-examples.nix
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
with import ./config.nix;
|
||||||
|
|
||||||
|
rec {
|
||||||
|
|
||||||
|
input0 = mkDerivation {
|
||||||
|
name = "dependencies-input-0";
|
||||||
|
buildCommand = "mkdir $out; echo foo > $out/bar";
|
||||||
|
};
|
||||||
|
|
||||||
|
input1 = mkDerivation {
|
||||||
|
name = "dependencies-input-1";
|
||||||
|
buildCommand = "mkdir $out; echo FOO > $out/foo";
|
||||||
|
};
|
||||||
|
|
||||||
|
input2 = mkDerivation {
|
||||||
|
name = "dependencies-input-2";
|
||||||
|
buildCommand = ''
|
||||||
|
mkdir $out
|
||||||
|
echo BAR > $out/bar
|
||||||
|
echo ${input0} > $out/input0
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
body = mkDerivation {
|
||||||
|
name = "dependencies-top";
|
||||||
|
builder = ./dependencies.builder0.sh + "/FOOBAR/../.";
|
||||||
|
input1 = input1 + "/.";
|
||||||
|
input2 = "${input2}/.";
|
||||||
|
input1_drv = input1;
|
||||||
|
meta.description = "Random test package";
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -26,3 +26,18 @@ outPath2=$(nix-build $(nix-instantiate dependencies.nix)!out --no-out-link)
|
||||||
|
|
||||||
outPath2=$(nix-store -r $(nix-instantiate --add-root $TEST_ROOT/indirect dependencies.nix)!out)
|
outPath2=$(nix-store -r $(nix-instantiate --add-root $TEST_ROOT/indirect dependencies.nix)!out)
|
||||||
[[ $outPath = $outPath2 ]]
|
[[ $outPath = $outPath2 ]]
|
||||||
|
|
||||||
|
# The order of the paths on stdout must correspond to the -A options
|
||||||
|
# https://github.com/NixOS/nix/issues/4197
|
||||||
|
|
||||||
|
input0="$(nix-build nix-build-examples.nix -A input0 --no-out-link)"
|
||||||
|
input1="$(nix-build nix-build-examples.nix -A input1 --no-out-link)"
|
||||||
|
input2="$(nix-build nix-build-examples.nix -A input2 --no-out-link)"
|
||||||
|
body="$(nix-build nix-build-examples.nix -A body --no-out-link)"
|
||||||
|
|
||||||
|
outPathsA="$(echo $(nix-build nix-build-examples.nix -A input0 -A input1 -A input2 -A body --no-out-link))"
|
||||||
|
[[ "$outPathsA" = "$input0 $input1 $input2 $body" ]]
|
||||||
|
|
||||||
|
# test a different ordering to make sure it fails, not just in 23 out of 24 permutations
|
||||||
|
outPathsB="$(echo $(nix-build nix-build-examples.nix -A body -A input1 -A input2 -A input0 --no-out-link))"
|
||||||
|
[[ "$outPathsB" = "$body $input1 $input2 $input0" ]]
|
||||||
|
|
Loading…
Reference in a new issue