summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-04-29 19:51:26 +0800
committerGitHub <[email protected]>2021-04-29 19:51:26 +0800
commit495ca8241a0bf6e8b8972ddfe637bf4fce7a58f2 (patch)
treeb4af2182262601b6e05435821ace3c59b87c9c63
parent7bfe1e61d4ee3f8b2878b1a442a75614a8d9ca9e (diff)
parentcfc555e02394b84301f3396ec3eca4813edbad4c (diff)
Merge pull request #1372 from xq114/dev
improve environment management on cmd
-rw-r--r--scripts/xrepo-hook.psm18
-rwxr-xr-xscripts/xrepo.bat58
-rw-r--r--xmake/modules/private/xrepo/action/env.lua27
3 files changed, 86 insertions, 7 deletions
diff --git a/scripts/xrepo-hook.psm1 b/scripts/xrepo-hook.psm1
index ca63fb09b..22a726b97 100644
--- a/scripts/xrepo-hook.psm1
+++ b/scripts/xrepo-hook.psm1
@@ -15,6 +15,10 @@ function Enter-XrepoEnvironment {
begin {
$script:xrepoOldEnvs = (Get-ChildItem -Path Env:);
$xrepoPrompt = (& $Env:XMAKE_EXE lua private.xrepo.action.env.info prompt | Out-String);
+ if (-not $?) {
+ Write-Host $xrepoPrompt
+ Exit 1
+ }
$activateCommand = (& $Env:XMAKE_EXE lua private.xrepo.action.env.info script.powershell | Out-String);
Write-Verbose "[xrepo env script.powershell]`n$activateCommand";
@@ -39,7 +43,9 @@ function Exit-XrepoEnvironment {
param();
begin {
- # Write-Host $script:xrepoOldEnvs;
+ ForEach ($p in (Get-ChildItem Env:)) {
+ [Environment]::SetEnvironmentVariable($p.Name, $Null);
+ }
ForEach ($p in $script:xrepoOldEnvs) {
[Environment]::SetEnvironmentVariable($p.Name, $p.Value);
}
diff --git a/scripts/xrepo.bat b/scripts/xrepo.bat
index ff95b722a..c59fd53d9 100755
--- a/scripts/xrepo.bat
+++ b/scripts/xrepo.bat
@@ -1,2 +1,58 @@
@echo off
-xmake lua private.xrepo %*
+
+@set "XMAKE_EXE=%~dp0xmake.exe"
+@if [%1]==[env] (
+ if [%2]==[quit] (
+ if defined XMAKE_PROMPT_BACKUP (
+ call %XMAKE_ENV_BACKUP%
+ setlocal EnableDelayedExpansion
+ if !errorlevel! neq 0 exit /B !errorlevel!
+ endlocal
+ set PROMPT=%XMAKE_PROMPT_BACKUP%
+ set XMAKE_ENV_BACKUP=
+ set XMAKE_PROMPT_BACKUP=
+ )
+ goto :ENDXREPO
+ )
+ if [%2]==[shell] (
+ if defined XMAKE_PROMPT_BACKUP (
+ call %XMAKE_ENV_BACKUP%
+ setlocal EnableDelayedExpansion
+ if !errorlevel! neq 0 exit /B !errorlevel!
+ @%XMAKE_EXE% lua private.xrepo.action.env.info prompt 1>nul
+ if !errorlevel! neq 0 (
+ echo error: xmake.lua not found^^!
+ exit /B !errorlevel!
+ )
+ endlocal
+ set PROMPT=%XMAKE_PROMPT_BACKUP%
+ set XMAKE_ENV_BACKUP=
+ set XMAKE_PROMPT_BACKUP=
+ echo Please rerun `xrepo env shell` to enter the environment.
+ exit /B 1
+ ) else (
+ setlocal EnableDelayedExpansion
+ @%XMAKE_EXE% lua private.xrepo.action.env.info prompt 1>nul
+ if !errorlevel! neq 0 (
+ echo error: xmake.lua not found^^!
+ exit /B !errorlevel!
+ )
+ endlocal
+ for /f %%i in ('@%XMAKE_EXE% lua private.xrepo.action.env.info prompt') do @set "PROMPT=%%i %PROMPT%"
+ set XMAKE_PROMPT_BACKUP=%PROMPT%
+ )
+ for /f %%i in ('@%XMAKE_EXE% lua private.xrepo.action.env.info envfile') do @(
+ set "XMAKE_ENV_BACKUP=%%i.bat"
+ @"%XMAKE_EXE%" lua private.xrepo.action.env.info backup.cmd 1>"%%i.bat"
+ )
+ for /f %%i in ('@%XMAKE_EXE% lua private.xrepo.action.env.info envfile') do @(
+ @"%XMAKE_EXE%" lua private.xrepo.action.env.info script.cmd 1>"%%i.bat"
+ call "%%i.bat"
+ )
+ goto :ENDXREPO
+ )
+)
+
+@call %XMAKE_EXE% lua private.xrepo %*
+
+:ENDXREPO
diff --git a/xmake/modules/private/xrepo/action/env.lua b/xmake/modules/private/xrepo/action/env.lua
index da573ffca..8703a726c 100644
--- a/xmake/modules/private/xrepo/action/env.lua
+++ b/xmake/modules/private/xrepo/action/env.lua
@@ -234,19 +234,27 @@ function _package_getenvs()
end
-- get environment setting script
-function _get_env_script(envs, shell)
+function _get_env_script(envs, shell, del)
local prefix = ""
local connector = "="
local suffix = ""
+ local default = ""
if shell == "powershell" or shell == "pwsh" then
prefix = "[Environment]::SetEnvironmentVariable('"
connector = "','"
suffix = "')"
+ default = "$Null"
+ elseif shell == "cmd" then
+ prefix = "@set \""
+ suffix = "\""
end
local ret = ""
- local modified = hashset.of("PATH", "LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH", "ACLOCAL_PATH", "PKG_CONFIG_PATH", "CMAKE_PREFIX_PATH")
- for name, value in pairs(envs) do
- if modified:has(name) then
+ if del then
+ for name, _ in pairs(envs) do
+ ret = ret .. prefix .. name .. connector .. default .. suffix .. "\n"
+ end
+ else
+ for name, value in pairs(envs) do
ret = ret .. prefix .. name .. connector .. value .. suffix .. "\n"
end
end
@@ -256,10 +264,19 @@ end
-- get information of current virtual environment
function info(key)
if key == "prompt" then
+ assert(os.isfile(os.projectfile()), "xmake.lua not found!")
print("[%s]", path.filename(os.projectdir()))
+ elseif key == "envfile" then
+ print(os.tmpfile())
elseif key:startswith("script.") then
local shell = key:match("script%.(.+)")
- print(_get_env_script(envs, shell))
+ print(_get_env_script(_package_getenvs(), shell, false))
+ elseif key:startswith("backup.") then
+ local shell = key:match("backup%.(.+)")
+
+ -- remove current environment variables first
+ print(_get_env_script(_package_getenvs(), shell, true))
+ print(_get_env_script(os.getenvs(), shell, false))
end
end