From 13b88deacc54b60a383ea9c3e3862851d533a042 Mon Sep 17 00:00:00 2001 From: xq114 <1140735506@qq.com> Date: Wed, 28 Apr 2021 00:13:22 +0800 Subject: improve environment management on powershell --- scripts/installer.nsi | 1 + scripts/xrepo-hook.psm1 | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ scripts/xrepo.ps1 | 34 +++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 scripts/xrepo-hook.psm1 create mode 100644 scripts/xrepo.ps1 (limited to 'scripts') diff --git a/scripts/installer.nsi b/scripts/installer.nsi index 4f12aebea..a01b6feea 100644 --- a/scripts/installer.nsi +++ b/scripts/installer.nsi @@ -237,6 +237,7 @@ Section "XMake (required)" InstallExeutable File "..\*.md" File "..\core\build\xmake.exe" File "..\scripts\xrepo.bat" + File "..\scripts\xrepo.ps1" File /r /x ".DS_Store" "..\winenv" WriteUninstaller "uninstall.exe" diff --git a/scripts/xrepo-hook.psm1 b/scripts/xrepo-hook.psm1 new file mode 100644 index 000000000..e0a872823 --- /dev/null +++ b/scripts/xrepo-hook.psm1 @@ -0,0 +1,90 @@ + +## ENVIRONMENT MANAGEMENT ###################################################### + +<# + .SYNOPSIS + Activates a xrepo environment based on your current project. + + .EXAMPLE + Enter-XrepoEnvironment +#> +function Enter-XrepoEnvironment { + [CmdletBinding()] + param(); + + begin { + $script:xrepoOldEnvs = (Get-ChildItem -Path Env:); + $xrepoPrompt = (& $Env:XMAKE_EXE lua private.xrepo env --info prompt | Out-String); + $activateCommand = (& $Env:XMAKE_EXE lua private.xrepo env --info script.powershell | Out-String); + + Write-Verbose "[xrepo env script.powershell]`n$activateCommand"; + Invoke-Expression -Command $activateCommand; + + $Env:XMAKE_PROMPT_MODIFIER = $xrepoPrompt.Trim() + " "; + } + process {} + end {} +} + + +<# + .SYNOPSIS + Deactivates the current xrepo environment, if any. + + .EXAMPLE + Exit-XrepoEnvironment +#> +function Exit-XrepoEnvironment { + [CmdletBinding()] + param(); + + begin { + # Write-Host $script:xrepoOldEnvs; + ForEach ($p in $script:xrepoOldEnvs) { + [Environment]::SetEnvironmentVariable($p.Name, $p.Value); + } + $Env:XMAKE_PROMPT_MODIFIER = ""; + } + process {} + end {} +} + + +if (Test-Path Function:\prompt) { + Rename-Item Function:\prompt XrepoPromptBackup +} else { + function XrepoPromptBackup() { + # Restore a basic prompt if the definition is missing. + "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "; + } +} + + +<# + .SYNOPSIS + Modifies the current prompt to show the current xmake project. + + .EXAMPLE + Add-XrepoEnvironmentToPrompt + + Causes the current session's prompt to display the current xmake project name. +#> +function Add-XrepoEnvironmentToPrompt() { + function global:prompt() { + if ($Env:XMAKE_PROMPT_MODIFIER) { + $Env:XMAKE_PROMPT_MODIFIER | Write-Host -NoNewline + } + XrepoPromptBackup; + } +} + + +## EXPORTS ################################################################### + +Export-ModuleMember ` + -Alias * ` + -Function ` + Add-XrepoEnvironmentToPrompt, ` + Enter-XrepoEnvironment, ` + Exit-XrepoEnvironment, ` + prompt diff --git a/scripts/xrepo.ps1 b/scripts/xrepo.ps1 new file mode 100644 index 000000000..d0d3c851e --- /dev/null +++ b/scripts/xrepo.ps1 @@ -0,0 +1,34 @@ +$script:SCRIPT_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path $SCRIPT_PATH -Parent +$Env:XMAKE_EXE = Join-Path $BASE_DIR xmake.exe + + +if ($Args.Count -eq 0) { + # No args, just call the underlying conda executable. + & $Env:XMAKE_EXE lua private.xrepo; +} else { + $Command = $Args[0]; + if (($Command -eq "env") -and ($Args.Count -ge 2)) { + switch ($Args[1]) { + "shell" { + if (-not (Test-Path 'Env:XMAKE_ROOT')) { + $Env:XMAKE_ROOT = $BASE_DIR; + Import-Module "$Env:XMAKE_ROOT\scripts\xrepo-hook.psm1"; + Add-XrepoEnvironmentToPrompt; + } + if ((Test-Path 'Env:XMAKE_PROMPT_MODIFIER') -and ($Env:XMAKE_PROMPT_MODIFIER -ne "")) { + Exit-XrepoEnvironment; + } + Enter-XrepoEnvironment; + return; + } + "deactivate" { + Exit-XrepoEnvironment; + return; + } + } + } + + $OtherArgs = @(); + & $Env:XMAKE_EXE lua private.xrepo $Command @OtherArgs; +} -- cgit v1.3.1 From e98ca4f7d28c12fc1cfead20fd774e30eb7ff52a Mon Sep 17 00:00:00 2001 From: xq114 <1140735506@qq.com> Date: Wed, 28 Apr 2021 14:13:38 +0800 Subject: improve environment --- scripts/xrepo-hook.psm1 | 8 ++++---- scripts/xrepo.ps1 | 8 ++++---- xmake/modules/private/xrepo/action/env.lua | 24 +++++++++++------------- 3 files changed, 19 insertions(+), 21 deletions(-) (limited to 'scripts') diff --git a/scripts/xrepo-hook.psm1 b/scripts/xrepo-hook.psm1 index e0a872823..ca63fb09b 100644 --- a/scripts/xrepo-hook.psm1 +++ b/scripts/xrepo-hook.psm1 @@ -3,7 +3,7 @@ <# .SYNOPSIS - Activates a xrepo environment based on your current project. + Enter a xrepo environment based on your current project. .EXAMPLE Enter-XrepoEnvironment @@ -14,8 +14,8 @@ function Enter-XrepoEnvironment { begin { $script:xrepoOldEnvs = (Get-ChildItem -Path Env:); - $xrepoPrompt = (& $Env:XMAKE_EXE lua private.xrepo env --info prompt | Out-String); - $activateCommand = (& $Env:XMAKE_EXE lua private.xrepo env --info script.powershell | Out-String); + $xrepoPrompt = (& $Env:XMAKE_EXE lua private.xrepo.action.env.info prompt | Out-String); + $activateCommand = (& $Env:XMAKE_EXE lua private.xrepo.action.env.info script.powershell | Out-String); Write-Verbose "[xrepo env script.powershell]`n$activateCommand"; Invoke-Expression -Command $activateCommand; @@ -29,7 +29,7 @@ function Enter-XrepoEnvironment { <# .SYNOPSIS - Deactivates the current xrepo environment, if any. + Exit the current xrepo environment, if any. .EXAMPLE Exit-XrepoEnvironment diff --git a/scripts/xrepo.ps1 b/scripts/xrepo.ps1 index d0d3c851e..84bb4f000 100644 --- a/scripts/xrepo.ps1 +++ b/scripts/xrepo.ps1 @@ -11,9 +11,9 @@ if ($Args.Count -eq 0) { if (($Command -eq "env") -and ($Args.Count -ge 2)) { switch ($Args[1]) { "shell" { - if (-not (Test-Path 'Env:XMAKE_ROOT')) { - $Env:XMAKE_ROOT = $BASE_DIR; - Import-Module "$Env:XMAKE_ROOT\scripts\xrepo-hook.psm1"; + if (-not (Test-Path 'Env:XMAKE_ROOTDIR')) { + $Env:XMAKE_ROOTDIR = $BASE_DIR; + Import-Module "$Env:XMAKE_ROOTDIR\scripts\xrepo-hook.psm1"; Add-XrepoEnvironmentToPrompt; } if ((Test-Path 'Env:XMAKE_PROMPT_MODIFIER') -and ($Env:XMAKE_PROMPT_MODIFIER -ne "")) { @@ -22,7 +22,7 @@ if ($Args.Count -eq 0) { Enter-XrepoEnvironment; return; } - "deactivate" { + "quit" { Exit-XrepoEnvironment; return; } diff --git a/xmake/modules/private/xrepo/action/env.lua b/xmake/modules/private/xrepo/action/env.lua index 59822420c..da573ffca 100644 --- a/xmake/modules/private/xrepo/action/env.lua +++ b/xmake/modules/private/xrepo/action/env.lua @@ -53,7 +53,6 @@ function menu_options() " - xrepo env -b \"llvm 11.x\" bash", " $ clang --version", " - xrepo env -p android -b \"zlib,luajit 2.x\" luajit xx.lua"}, - {nil, "info", "k", nil, "Get the information of the virtual environment."}, {}, {nil, "program", "v", nil, "Set the program name to be run", "e.g.", @@ -254,6 +253,16 @@ function _get_env_script(envs, shell) return ret end +-- get information of current virtual environment +function info(key) + if key == "prompt" then + print("[%s]", path.filename(os.projectdir())) + elseif key:startswith("script.") then + local shell = key:match("script%.(.+)") + print(_get_env_script(envs, shell)) + end +end + -- run shell function _run_shell(envs) local shell = os.shell() @@ -284,18 +293,7 @@ end function main() local envs = _package_getenvs() local program = option.get("program") - if option.get("info") then - if program then - if program == "prompt" then - print(format("[%s]", path.filename(os.projectdir()))) - elseif program:startswith("script.") then - local shell = program:match("script%.(.+)") - print(_get_env_script(envs, shell)) - end - else - return - end - elseif program and not option.get("show") then + if program and not option.get("show") then if envs and envs.PATH then os.setenv("PATH", envs.PATH) end -- cgit v1.3.1