From 8ebe7c7d47d9daab605590f198926d4838dfa1b1 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 30 Nov 2021 22:04:25 -0800 Subject: [PATCH] Add the bash script, remove broken reset command from other scripts. --- azure-pipelines/binary-signing.signproj | 3 + azure-pipelines/signing.yml | 9 +- include/vcpkg/base/system.process.h | 7 +- src/vcpkg/base/system.process.cpp | 122 ++++++++++++-------- src/vcpkg/configure-environment.cpp | 9 +- vcpkg-init/lock-versions.ps1 | 7 +- vcpkg-init/vcpkg-init | 147 ++++++++++++++++++++++++ vcpkg-init/vcpkg-init.ps1 | 49 +++----- 8 files changed, 266 insertions(+), 87 deletions(-) create mode 100644 vcpkg-init/vcpkg-init diff --git a/azure-pipelines/binary-signing.signproj b/azure-pipelines/binary-signing.signproj index 411ab8d29..fa4851e34 100644 --- a/azure-pipelines/binary-signing.signproj +++ b/azure-pipelines/binary-signing.signproj @@ -24,6 +24,9 @@ Microsoft400 + + LinuxSign + LinuxSign diff --git a/azure-pipelines/signing.yml b/azure-pipelines/signing.yml index 512bb5383..e299a1c81 100644 --- a/azure-pipelines/signing.yml +++ b/azure-pipelines/signing.yml @@ -16,6 +16,7 @@ parameters: - name: VcpkgBaseVersionOverride displayName: vcpkg Base Version (default is today's date in ISO 8601) type: string + default: variables: - ${{ if eq(parameters.VcpkgBaseVersionOverride, '') }}: @@ -135,7 +136,7 @@ jobs: inputs: pwsh: true filePath: vcpkg-init/mint-standalone-bundle.ps1 - arguments: '-DestinationTarballName "$(Build.BinariesDirectory)\vcpkg-standalone-bundle.tar.gz" -TempPath standalone-temp "$(Build.BinariesDirectory)\vcpkg-init.cmd" "$(Build.BinariesDirectory)\vcpkg-init.ps1"' + arguments: '-DestinationTarballName "$(Build.BinariesDirectory)\vcpkg-standalone-bundle.tar.gz" -TempPath standalone-temp "$(Build.BinariesDirectory)\vcpkg-init.cmd" "$(Build.BinariesDirectory)\vcpkg-init.ps1" "$(Build.BinariesDirectory)\vcpkg-init"' - script: npm pack displayName: Create vcpkg-ce Pack workingDirectory: $(Build.BinariesDirectory)/vcpkg-ce @@ -143,6 +144,7 @@ jobs: mkdir "$(Build.ArtifactStagingDirectory)\staging" move "$(Build.BinariesDirectory)\vcpkg-ce\vcpkg-ce-*.tgz" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-ce.tgz" move "$(Build.BinariesDirectory)\vcpkg-standalone-bundle.tar.gz" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-standalone-bundle.tar.gz" + move "$(Build.BinariesDirectory)\vcpkg-init" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init" move "$(Build.BinariesDirectory)\vcpkg-init.ps1" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.ps1" move "$(Build.BinariesDirectory)\vcpkg-init.cmd" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.cmd" displayName: 'Arrange Architecture-independent Files for Staging' @@ -334,11 +336,12 @@ jobs: inputs: artifactName: staging - task: CmdLine@2 - displayName: 'Move Linux Binaries to BinariesDirectory' + displayName: 'Copy Linux Binaries to BinariesDirectory' inputs: failOnStderr: true script: | mkdir "$(Build.BinariesDirectory)\build" + copy /Y "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init" "$(Build.BinariesDirectory)\vcpkg-init" copy /Y "$(Build.ArtifactStagingDirectory)\staging\vcpkg-glibc" "$(Build.BinariesDirectory)\vcpkg-glibc" copy /Y "$(Build.ArtifactStagingDirectory)\staging\vcpkg-muslc" "$(Build.BinariesDirectory)\vcpkg-muslc" - task: MSBuild@1 @@ -372,6 +375,7 @@ jobs: script: | mkdir "$(Build.ArtifactStagingDirectory)\drop" + move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.cmd" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init.cmd" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.ps1" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init.ps1" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-ce.tgz" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-ce.tgz" @@ -397,6 +401,7 @@ jobs: inputs: failOnStderr: true script: | + move "$(Build.BinariesDirectory)\vcpkg-init" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init.sig" move "$(Build.BinariesDirectory)\vcpkg-glibc" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-glibc.sig" move "$(Build.BinariesDirectory)\vcpkg-muslc" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-muslc.sig" # Do compliance checks. diff --git a/include/vcpkg/base/system.process.h b/include/vcpkg/base/system.process.h index cf98fe5f5..2c961385f 100644 --- a/include/vcpkg/base/system.process.h +++ b/include/vcpkg/base/system.process.h @@ -23,6 +23,8 @@ namespace vcpkg std::string s; }; + void append_escaped_quoted_string(std::string& target, StringView content); + struct Command { Command() = default; @@ -39,6 +41,7 @@ namespace vcpkg { buf.push_back(' '); } + buf.append(s.data(), s.size()); return *this; } @@ -92,7 +95,9 @@ namespace vcpkg { #if defined(_WIN32) std::wstring m_env_data; -#endif +#else // ^^^ _WIN32 // !_WIN32 vvv + std::string m_env_data; +#endif // ^^^ !_WIN32 }; const Environment& get_clean_environment(); diff --git a/src/vcpkg/base/system.process.cpp b/src/vcpkg/base/system.process.cpp index 9dca7362c..d97456d1b 100644 --- a/src/vcpkg/base/system.process.cpp +++ b/src/vcpkg/base/system.process.cpp @@ -24,6 +24,52 @@ namespace vcpkg { + void append_escaped_quoted_string(std::string& target, StringView content) + { + if (Strings::find_first_of(content, " \t\n\r\"\\,;&`^|'") != content.end()) + { + // TODO: improve this to properly handle all escaping +#if _WIN32 + // On Windows, `\`s before a double-quote must be doubled. Inner double-quotes must be escaped. + target.push_back('"'); + size_t n_slashes = 0; + for (auto ch : content) + { + if (ch == '\\') + { + ++n_slashes; + } + else if (ch == '"') + { + target.append(n_slashes + 1, '\\'); + n_slashes = 0; + } + else + { + n_slashes = 0; + } + target.push_back(ch); + } + target.append(n_slashes, '\\'); + target.push_back('"'); +#else + // On non-Windows, `\` is the escape character and always requires doubling. Inner double-quotes must be + // escaped. + target.push_back('"'); + for (auto ch : content) + { + if (ch == '\\' || ch == '"') target.push_back('\\'); + target.push_back(ch); + } + target.push_back('"'); +#endif + } + else + { + target.append(content.data(), content.size()); + } + } + static std::atomic g_subprocess_stats(0); #if defined(_WIN32) @@ -203,48 +249,7 @@ namespace vcpkg Command& Command::string_arg(StringView s) & { if (!buf.empty()) buf.push_back(' '); - if (Strings::find_first_of(s, " \t\n\r\"\\,;&`^|'") != s.end()) - { - // TODO: improve this to properly handle all escaping -#if _WIN32 - // On Windows, `\`s before a double-quote must be doubled. Inner double-quotes must be escaped. - buf.push_back('"'); - size_t n_slashes = 0; - for (auto ch : s) - { - if (ch == '\\') - { - ++n_slashes; - } - else if (ch == '"') - { - buf.append(n_slashes + 1, '\\'); - n_slashes = 0; - } - else - { - n_slashes = 0; - } - buf.push_back(ch); - } - buf.append(n_slashes, '\\'); - buf.push_back('"'); -#else - // On non-Windows, `\` is the escape character and always requires doubling. Inner double-quotes must be - // escaped. - buf.push_back('"'); - for (auto ch : s) - { - if (ch == '\\' || ch == '"') buf.push_back('\\'); - buf.push_back(ch); - } - buf.push_back('"'); -#endif - } - else - { - Strings::append(buf, s); - } + append_escaped_quoted_string(buf, s); return *this; } @@ -394,9 +399,20 @@ namespace vcpkg return {env_cstr}; } #else - Environment get_modified_clean_environment(const std::unordered_map&, StringView) + Environment get_modified_clean_environment(const std::unordered_map&, + StringView prepend_to_path) { - return {}; + std::string result; + if (!prepend_to_path.empty()) + { + std::string new_path = get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO); + new_path.insert(new_path.begin(), prepend_to_path.size() + 1, ':'); + std::copy_n(prepend_to_path.data(), prepend_to_path.size(), new_path.begin()); + result = "PATH="; + append_escaped_quoted_string(result, new_path); + } + + return {result}; } #endif const Environment& get_clean_environment() @@ -706,16 +722,22 @@ namespace vcpkg g_ctrl_c_state.transition_from_spawn_process(); #else (void)env; - std::string real_command_line; - if (wd.working_directory.empty()) + Command real_command_line_builder; + if (!wd.working_directory.empty()) { - real_command_line = cmd_line.command_line().to_string(); + real_command_line_builder.string_arg("cd"); + real_command_line_builder.path_arg(wd.working_directory); + real_command_line_builder.raw_arg("&&"); } - else + + if (!env.m_env_data.empty()) { - real_command_line = - Command("cd").path_arg(wd.working_directory).raw_arg("&&").raw_arg(cmd_line.command_line()).extract(); + real_command_line_builder.raw_arg(env.m_env_data); } + + real_command_line_builder.raw_arg(cmd_line.command_line()); + + std::string real_command_line = std::move(real_command_line_builder).extract(); Debug::print("system(", real_command_line, ")\n"); fflush(nullptr); diff --git a/src/vcpkg/configure-environment.cpp b/src/vcpkg/configure-environment.cpp index ef653f72c..cb08cf9a4 100644 --- a/src/vcpkg/configure-environment.cpp +++ b/src/vcpkg/configure-environment.cpp @@ -19,7 +19,7 @@ namespace vcpkg auto& fs = paths.get_filesystem(); auto& download_manager = paths.get_download_manager(); auto node_path = paths.get_tool_exe(Tools::NODE); - auto node_root = node_path.parent_path(); + Path node_root = node_path.parent_path(); auto node_modules = paths.root / "node_modules"; auto ce_path = node_modules / "vcpkg-ce"; if (!fs.is_directory(ce_path)) @@ -38,7 +38,12 @@ namespace vcpkg const auto ce_tarball = paths.downloads / "vcpkg-ce-latest.tgz"; download_manager.download_file(fs, ce_uri, ce_tarball, nullopt); #endif // ^^^ !VCPKG_CE_BUNDLE_SHA - auto npm_path = Path(node_root) / "node_modules" / "npm" / "bin" / "npm-cli.js"; + auto npm_path = node_root / "node_modules" / "npm" / "bin" / "npm-cli.js"; + if (!fs.exists(npm_path, VCPKG_LINE_INFO)) + { + npm_path = Path(node_root.parent_path()) / "lib" / "node_modules" / "npm" / "bin" / "npm-cli.js"; + } + Command cmd_provision(node_path); cmd_provision.string_arg(npm_path); cmd_provision.string_arg("--force"); diff --git a/vcpkg-init/lock-versions.ps1 b/vcpkg-init/lock-versions.ps1 index 2b86889a5..73c2830a0 100644 --- a/vcpkg-init/lock-versions.ps1 +++ b/vcpkg-init/lock-versions.ps1 @@ -8,6 +8,11 @@ Param( $versionUnlockedUri = "https://github.com/microsoft/vcpkg-tool/releases/latest/download/" $versionLockedUri = "https://github.com/microsoft/vcpkg-tool/releases/download/$VcpkgBaseVersion/" + $pwshInstaller = Get-Content "$PSScriptRoot\vcpkg-init.ps1" -Raw $pwshInstaller = $pwshInstaller.Replace($versionUnlockedUri, $versionLockedUri) -Set-Content -Path "$Destination\vcpkg-init.ps1" -Value $pwshInstaller +Set-Content -Path "$Destination\vcpkg-init.ps1" -Value $pwshInstaller -NoNewline + +$shInstaller = Get-Content "$PSScriptRoot\vcpkg-init" -Raw +$shInstaller = $shInstaller.Replace($versionUnlockedUri, $versionLockedUri) +Set-Content -Path "$Destination\vcpkg-init" -Value $shInstaller -NoNewline diff --git a/vcpkg-init/vcpkg-init b/vcpkg-init/vcpkg-init new file mode 100644 index 000000000..24f248a05 --- /dev/null +++ b/vcpkg-init/vcpkg-init @@ -0,0 +1,147 @@ +#!/bin/sh + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# wrapper script for vcpkg +# this is intended to be dot-sourced and then you can use the vcpkg() function. + +# check to see if we've been dot-sourced (should work for most POSIX shells) +sourced=0 + +if [ -n "$ZSH_EVAL_CONTEXT" ]; then + case $ZSH_EVAL_CONTEXT in *:file) sourced=1;; esac +elif [ -n "$KSH_VERSION" ]; then + [ "$(cd $(dirname -- $0) && pwd -P)/$(basename -- $0)" != "$(cd $(dirname -- ${.sh.file}) && pwd -P)/$(basename -- ${.sh.file})" ] && sourced=1 +elif [ -n "$BASH_VERSION" ]; then + (return 0 2>/dev/null) && sourced=1 +else # All other shells: examine $0 for known shell binary filenames + # Detects `sh` and `dash`; add additional shell filenames as needed. + case ${0##*/} in sh|dash) sourced=1;; esac +fi + +if [ $sourced -eq 0 ]; then + echo 'This script is expected to be dot-sourced so that it may load vcpkg into the' + echo 'current environment and not require permanent changes to the system when you activate.' + echo '' + echo "You should instead run '. $(basename $0)' first to import vcpkg into the current session." + exit +fi + +Z_VCPKG_init() { + # find important cmdline args + Z_VCPKG_ARGS=() + for each in "$@"; do case $each in + --remove-vcpkg) Z_VCPKG_REMOVE=TRUE;; + *) Z_VCPKG_ARGS+=("$each");; + esac ;done +} + +Z_VCPKG_bootstrap() { + if [ -f "${VCPKG_ROOT}/vcpkg" ]; then + return 0 + fi + + # it's not there! + # let's install it where we want it + + echo installing vcpkg in $VCPKG_ROOT + + if [ "$UNAME" = "Darwin" ]; then + curl -L -o "${VCPKG_ROOT}/vcpkg" https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-macos + elif [ -e /etc/alpine-release ]; then + curl -L -o "${VCPKG_ROOT}/vcpkg" https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-muslc + else + curl -L -o "${VCPKG_ROOT}/vcpkg" https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-glibc + fi + + if [ ! -f "${VCPKG_ROOT}/vcpkg" ]; then + echo "ERROR! Unable to find/get vcpkg binary ${VCPKG_ROOT}/vcpkg" + return 1; + fi + + chmod +x "${VCPKG_ROOT}/vcpkg" + "${VCPKG_ROOT}/vcpkg" z-bootstrap-standalone + return 0; +} + +Z_VCPKG_cleanup() { + # clear things that we're not going to need for the long term + unset Z_VCPKG_REMOVE + unset Z_VCPKG_ARGS + if [ -f "${Z_VCPKG_POSTSCRIPT}" ]; then + command rm "${Z_VCPKG_POSTSCRIPT}" + fi + unset Z_VCPKG_POSTSCRIPT + unset -f Z_VCPKG_bootstrap > /dev/null 2>&1 +} + +Z_VCPKG_remove() { + Z_VCPKG_cleanup + if [ -d "$VCPKG_ROOT" ]; then + rm -rf "$VCPKG_ROOT" + fi + + unset -f Z_VCPKG_init > /dev/null 2>&1 + unset -f Z_VCPKG_cleanup > /dev/null 2>&1 + unset -f Z_VCPKG_remove > /dev/null 2>&1 + unset -f vcpkg > /dev/null 2>&1 +} + +Z_VCPKG_init "$@" +shift $# + +if [ -n "$VCPKG_ROOT" ]; then + export VCPKG_ROOT=$VCPKG_ROOT +else + export VCPKG_ROOT=~/.vcpkg +fi; + +mkdir -p "$VCPKG_ROOT" + +if [ ! -z "$Z_VCPKG_REMOVE" ]; then + Z_VCPKG_remove + return +fi + + +Z_VCPKG_bootstrap +if [ $? -eq 1 ]; then + Z_VCPKG_cleanup + return 1; +fi + +# So, we're the real script then. +vcpkg() { + Z_VCPKG_init "$@" + + if [ ! -z "$Z_VCPKG_REMOVE" ]; then + Z_VCPKG_remove + return; + fi + + # set the response file + # Generate 32 bits of randomness, to avoid clashing with concurrent executions. + export Z_VCPKG_POSTSCRIPT="${VCPKG_ROOT}/VCPKG_tmp_$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" ").sh" + + # call vcpkg + # it picks up the Z_VCPKG_POSTSCRIPT environment variable to know where to dump the postscript + "${VCPKG_ROOT}/vcpkg" ${Z_VCPKG_ARGS[@]} + + # Call the post-invocation script if it is present, then delete it. + # This allows the invocation to potentially modify the caller's environment (e.g. PATH) + if [ -f "${Z_VCPKG_POSTSCRIPT}" ]; then + . "${Z_VCPKG_POSTSCRIPT}" + command rm "${Z_VCPKG_POSTSCRIPT}" + unset Z_VCPKG_POSTSCRIPT + fi + + Z_VCPKG_cleanup +} + +# did they dotsource and have args go ahead and run it then! +if [ -n "$Z_VCPKG_ARGS" ]; then + vcpkg "${Z_VCPKG_ARGS[@]}" +fi + +Z_VCPKG_cleanup diff --git a/vcpkg-init/vcpkg-init.ps1 b/vcpkg-init/vcpkg-init.ps1 index b7ee4d09b..d39a6c7ae 100644 --- a/vcpkg-init/vcpkg-init.ps1 +++ b/vcpkg-init/vcpkg-init.ps1 @@ -41,7 +41,7 @@ function z-vcpkg-debug() { function download($url, $path) { $wc = New-Object net.webclient - if( test-path -ea 0 $path) { + if( test-path -ea 0 $path ) { # check to see if the size is a match before downloading $s = $wc.OpenRead($url) $len = $wc.ResponseHeaders['Content-Length'] @@ -74,24 +74,13 @@ if( $ENV:VCPKG_ROOT ) { $VCPKG = "${VCPKG_ROOT}/vcpkg.exe" $SCRIPT:VCPKG_SCRIPT = "${VCPKG_ROOT}/vcpkg-init.ps1" -$reset = $args.IndexOf('--reset-vcpkg') -gt -1 $remove = $args.IndexOf('--remove-vcpkg') -gt -1 -if( $reset -or -$remove ) { - $args.remove('--reset-vcpkg'); - $args.remove('--remove-vcpkg'); - - if( $reset ) { - write-host "Resetting vcpkg" - } - +if( $remove ) { + write-host "Removing vcpkg" remove-item -recurse -force -ea 0 "$VCPKG_ROOT" $error.clear(); - - if( $remove ) { - write-host "Removing vcpkg" - exit - } + exit } function bootstrap-vcpkg { @@ -136,7 +125,7 @@ $shh = New-Module -name vcpkg -ArgumentList @($VCPKG,$VCPKG_ROOT) -ScriptBlock { } function vcpkg() { - if( ($args.indexOf('--remove-vcpkg') -gt -1) -or ($args.indexOf('--reset-vcpkg') -gt -1)) { + if( ($args.indexOf('--remove-vcpkg') -gt -1)) { # we really want to do call the ps1 script to do this. if( test-path "${VCPKG_ROOT}/vcpkg.ps1" ) { & "${VCPKG_ROOT}/vcpkg.ps1" @args @@ -190,11 +179,8 @@ if exist $null erase $null IF "%VCPKG_ROOT%"=="" SET VCPKG_ROOT=%USERPROFILE%\.vcpkg :: we're running vcpkg from the home folder -set VCPKG_CMD=%VCPKG_ROOT%\vcpkg-init.cmd -set VCPKG_EXE=%VCPKG_ROOT%\vcpkg.exe - -:: if we're being asked to reset the install, call bootstrap -if "%1" EQU "--reset-vcpkg" goto BOOTSTRAP +set Z_VCPKG_CMD=%VCPKG_ROOT%\vcpkg-init.cmd +set Z_VCPKG_EXE=%VCPKG_ROOT%\vcpkg.exe :: if we're being asked to remove the install, call bootstrap if "%1" EQU "--remove-vcpkg" ( @@ -204,13 +190,13 @@ if "%1" EQU "--remove-vcpkg" ( ) :: do we even have it installed? -if NOT exist "%VCPKG_CMD%" goto BOOTSTRAP +if NOT exist "%Z_VCPKG_CMD%" goto BOOTSTRAP :: if this is the actual installed vcpkg-ce, let's get to the invocation -if "%~dfp0" == "%VCPKG_CMD%" goto INVOKE +if "%~dfp0" == "%Z_VCPKG_CMD%" goto INVOKE :: this is not the 'right' vcpkg cmd, let's forward this on to that one. -call "%VCPKG_CMD%" %* +call "%Z_VCPKG_CMD%" %* set VCPKG_EXITCODE=%ERRORLEVEL% goto :eof @@ -220,9 +206,9 @@ SET /A Z_VCPKG_POSTSCRIPT=%RANDOM% * 32768 + %RANDOM% SET Z_VCPKG_POSTSCRIPT=%VCPKG_ROOT%\VCPKG_tmp_%Z_VCPKG_POSTSCRIPT%.cmd :: call the program -"%VCPKG_EXE%" %* +"%Z_VCPKG_EXE%" %* set VCPKG_EXITCODE=%ERRORLEVEL% -doskey vcpkg="%VCPKG_CMD%" $* +doskey vcpkg="%Z_VCPKG_CMD%" $* :POSTSCRIPT :: Call the post-invocation script if it is present, then delete it. @@ -237,13 +223,13 @@ goto :fin :: add the cmdline args to the environment so powershell can use them set /a i=0 & for %%a in (%*) do call :set %%a -set POWERSHELL_EXE= +set Z_POWERSHELL_EXE= for %%i in (pwsh.exe powershell.exe) do ( - if EXIST "%%~$PATH:i" set POWERSHELL_EXE=%%~$PATH:i & goto :gotpwsh + if EXIST "%%~$PATH:i" set Z_POWERSHELL_EXE=%%~$PATH:i & goto :gotpwsh ) :gotpwsh -"%POWERSHELL_EXE%" -noprofile -executionpolicy unrestricted -command "iex (get-content %~dfp0 -raw)#" && set REMOVE_VCPKG= +"%Z_POWERSHELL_EXE%" -noprofile -executionpolicy unrestricted -command "iex (get-content %~dfp0 -raw)#" && set REMOVE_VCPKG= set VCPKG_EXITCODE=%ERRORLEVEL% :: clear out the arguments @@ -258,9 +244,10 @@ if "%REMOVE_VCPKG%" EQU "TRUE" ( doskey vcpkg="%VCPKG_ROOT%\vcpkg-init.cmd" $* :fin +SET Z_POWERSHELL_EXE= SET Z_VCPKG_POSTSCRIPT= -SET VCPKG_CMD= -set VCPKG_EXE= +SET Z_VCPKG_CMD= +set Z_VCPKG_EXE= EXIT /B %VCPKG_EXITCODE% goto :eof