mirror of
https://github.com/nix-community/naersk
synced 2024-11-13 23:47:08 +00:00
120 lines
4.2 KiB
Nix
120 lines
4.2 KiB
Nix
{ lib, libb, builtinz, arg }:
|
|
let
|
|
argIsAttrs =
|
|
if lib.isDerivation arg then false
|
|
else if lib.isString arg then false
|
|
else if builtins.typeOf arg == "path" then false
|
|
else if builtins.hasAttr "outPath" arg then false
|
|
else true;
|
|
|
|
attrs = if argIsAttrs then arg else
|
|
{ src = if builtins.typeOf arg == "path" then lib.cleanSource arg else arg; };
|
|
usePureFromTOML = attrs.usePureFromTOML or true;
|
|
readTOML = builtinz.readTOML usePureFromTOML;
|
|
|
|
# config used during build the prebuild and the final build
|
|
buildConfig =
|
|
{
|
|
compressTarget = attrs.compressTarget or true;
|
|
doCheck = attrs.doCheck or true;
|
|
buildInputs = attrs.buildInputs or [];
|
|
removeReferencesToSrcFromDocs = attrs.removeReferencesToSrcFromDocs or true;
|
|
doDoc = attrs.doDoc or true;
|
|
#| Whether or not the rustdoc can fail the build
|
|
doDocFail = attrs.doDocFail or false;
|
|
|
|
release = attrs.release or true;
|
|
|
|
override = attrs.override or (x: x);
|
|
|
|
cargoBuild = attrs.cargoBuild or ''
|
|
cargo build "''${cargo_release}" -j $NIX_BUILD_CORES -Z unstable-options --out-dir out
|
|
'';
|
|
|
|
# The list of _all_ crates (incl. transitive dependencies) with name,
|
|
# version and sha256 of the crate
|
|
# Example:
|
|
# [ { name = "wabt", version = "2.0.6", sha256 = "..." } ]
|
|
crateDependencies = libb.mkVersions buildPlanConfig.cargolock;
|
|
};
|
|
|
|
# config used when planning the builds
|
|
buildPlanConfig = rec
|
|
{ inherit (attrs) src;
|
|
# Whether we skip pre-building the deps
|
|
isSingleStep = attrs.singleStep or false;
|
|
|
|
# The members we want to build
|
|
# (list of directory names)
|
|
wantedMembers =
|
|
lib.mapAttrsToList (member: _cargotoml: member) wantedMemberCargotomls;
|
|
|
|
# Member path to cargotoml
|
|
# (attrset from directory name to Nix object)
|
|
wantedMemberCargotomls =
|
|
let pred =
|
|
if ! isWorkspace
|
|
then (_member: _cargotoml: true)
|
|
else
|
|
if builtins.hasAttr "targets" attrs
|
|
then (_member: cargotoml: lib.elem cargotoml.package.name attrs.targets)
|
|
else (member: _cargotoml: member != "."); in
|
|
lib.filterAttrs pred cargotomls;
|
|
|
|
# All cargotomls, from path to nix object
|
|
# (attrset from directory name to Nix object)
|
|
cargotomls =
|
|
let readTOML = builtinz.readTOML usePureFromTOML; in
|
|
|
|
{ "." = toplevelCargotoml; } //
|
|
lib.optionalAttrs isWorkspace
|
|
(lib.listToAttrs
|
|
(map
|
|
(member:
|
|
{ name = member;
|
|
value = readTOML (src + "/${member}/Cargo.toml");
|
|
}
|
|
)
|
|
(toplevelCargotoml.workspace.members or [])
|
|
)
|
|
);
|
|
|
|
patchedSources =
|
|
let
|
|
mkRelative = po:
|
|
if lib.hasPrefix "/" po.path
|
|
then throw "'${toString src}/Cargo.toml' contains the absolute path '${toString po.path}' which is not allowed under a [patch] section by naersk. Please make it relative to '${toString src}'"
|
|
else src + "/" + po.path;
|
|
in lib.optionals (builtins.hasAttr "patch" toplevelCargotoml)
|
|
(map mkRelative
|
|
(lib.collect (as: lib.isAttrs as && builtins.hasAttr "path" as)
|
|
toplevelCargotoml.patch));
|
|
|
|
# Are we building a workspace (or is this a simple crate) ?
|
|
isWorkspace = builtins.hasAttr "workspace" toplevelCargotoml;
|
|
|
|
# The top level Cargo.toml, either a workspace or package
|
|
toplevelCargotoml = readTOML (src + "/Cargo.toml");
|
|
|
|
# The cargo lock
|
|
cargolock = readTOML (src + "/Cargo.lock");
|
|
|
|
packageName = attrs.name or toplevelCargotoml.package.name or
|
|
(if isWorkspace then "rust-workspace" else "rust-package");
|
|
|
|
packageVersion = attrs.version or toplevelCargotoml.package.version or
|
|
"unknown";
|
|
|
|
cargoTestCommands = attrs.cargoTestCommands or [
|
|
''cargo test "''${cargo_release}" -j $NIX_BUILD_CORES''
|
|
];
|
|
|
|
#| Whether or not to forward intermediate build artifacts to $out
|
|
copyTarget = attrs.copyTarget or false;
|
|
|
|
copyBins = attrs.copyBins or true;
|
|
|
|
copyDocsToSeparateOutput = attrs.copyDocsToSeparateOutput or true;
|
|
|
|
};
|
|
in buildPlanConfig // { inherit buildConfig ; }
|