57 lines
1.7 KiB
Nix
57 lines
1.7 KiB
Nix
|
{ lib, fetchgit, formats }:
|
||
|
with lib;
|
||
|
let
|
||
|
json = formats.json { };
|
||
|
in rec {
|
||
|
|
||
|
# Derive a pin file from workspace state.
|
||
|
mkPinFile = workspaceState:
|
||
|
assert workspaceState.version == 5;
|
||
|
json.generate "Package.resolved" {
|
||
|
version = 1;
|
||
|
object.pins = map (dep: {
|
||
|
package = dep.packageRef.name;
|
||
|
repositoryURL = dep.packageRef.location;
|
||
|
state = dep.state.checkoutState;
|
||
|
}) workspaceState.object.dependencies;
|
||
|
};
|
||
|
|
||
|
# Make packaging helpers from swiftpm2nix generated output.
|
||
|
helpers = generated: let
|
||
|
inherit (import generated) workspaceStateFile hashes;
|
||
|
workspaceState = builtins.fromJSON (builtins.readFile workspaceStateFile);
|
||
|
pinFile = mkPinFile workspaceState;
|
||
|
in rec {
|
||
|
|
||
|
# Create fetch expressions for dependencies.
|
||
|
sources = listToAttrs (
|
||
|
map (dep: nameValuePair dep.subpath (fetchgit {
|
||
|
url = dep.packageRef.location;
|
||
|
rev = dep.state.checkoutState.revision;
|
||
|
sha256 = hashes.${dep.subpath};
|
||
|
})) workspaceState.object.dependencies
|
||
|
);
|
||
|
|
||
|
# Configure phase snippet for use in packaging.
|
||
|
configure = ''
|
||
|
mkdir -p .build/checkouts
|
||
|
ln -sf ${pinFile} ./Package.resolved
|
||
|
install -m 0600 ${workspaceStateFile} ./.build/workspace-state.json
|
||
|
''
|
||
|
+ concatStrings (mapAttrsToList (name: src: ''
|
||
|
ln -s '${src}' '.build/checkouts/${name}'
|
||
|
'') sources)
|
||
|
+ ''
|
||
|
# Helper that makes a swiftpm dependency mutable by copying the source.
|
||
|
swiftpmMakeMutable() {
|
||
|
local orig="$(readlink .build/checkouts/$1)"
|
||
|
rm .build/checkouts/$1
|
||
|
cp -r "$orig" .build/checkouts/$1
|
||
|
chmod -R u+w .build/checkouts/$1
|
||
|
}
|
||
|
'';
|
||
|
|
||
|
};
|
||
|
|
||
|
}
|