aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.nix26
-rw-r--r--src/nix/command.hh17
-rw-r--r--src/nix/flake.cc80
-rw-r--r--src/nix/installables.cc17
-rw-r--r--src/nix/run.cc4
-rw-r--r--src/nix/shell.cc2
-rw-r--r--tests/flakes.sh24
7 files changed, 109 insertions, 61 deletions
diff --git a/flake.nix b/flake.nix
index 4ec80e9d6..2f0073cc8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -13,8 +13,10 @@
systems = [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" ];
+ forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
+
# Memoize nixpkgs for different platforms for efficiency.
- nixpkgsFor = nixpkgs.lib.genAttrs systems (system:
+ nixpkgsFor = forAllSystems (system:
import nixpkgs {
inherit system;
overlays = [ self.overlay ];
@@ -427,19 +429,19 @@
};
- checks = {
- binaryTarball = self.hydraJobs.binaryTarball.x86_64-linux;
- perlBindings = self.hydraJobs.perlBindings.x86_64-linux;
- };
+ checks = forAllSystems (system: {
+ binaryTarball = self.hydraJobs.binaryTarball.${system};
+ perlBindings = self.hydraJobs.perlBindings.${system};
+ });
- packages = {
- inherit (nixpkgsFor.x86_64-linux) nix;
- };
+ packages = forAllSystems (system: {
+ inherit (nixpkgsFor.${system}) nix;
+ });
- defaultPackage = self.packages.nix;
+ defaultPackage = forAllSystems (system: self.packages.${system}.nix);
- devShell =
- with nixpkgsFor.x86_64-linux;
+ devShell = forAllSystems (system:
+ with nixpkgsFor.${system};
with commonDeps pkgs;
stdenv.mkDerivation {
@@ -461,7 +463,7 @@
PATH=$prefix/bin:$PATH
unset PYTHONPATH
'';
- };
+ });
};
}
diff --git a/src/nix/command.hh b/src/nix/command.hh
index 802dd9828..93f324071 100644
--- a/src/nix/command.hh
+++ b/src/nix/command.hh
@@ -64,22 +64,9 @@ struct SourceExprCommand : virtual Args, EvalCommand, MixFlakeOptions
std::shared_ptr<Installable> parseInstallable(
ref<Store> store, const std::string & installable);
- virtual Strings getDefaultFlakeAttrPaths()
- {
- return {"defaultPackage"};
- }
+ virtual Strings getDefaultFlakeAttrPaths();
- virtual Strings getDefaultFlakeAttrPathPrefixes()
- {
- return {
- // As a convenience, look for the attribute in
- // 'outputs.packages'.
- "packages.",
- // As a temporary hack until Nixpkgs is properly converted
- // to provide a clean 'packages' set, look in 'legacyPackages'.
- "legacyPackages."
- };
- }
+ virtual Strings getDefaultFlakeAttrPathPrefixes();
};
enum RealiseMode { Build, NoBuild, DryRun };
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index e6dc5680f..d928af3b9 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -251,6 +251,12 @@ struct CmdFlakeCheck : FlakeCommand, MixJSON
auto state = getEvalState();
auto flake = resolveFlake();
+ auto checkSystemName = [&](const std::string & system, const Pos & pos) {
+ // FIXME: what's the format of "system"?
+ if (system.find('-') == std::string::npos)
+ throw Error("'%s' is not a valid system type, at %s", system, pos);
+ };
+
auto checkDerivation = [&](const std::string & attrPath, Value & v, const Pos & pos) {
try {
auto drvInfo = getDerivation(*state, v, false);
@@ -374,34 +380,70 @@ struct CmdFlakeCheck : FlakeCommand, MixJSON
if (name == "checks") {
state->forceAttrs(vOutput, pos);
- for (auto & attr : *vOutput.attrs)
- drvPaths.insert(checkDerivation(
- name + "." + (std::string) attr.name, *attr.value, *attr.pos));
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ state->forceAttrs(*attr.value, *attr.pos);
+ for (auto & attr2 : *attr.value->attrs) {
+ auto drvPath = checkDerivation(
+ fmt("%s.%s.%s", name, attr.name, attr2.name),
+ *attr2.value, *attr2.pos);
+ if ((std::string) attr.name == settings.thisSystem.get())
+ drvPaths.insert(drvPath);
+ }
+ }
}
else if (name == "packages") {
state->forceAttrs(vOutput, pos);
- for (auto & attr : *vOutput.attrs)
- checkDerivation(
- name + "." + (std::string) attr.name, *attr.value, *attr.pos);
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ state->forceAttrs(*attr.value, *attr.pos);
+ for (auto & attr2 : *attr.value->attrs)
+ checkDerivation(
+ fmt("%s.%s.%s", name, attr.name, attr2.name),
+ *attr2.value, *attr2.pos);
+ }
}
else if (name == "apps") {
state->forceAttrs(vOutput, pos);
- for (auto & attr : *vOutput.attrs)
- checkApp(
- name + "." + (std::string) attr.name, *attr.value, *attr.pos);
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ state->forceAttrs(*attr.value, *attr.pos);
+ for (auto & attr2 : *attr.value->attrs)
+ checkApp(
+ fmt("%s.%s.%s", name, attr.name, attr2.name),
+ *attr2.value, *attr2.pos);
+ }
}
- else if (name == "defaultPackage" || name == "devShell")
- checkDerivation(name, vOutput, pos);
+ else if (name == "defaultPackage" || name == "devShell") {
+ state->forceAttrs(vOutput, pos);
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ checkDerivation(
+ fmt("%s.%s", name, attr.name),
+ *attr.value, *attr.pos);
+ }
+ }
- else if (name == "defaultApp")
- checkApp(name, vOutput, pos);
+ else if (name == "defaultApp") {
+ state->forceAttrs(vOutput, pos);
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ checkApp(
+ fmt("%s.%s", name, attr.name),
+ *attr.value, *attr.pos);
+ }
+ }
- else if (name == "legacyPackages")
- // FIXME: do getDerivations?
- ;
+ else if (name == "legacyPackages") {
+ state->forceAttrs(vOutput, pos);
+ for (auto & attr : *vOutput.attrs) {
+ checkSystemName(attr.name, *attr.pos);
+ // FIXME: do getDerivations?
+ }
+ }
else if (name == "overlay")
checkOverlay(name, vOutput, pos);
@@ -409,7 +451,7 @@ struct CmdFlakeCheck : FlakeCommand, MixJSON
else if (name == "overlays") {
state->forceAttrs(vOutput, pos);
for (auto & attr : *vOutput.attrs)
- checkOverlay(name + "." + (std::string) attr.name,
+ checkOverlay(fmt("%s.%s", name, attr.name),
*attr.value, *attr.pos);
}
@@ -419,14 +461,14 @@ struct CmdFlakeCheck : FlakeCommand, MixJSON
else if (name == "nixosModules") {
state->forceAttrs(vOutput, pos);
for (auto & attr : *vOutput.attrs)
- checkModule(name + "." + (std::string) attr.name,
+ checkModule(fmt("%s.%s", name, attr.name),
*attr.value, *attr.pos);
}
else if (name == "nixosConfigurations") {
state->forceAttrs(vOutput, pos);
for (auto & attr : *vOutput.attrs)
- checkNixOSConfiguration(name + "." + (std::string) attr.name,
+ checkNixOSConfiguration(fmt("%s.%s", name, attr.name),
*attr.value, *attr.pos);
}
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index 93509955a..bc8fbeb8f 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -55,6 +55,23 @@ SourceExprCommand::SourceExprCommand()
.dest(&file);
}
+Strings SourceExprCommand::getDefaultFlakeAttrPaths()
+{
+ return {"defaultPackage." + settings.thisSystem.get()};
+}
+
+Strings SourceExprCommand::getDefaultFlakeAttrPathPrefixes()
+{
+ return {
+ // As a convenience, look for the attribute in
+ // 'outputs.packages'.
+ "packages." + settings.thisSystem.get() + ".",
+ // As a temporary hack until Nixpkgs is properly converted
+ // to provide a clean 'packages' set, look in 'legacyPackages'.
+ "legacyPackages." + settings.thisSystem.get() + "."
+ };
+}
+
ref<EvalState> EvalCommand::getEvalState()
{
if (!evalState) {
diff --git a/src/nix/run.cc b/src/nix/run.cc
index 01ec9a6f8..d444fd2eb 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -215,12 +215,12 @@ struct CmdApp : InstallableCommand, RunCommon
Strings getDefaultFlakeAttrPaths() override
{
- return {"defaultApp"};
+ return {"defaultApp." + settings.thisSystem.get()};
}
Strings getDefaultFlakeAttrPathPrefixes() override
{
- return {"apps."};
+ return {"apps." + settings.thisSystem.get() + "."};
}
void run(ref<Store> store) override
diff --git a/src/nix/shell.cc b/src/nix/shell.cc
index a4488b229..50d0f9c88 100644
--- a/src/nix/shell.cc
+++ b/src/nix/shell.cc
@@ -198,7 +198,7 @@ struct Common : InstallableCommand, MixProfile
Strings getDefaultFlakeAttrPaths() override
{
- return {"devShell", "defaultPackage"};
+ return {"devShell." + settings.thisSystem.get(), "defaultPackage." + settings.thisSystem.get()};
}
Path getShellOutPath(ref<Store> store)
diff --git a/tests/flakes.sh b/tests/flakes.sh
index c5e19826c..73f9d2685 100644
--- a/tests/flakes.sh
+++ b/tests/flakes.sh
@@ -34,8 +34,8 @@ cat > $flake1Dir/flake.nix <<EOF
description = "Bla bla";
outputs = inputs: rec {
- packages.foo = import ./simple.nix;
- defaultPackage = packages.foo;
+ packages.$system.foo = import ./simple.nix;
+ defaultPackage.$system = packages.$system.foo;
};
}
EOF
@@ -51,7 +51,7 @@ cat > $flake2Dir/flake.nix <<EOF
description = "Fnord";
outputs = { self, flake1 }: rec {
- packages.bar = flake1.packages.foo;
+ packages.$system.bar = flake1.packages.$system.foo;
};
}
EOF
@@ -66,10 +66,10 @@ cat > $flake3Dir/flake.nix <<EOF
description = "Fnord";
outputs = { self, flake2 }: rec {
- packages.xyzzy = flake2.packages.bar;
+ packages.$system.xyzzy = flake2.packages.$system.bar;
checks = {
- xyzzy = packages.xyzzy;
+ xyzzy = packages.$system.xyzzy;
};
};
}
@@ -182,8 +182,8 @@ cat > $flake3Dir/flake.nix <<EOF
description = "Fnord";
outputs = { self, flake1, flake2 }: rec {
- packages.xyzzy = flake2.packages.bar;
- packages."sth sth" = flake1.packages.foo;
+ packages.$system.xyzzy = flake2.packages.$system.bar;
+ packages.$system."sth sth" = flake1.packages.$system.foo;
};
}
EOF
@@ -242,9 +242,9 @@ cat > $flake3Dir/flake.nix <<EOF
description = "Fnord";
outputs = inputs: rec {
- packages.xyzzy = inputs.flake2.packages.bar;
- packages.sth = inputs.flake1.packages.foo;
- packages.fnord =
+ packages.$system.xyzzy = inputs.flake2.packages.$system.bar;
+ packages.$system.sth = inputs.flake1.packages.$system.foo;
+ packages.$system.fnord =
with import ./config.nix;
mkDerivation {
inherit system;
@@ -307,8 +307,8 @@ cat > $flake3Dir/flake.nix <<EOF
description = "Fnord";
outputs = { self, flake1, flake2, nonFlake }: rec {
- packages.sth = flake1.packages.foo;
- packages.fnord =
+ packages.$system.sth = flake1.packages.$system.foo;
+ packages.$system.fnord =
with import ./config.nix;
mkDerivation {
inherit system;