evcc: 0.131.4 -> 0.131.5
[NixPkgs.git] / pkgs / by-name / vc / vcpkg-tool / package.nix
blobf21dfc76a69c5f9e10b6d4ce0092519069761095
1 { lib
2 , stdenv
3 , fetchFromGitHub
4 , runtimeShell
5 , cacert
6 , cmake
7 , cmakerc
8 , curl
9 , fmt
10 , git
11 , gzip
12 , meson
13 , ninja
14 , openssh
15 , python3
16 , unzip
17 , zip
18 , zstd
19 , runCommand
20 , writeText
21 , extraRuntimeDeps ? []
22 , doWrap ? true
24 stdenv.mkDerivation (finalAttrs: {
25   pname = "vcpkg-tool";
26   version = "2024-07-10";
28   src = fetchFromGitHub {
29     owner = "microsoft";
30     repo = "vcpkg-tool";
31     rev = finalAttrs.version;
32     hash = "sha256-P/ARKMfZdrfO+24rBrRm9k8tkBPSJJBqH509+iarNkw=";
33   };
35   nativeBuildInputs = [
36     cmake
37     ninja
38   ];
40   buildInputs = [
41     cmakerc
42     fmt
43   ];
45   patches = [
46     ./change-lock-location.patch
47     ./read-bundle-info-from-root.patch
48   ];
50   cmakeFlags = [
51     "-DVCPKG_DEPENDENCY_EXTERNAL_FMT=ON"
52     "-DVCPKG_DEPENDENCY_CMAKERC=ON"
53   ];
56   passAsFile = [ "vcpkgWrapper" ];
57   vcpkgWrapper = let
58     # These are the most common binaries used by vcpkg
59     # Extra binaries can be added through override when needed
60     runtimeDeps = [
61       cacert
62       cmake
63       curl
64       git
65       gzip
66       meson
67       ninja
68       openssh
69       python3
70       unzip
71       zip
72       zstd
73     ] ++ extraRuntimeDeps;
75     # Apart from adding the runtime dependencies to $PATH,
76     # the wrapper will also override these arguments by default.
77     # This is to ensure that the executable does not try to
78     # write to the nix store. If the user tries to set any of the
79     # arguments themself, the wrapper will detect that the
80     # arguments are present, and prefer the user-provided value.
81     #
82     # It is also possible to override the cli arguments by
83     # settings either of the nix-specific environment variables.
84     argsWithDefault = [
85       {
86         arg = "--downloads-root";
87         env = "NIX_VCPKG_DOWNLOADS_ROOT";
88         default = "$NIX_VCPKG_WRITABLE_PATH/downloads";
89       }
90       {
91         arg = "--x-buildtrees-root";
92         env = "NIX_VCPKG_BUILDTREES_ROOT";
93         default = "$NIX_VCPKG_WRITABLE_PATH/buildtrees";
94       }
95       {
96         arg = "--x-packages-root";
97         env = "NIX_VCPKG_PACKAGES_ROOT";
98         default = "$NIX_VCPKG_WRITABLE_PATH/packages";
99       }
100       {
101         arg = "--x-install-root";
102         env = "NIX_VCPKG_INSTALL_ROOT";
103         default = "$NIX_VCPKG_WRITABLE_PATH/installed";
104       }
105     ];
106   in ''
107     #!${runtimeShell}
109     get_vcpkg_path() {
110       if [[ -n $NIX_VCPKG_WRITABLE_PATH ]]; then
111           echo "$NIX_VCPKG_WRITABLE_PATH"
112       elif [[ -n $XDG_CACHE_HOME ]]; then
113           echo "$XDG_CACHE_HOME/vcpkg"
114       elif [[ -n $HOME ]]; then
115           echo "$HOME/.vcpkg/root"
116       elif [[ -n $TMP ]]; then
117           echo "$TMP"
118       else
119           echo "/tmp"
120       fi
121     }
123     NIX_VCPKG_WRITABLE_PATH=$(get_vcpkg_path)
125     ${lib.concatMapStringsSep "\n" ({ env, default, ... }: ''${env}=''${${env}-"${default}"}'') argsWithDefault}
127     export PATH="${lib.makeBinPath runtimeDeps}''${PATH:+":$PATH"}"
129     ARGS=( "$@" )
130     FINAL_NONMODIFIED_ARGS=()
132     for (( i=0; i<''${#ARGS[@]}; i++ ));
133     do
134       case "''${ARGS[i]%%=*}" in
135         ${let
136           f = { arg, env, ... }: ''
137             '${arg}')
138               ${env}="''${ARGS[i]#*=}"
139               if [ "''$${env}" = '${arg}' ]; then
140                 ${env}="''${ARGS[i+1]}"
141                 ((i++))
142               fi
143               ;;
144           '';
145         in lib.concatMapStringsSep "\n" f argsWithDefault}
146         *)
147           FINAL_NONMODIFIED_ARGS+=(''${ARGS[i]})
148           ;;
149       esac
150     done
152     if [ "''${NIX_VCPKG_DEBUG_PRINT_ENVVARS-'false'}" = 'true' ]; then
153       ${lib.concatMapStringsSep "\n" ({ env, ... }: "  " + ''echo "${env} = ''$${env}"'') argsWithDefault}
154       echo ""
155     fi
157     exec -a "$0" "${placeholder "out"}/bin/.vcpkg-wrapped" \
158     ${lib.concatMapStringsSep "\n" ({ arg, env, ... }: "  " + ''${arg}="''$${env}" \'') argsWithDefault}
159       "''${FINAL_NONMODIFIED_ARGS[@]}"
160   '';
162   postFixup = lib.optionalString doWrap ''
163     mv "$out/bin/vcpkg" "$out/bin/.vcpkg-wrapped"
164     install -Dm555 "$vcpkgWrapperPath" "$out/bin/vcpkg"
165   '';
167   passthru.tests = {
168     testWrapper = runCommand "vcpkg-tool-test-wrapper" { buildInputs = [ finalAttrs.finalPackage ];  } ''
169       export NIX_VCPKG_DEBUG_PRINT_ENVVARS=true
170       vcpkg --x-packages-root="test" --x-install-root="test2" contact > "$out"
172       cat "$out" | head -n 4 | diff - ${writeText "vcpkg-tool-test-wrapper-expected" ''
173         NIX_VCPKG_DOWNLOADS_ROOT = /homeless-shelter/.vcpkg/root/downloads
174         NIX_VCPKG_BUILDTREES_ROOT = /homeless-shelter/.vcpkg/root/buildtrees
175         NIX_VCPKG_PACKAGES_ROOT = test
176         NIX_VCPKG_INSTALL_ROOT = test2
177       ''}
178     '';
179   };
181   meta = {
182     description = "Components of microsoft/vcpkg's binary";
183     mainProgram = "vcpkg";
184     homepage = "https://github.com/microsoft/vcpkg-tool";
185     changelog = "https://github.com/microsoft/vcpkg-tool/releases/tag/${finalAttrs.src.rev}";
186     license = lib.licenses.mit;
187     maintainers = with lib.maintainers; [ guekka gracicot h7x4 ];
188     platforms = lib.platforms.all;
189   };