Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / development / tools / swiftpm2nix / support.nix
blob9b944a133daa73232eb9292db55e10d64a6f484b
1 { lib, fetchgit, formats }:
2 with lib;
3 let
4   json = formats.json { };
5 in rec {
7   # Derive a pin file from workspace state.
8   mkPinFile = workspaceState:
9     assert workspaceState.version >= 5 && workspaceState.version <= 6;
10     json.generate "Package.resolved" {
11       version = 1;
12       object.pins = map (dep: {
13         package = dep.packageRef.name;
14         repositoryURL = dep.packageRef.location;
15         state = dep.state.checkoutState;
16       }) workspaceState.object.dependencies;
17     };
19   # Make packaging helpers from swiftpm2nix generated output.
20   helpers = generated: let
21     inherit (import generated) workspaceStateFile hashes;
22     workspaceState = lib.importJSON workspaceStateFile;
23     pinFile = mkPinFile workspaceState;
24   in rec {
26     # Create fetch expressions for dependencies.
27     sources = listToAttrs (
28       map (dep: nameValuePair dep.subpath (fetchgit {
29         url = dep.packageRef.location;
30         rev = dep.state.checkoutState.revision;
31         sha256 = hashes.${dep.subpath};
32       })) workspaceState.object.dependencies
33     );
35     # Configure phase snippet for use in packaging.
36     configure = ''
37       mkdir -p .build/checkouts
38       ln -sf ${pinFile} ./Package.resolved
39       install -m 0600 ${workspaceStateFile} ./.build/workspace-state.json
40     ''
41       + concatStrings (mapAttrsToList (name: src: ''
42         ln -s '${src}' '.build/checkouts/${name}'
43       '') sources)
44       + ''
45         # Helper that makes a swiftpm dependency mutable by copying the source.
46         swiftpmMakeMutable() {
47           local orig="$(readlink .build/checkouts/$1)"
48           rm .build/checkouts/$1
49           cp -r "$orig" .build/checkouts/$1
50           chmod -R u+w .build/checkouts/$1
51         }
52       '';
54   };