133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PowerShell
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PowerShell
		
	
	
	
	
	
| 
								 | 
							
								#  Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
							 | 
						||
| 
								 | 
							
								#  Spack Project Developers. See the top-level COPYRIGHT file for details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#  SPDX-License-Identifier: (Apache-2.0 OR MIT)
							 | 
						||
| 
								 | 
							
								# #######################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Compare-CommonArgs {
							 | 
						||
| 
								 | 
							
								    $CMDArgs = $args[0]
							 | 
						||
| 
								 | 
							
								    # These aruments take precedence and call for no futher parsing of arguments
							 | 
						||
| 
								 | 
							
								    # invoke actual Spack entrypoint with that context and exit after
							 | 
						||
| 
								 | 
							
								    "--help", "-h", "--version", "-V" | ForEach-Object {
							 | 
						||
| 
								 | 
							
								        $arg_opt = $_
							 | 
						||
| 
								 | 
							
								        if(($CMDArgs) -and ([bool]($CMDArgs.Where({$_ -eq $arg_opt})))) {
							 | 
						||
| 
								 | 
							
								            return $true
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return $false
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Read-SpackArgs {
							 | 
						||
| 
								 | 
							
								    $SpackCMD_params = @()
							 | 
						||
| 
								 | 
							
								    $SpackSubCommand = $NULL
							 | 
						||
| 
								 | 
							
								    $SpackSubCommandArgs = @()
							 | 
						||
| 
								 | 
							
								    $args_ = $args[0]
							 | 
						||
| 
								 | 
							
								    $args_ | ForEach-Object {
							 | 
						||
| 
								 | 
							
								        if (!$SpackSubCommand) {
							 | 
						||
| 
								 | 
							
								            if($_.SubString(0,1) -eq "-")
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                $SpackCMD_params += $_
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else{
							 | 
						||
| 
								 | 
							
								                $SpackSubCommand = $_
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else{
							 | 
						||
| 
								 | 
							
								            $SpackSubCommandArgs += $_
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return $SpackCMD_params, $SpackSubCommand, $SpackSubCommandArgs
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Invoke-SpackCD {
							 | 
						||
| 
								 | 
							
								    if (Compare-CommonArgs $SpackSubCommandArgs) {
							 | 
						||
| 
								 | 
							
								        python $Env:SPACK_ROOT/bin/spack cd -h
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        $LOC = $(python $Env:SPACK_ROOT/bin/spack location $SpackSubCommandArgs)
							 | 
						||
| 
								 | 
							
								        if (($NULL -ne $LOC)){
							 | 
						||
| 
								 | 
							
								            if ( Test-Path -Path $LOC){
							 | 
						||
| 
								 | 
							
								                Set-Location $LOC
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else{
							 | 
						||
| 
								 | 
							
								                exit 1
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            exit 1
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Invoke-SpackEnv {
							 | 
						||
| 
								 | 
							
								    if (Compare-CommonArgs $SpackSubCommandArgs[0]) {
							 | 
						||
| 
								 | 
							
								        python $Env:SPACK_ROOT/bin/spack env -h
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        $SubCommandSubCommand = $SpackSubCommandArgs[0]
							 | 
						||
| 
								 | 
							
								        $SubCommandSubCommandArgs = $SpackSubCommandArgs[1..$SpackSubCommandArgs.Count]
							 | 
						||
| 
								 | 
							
								        switch ($SubCommandSubCommand) {
							 | 
						||
| 
								 | 
							
								            "activate" {
							 | 
						||
| 
								 | 
							
								                if (Compare-CommonArgs $SubCommandSubCommandArgs) {
							 | 
						||
| 
								 | 
							
								                    python $Env:SPACK_ROOT/bin/spack env activate $SubCommandSubCommandArgs
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                elseif ([bool]($SubCommandSubCommandArgs.Where({$_ -eq "--pwsh"}))) {
							 | 
						||
| 
								 | 
							
								                    python $Env:SPACK_ROOT/bin/spack env activate $SubCommandSubCommandArgs
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                elseif (!$SubCommandSubCommandArgs) {
							 | 
						||
| 
								 | 
							
								                    python $Env:SPACK_ROOT/bin/spack env activate $SubCommandSubCommandArgs
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    $SpackEnv = $(python $Env:SPACK_ROOT/bin/spack $SpackCMD_params env activate "--pwsh" $SubCommandSubCommandArgs)
							 | 
						||
| 
								 | 
							
								                    $ExecutionContext.InvokeCommand($SpackEnv)
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            "deactivate" {
							 | 
						||
| 
								 | 
							
								                if ([bool]($SubCommandSubCommandArgs.Where({$_ -eq "--pwsh"}))) {
							 | 
						||
| 
								 | 
							
								                    python $Env:SPACK_ROOT/bin/spack env deactivate $SubCommandSubCommandArgs
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                elseif($SubCommandSubCommandArgs) {
							 | 
						||
| 
								 | 
							
								                    python $Env:SPACK_ROOT/bin/spack env deactivate -h
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    $SpackEnv = $(python $Env:SPACK_ROOT/bin/spack $SpackCMD_params env deactivate --pwsh)
							 | 
						||
| 
								 | 
							
								                    $ExecutionContext.InvokeCommand($SpackEnv)
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            default {python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs}
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Invoke-SpackLoad {
							 | 
						||
| 
								 | 
							
								    if (Compare-CommonArgs $SpackSubCommandArgs) {
							 | 
						||
| 
								 | 
							
								        python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    elseif ([bool]($SpackSubCommandArgs.Where({($_ -eq "--pwsh") -or ($_ -eq "--list")}))) {
							 | 
						||
| 
								 | 
							
								        python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        $SpackEnv = $(python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand "--pwsh" $SpackSubCommandArgs)
							 | 
						||
| 
								 | 
							
								        $ExecutionContext.InvokeCommand($SpackEnv)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$SpackCMD_params, $SpackSubCommand, $SpackSubCommandArgs = Read-SpackArgs $args
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Compare-CommonArgs $SpackCMD_params) {
							 | 
						||
| 
								 | 
							
								    python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs
							 | 
						||
| 
								 | 
							
								    exit $LASTEXITCODE
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Process Spack commands with special conditions
							 | 
						||
| 
								 | 
							
								# all other commands are piped directly to Spack
							 | 
						||
| 
								 | 
							
								switch($SpackSubCommand)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    "cd"     {Invoke-SpackCD}
							 | 
						||
| 
								 | 
							
								    "env"    {Invoke-SpackEnv}
							 | 
						||
| 
								 | 
							
								    "load"   {Invoke-SpackLoad}
							 | 
						||
| 
								 | 
							
								    "unload" {Invoke-SpackLoad}
							 | 
						||
| 
								 | 
							
								    default  {python $Env:SPACK_ROOT/bin/spack $SpackCMD_params $SpackSubCommand $SpackSubCommandArgs}
							 | 
						||
| 
								 | 
							
								}
							 |