diff --git a/scripts/xtchain.ps1 b/scripts/xtchain.ps1 index 25c2c8d..96e1923 100644 --- a/scripts/xtchain.ps1 +++ b/scripts/xtchain.ps1 @@ -1,57 +1,156 @@ +# # PROJECT: XTchain # LICENSE: See the COPYING.md in the top level directory # FILE: scripts/xtchain.ps1 # DESCRIPTION: XTchain Entry Script # DEVELOPERS: Aiken Harris +# -# Get the absolute path to the XTchain -$XTCDIR = (Get-Item -Path ".\").FullName +[CmdletBinding()] +param( + [Parameter(Position = 0)] + [string]$TargetArchitecture = "amd64", + + [Parameter(Position = 1)] + [string]$SourceDirectory = $PWD.Path +) -# Read the XTchain version -$env:XTCVER = Get-Content "${XTCDIR}\Version" - -# Load the library (Make sure the xtclib.ps1 file is PowerShell compatible) -. "${XTCDIR}\lib\xtchain\xtclib.ps1" - -# Set the target architecture -$env:TARGET = $args[0] -if (-not $env:TARGET) { $env:TARGET = "amd64" } - -# Save the source directory -$SRCDIR = $args[1] -if (-not $SRCDIR) { $SRCDIR = (Get-Location).Path } - -# Make sure the compiler flags are clean -$env:HOST = $null -$env:CFLAGS = $null -$env:CXXFLAGS = $null -$env:LDFLAGS = $null - -# Update PATH -$env:PATH = "${XTCDIR}\bin;" + $env:PATH - -# Display banner -version - -# Invoke shell with fancy prompt -function global:prompt { - $PROMPT = " XT Toolchain " - $CWD = (Get-Location).Path - $CHEVRON = [char]0xE0B0 - $SEGMENTS = @( - @{ TEXT = $PROMPT; BGCOLOR = "Blue"; FGCOLOR = "White" }, - @{ TEXT = " $CWD "; BGCOLOR = "DarkCyan"; FGCOLOR = "White" } +# Initialize XTchain environment +function Initialize-XTChain { + [CmdletBinding()] + param( + [string]$Architecture, + [string]$SourcePath ) - for ($INDEX = 0; $INDEX -lt $SEGMENTS.Count; $INDEX++) { - $SEGMENT = $SEGMENTS[$INDEX] - $NEXTBG = if ($INDEX + 1 -lt $SEGMENTS.Count) { $SEGMENTS[$INDEX + 1].BGCOLOR } else { "Default" } - Write-Host $SEGMENT.TEXT -NoNewLine -ForegroundColor $SEGMENT.FGCOLOR -BackgroundColor $SEGMENT.BGCOLOR - if ($NEXTBG -ne "Default") { - Write-Host $CHEVRON -NoNewLine -ForegroundColor $SEGMENT.BGCOLOR -BackgroundColor $NEXTBG - } else { - Write-Host $CHEVRON -NoNewLine -ForegroundColor $SEGMENT.BGCOLOR + + # Get the absolute path to XTchain + $script:XTCDIR = (Get-Item -Path ".\").FullName + + # Read XTchain version + $versionFile = Join-Path $script:XTCDIR "Version" + if (Test-Path $versionFile) { + $env:XTCVER = Get-Content $versionFile -Raw | ForEach-Object { $_.Trim() } + } else { + Write-Warning "Version file not found at $versionFile" + $env:XTCVER = "Unknown" + } + + # Set XTchain directory environment variable + $env:XTCDIR = $script:XTCDIR + + # Import XTchain module + $modulePath = Join-Path $script:XTCDIR "lib\xtchain\xtclib.psm1" + if (Test-Path $modulePath) { + Import-Module $modulePath -Force -Global + } else { + Write-Error "XTchain module not found at $modulePath" + return $false + } + + # Set target architecture + $env:TARGET = $Architecture + + # Validate source directory + if (-not (Test-Path $SourcePath)) { + Write-Error "Source directory does not exist: $SourcePath" + return $false + } + + # Clean compiler environment variables + $env:HOST = $null + $env:CFLAGS = $null + $env:CXXFLAGS = $null + $env:LDFLAGS = $null + + # Update PATH to include XTchain binaries + $xtcBinPath = Join-Path $script:XTCDIR "bin" + if (Test-Path $xtcBinPath) { + $env:PATH = "$xtcBinPath;" + $env:PATH + } else { + Write-Warning "XTchain bin directory not found at $xtcBinPath" + } + + return $true +} + +# Create fancy PowerLine-style prompt +function Set-XTChainPrompt { + [CmdletBinding()] + param() + + function global:prompt { + try { + $promptText = " XT Toolchain " + $currentPath = (Get-Location).Path + $chevron = [char]0xE0B0 + + # Define prompt segments + $segments = @( + @{ + Text = $promptText + BackgroundColor = "Blue" + ForegroundColor = "White" + }, + @{ + Text = " $currentPath " + BackgroundColor = "DarkCyan" + ForegroundColor = "White" + } + ) + + # Render segments + for ($index = 0; $index -lt $segments.Count; $index++) { + $segment = $segments[$index] + $nextBackground = if ($index + 1 -lt $segments.Count) { + $segments[$index + 1].BackgroundColor + } else { + "Default" + } + + # Write segment text + Write-Host $segment.Text -NoNewLine -ForegroundColor $segment.ForegroundColor -BackgroundColor $segment.BackgroundColor + + # Write separator + if ($nextBackground -ne "Default") { + Write-Host $chevron -NoNewLine -ForegroundColor $segment.BackgroundColor -BackgroundColor $nextBackground + } else { + Write-Host $chevron -NoNewLine -ForegroundColor $segment.BackgroundColor + } + } + + return " " + } + catch { + # Fallback to simple prompt if PowerLine fails + return "XTC> " } } - return " " } -Set-Location -Path $SRCDIR + +# Main execution +try { + Write-Host "Initializing XTchain environment..." -ForegroundColor Green + + if (-not (Initialize-XTChain -Architecture $TargetArchitecture -SourcePath $SourceDirectory)) { + Write-Error "Failed to initialize XTchain environment" + exit 1 + } + + # Display version information + Show-XTCVersion + + # Set up the fancy prompt + Set-XTChainPrompt + + # Change to source directory + Set-Location -Path $SourceDirectory + + Write-Host "XTchain environment ready!" -ForegroundColor Green + Write-Host "Current directory: $(Get-Location)" -ForegroundColor Cyan + Write-Host "Target architecture: $env:TARGET" -ForegroundColor Cyan + Write-Host "Type 'Show-XTCHelp' or 'help' for available commands" -ForegroundColor Yellow +} +catch { + Write-Error "Failed to initialize XTchain: $_" + exit 1 +} \ No newline at end of file diff --git a/scripts/xtclib.ps1 b/scripts/xtclib.ps1 deleted file mode 100644 index 9386ed3..0000000 --- a/scripts/xtclib.ps1 +++ /dev/null @@ -1,143 +0,0 @@ -# PROJECT: XTchain -# LICENSE: See the COPYING.md in the top level directory -# FILE: scripts/xtclib.ps1 -# DESCRIPTION: XTchain library -# DEVELOPERS: Aiken Harris - - -# Prints XTChain banner -function banner { - param() - - $XTC_BANNER = "XT Toolchain v${Env:XTCVER} for Windows" - - Write-Host "################################################################################" - Write-Host - Write-Host (' ' * [math]::Floor((80 - $XTC_BANNER.Length) / 2) + $XTC_BANNER) -ForegroundColor Yellow - Write-Host - Write-Host "################################################################################" - Write-Host -} - -# Sets the target architecture -function charch { - param ( - [string]$arch - ) - - if ([string]::IsNullOrWhiteSpace($arch)) { - Write-Host "Syntax: charch [architecture]" - return - } - switch -Regex ($arch) { - "aarch64|arm64" { - $Env:TARGET = "aarch64" - } - "arm|armv7" { - $Env:TARGET = "armv7" - } - "i386|i486|i586|i686|x86" { - $Env:TARGET = "i686" - } - "amd64|x64|x86_64" { - $Env:TARGET = "amd64" - } - default { - $Env:TARGET = "UNKNOWN" - } - } - Write-Host "Target Architecture: $($Env:TARGET)" -} - -# Sets the build type -function chbuild { - param ( - [string]$buildType - ) - - if ([string]::IsNullOrWhiteSpace($buildType)) { - Write-Host "Syntax: chbuild [DEBUG|RELEASE]" - return - } - switch -Regex ($buildType.ToUpper()) { - "RELEASE" { - $Env:BUILD_TYPE = "RELEASE" - } - default { - $Env:BUILD_TYPE = "DEBUG" - } - } - Write-Host "Target build type: $($Env:BUILD_TYPE)" -} - -# Prints help -function help { - banner - Write-Host "XTChain defines an internal list of commands:" - Write-Host " * banner - prints XTChain banner" - Write-Host " * charch [arch] - sets the target CPU architecture [aarch64/armv7/i686/amd64]" - Write-Host " * chbuild [type] - sets build type [debug/release]" - Write-Host " * help - prints this message" - Write-Host " * version - prints XTChain and its components version" - Write-Host " * xbuild - builds an application with a Ninja build system" -} - -# Displays version banner -function version { - param() - - [bool]$XTCHAIN_EXTTOOLS = $false - - if ((Test-Path "${Env:XTCDIR}/bin/clang") -and - ((Get-Command clang).Source -eq "${Env:XTCDIR}/bin/clang") -and - ($Env:XTCVER -match "min")) { - $XTCHAIN_EXTTOOLS = $true - foreach ($TOOL in @("clang", "clang++", "cmake", "lld-link", "ninja")) { - if (!(Get-Command $TOOL -ErrorAction SilentlyContinue)) { - Write-Error "You are using minimal version of XTChain and '${TOOL}' has been not found in your system!" - Write-Error "Please install all required tools." - return - } - } - } - - banner - Write-Host - Write-Host "LLVM/Clang Compiler: $(clang --version | Select-String -Pattern "version (\d+\.\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command clang).Source))" - Write-Host "LLVM/LLD Linker: $(lld-link --version | Select-String -Pattern "(\d+\.\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command lld-link).Source))" - Write-Host "Wine IDL Compiler: $(widl -V | Select-String -Pattern "version (\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command widl).Source))" - Write-Host "Wine Message Compiler: $(wmc -V | Select-String -Pattern "version (\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command wmc).Source))" - Write-Host "Wine Resource Compiler: $(wrc --version | Select-String -Pattern "version (\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command wrc).Source))" - Write-Host "XT SPEC Compiler: $(xtcspecc --help | Select-String -Pattern "Version (\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command xtcspecc).Source))" - Write-Host "CMake Build System: $(cmake --version | Select-String -Pattern "version (\d+\.\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }) ($($(Get-Command cmake).Source))" - Write-Host "Ninja Build System: $(ninja --version) ($($(Get-Command ninja).Source))" - Write-Host - - $BUILD_TYPE = if ($null -eq $env:BUILD_TYPE -or $env:BUILD_TYPE -eq '') { 'DEBUG' } else { $env:BUILD_TYPE } - $TARGET = if ($null -eq $env:TARGET -or $env:TARGET -eq '') { 'amd64' } else { $env:TARGET } - charch $TARGET - chbuild $BUILD_TYPE - - Write-Host - Write-Host - Write-Host "For a list of all supported commands, type 'help'" - Write-Host "-------------------------------------------------" - Write-Host - Write-Host - Write-Host -} - -# Builds application (wrapper to Ninja) -function xbuild { - if (-not (Test-Path build.arch)) { - & ninja @args - } else { - $ARCH = Get-Content build.arch - if ($ARCH -ne $Env:TARGET) { - Write-Host "Build is configured for '$ARCH' while current target set to '$($Env:TARGET)'!" - Write-Host "Cannot continue until conflict is resolved ..." - return 1 - } - & ninja @args - } -} diff --git a/scripts/xtclib.psm1 b/scripts/xtclib.psm1 new file mode 100644 index 0000000..dc1148d --- /dev/null +++ b/scripts/xtclib.psm1 @@ -0,0 +1,248 @@ +# +# MODULE: XTchain +# LICENSE: See the COPYING.md in the top level directory +# FILE: xtclib.psm1 +# DESCRIPTION: XTchain PowerShell module +# DEVELOPERS: Aiken Harris +# + +# Module variables +$script:XTCVersion = $env:XTCVER +$script:XTCDirectory = $env:XTCDIR + +<# +.SYNOPSIS + Prints XTChain banner +.DESCRIPTION + Displays the XTChain version banner with formatting +#> +function Show-XTCBanner { + [CmdletBinding()] + param() + + $XTC_BANNER = "XT Toolchain v$script:XTCVersion for Windows" + + Write-Host "################################################################################" + Write-Host + Write-Host (' ' * [math]::Floor((80 - $XTC_BANNER.Length) / 2) + $XTC_BANNER) -ForegroundColor Yellow + Write-Host + Write-Host "################################################################################" + Write-Host +} + +<# +.SYNOPSIS + Sets the target architecture +.DESCRIPTION + Configures the TARGET environment variable based on the specified architecture +.PARAMETER Architecture + The target architecture (aarch64, arm64, arm, armv7, i386, i486, i586, i686, x86, amd64, x64, x86_64) +#> +function Set-XTCArchitecture { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string]$Architecture + ) + + switch -Regex ($Architecture.ToLower()) { + "aarch64|arm64" { + $env:TARGET = "aarch64" + } + "arm|armv7" { + $env:TARGET = "armv7" + } + "i386|i486|i586|i686|x86" { + $env:TARGET = "i686" + } + "amd64|x64|x86_64" { + $env:TARGET = "amd64" + } + default { + $env:TARGET = "UNKNOWN" + Write-Warning "Unknown architecture '$Architecture'. Set to UNKNOWN." + } + } + Write-Host "Target Architecture: $($env:TARGET)" +} + +<# +.SYNOPSIS + Sets the build type +.DESCRIPTION + Configures the BUILD_TYPE environment variable +.PARAMETER BuildType + The build type (DEBUG or RELEASE) +#> +function Set-XTCBuildType { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [ValidateSet("DEBUG", "RELEASE")] + [string]$BuildType + ) + + $env:BUILD_TYPE = $BuildType.ToUpper() + Write-Host "Target build type: $($env:BUILD_TYPE)" +} + +<# +.SYNOPSIS + Shows XTChain help information +.DESCRIPTION + Displays available XTChain commands and their usage +#> +function Show-XTCHelp { + [CmdletBinding()] + param() + + Show-XTCBanner + Write-Host "XTChain PowerShell Module Commands:" + Write-Host " * Show-XTCBanner - prints XTChain banner" + Write-Host " * Set-XTCArchitecture - sets the target CPU architecture" + Write-Host " * Set-XTCBuildType - sets build type [DEBUG/RELEASE]" + Write-Host " * Show-XTCHelp - prints this message" + Write-Host " * Show-XTCVersion - prints XTChain and its components version" + Write-Host " * Invoke-XTCBuild - builds an application with Ninja build system" + Write-Host + Write-Host "Legacy command aliases:" + Write-Host " * banner, charch, chbuild, help, version, xbuild" +} + +<# +.SYNOPSIS + Displays version information for XTChain components +.DESCRIPTION + Shows version information for all XTChain tools and components +#> +function Show-XTCVersion { + [CmdletBinding()] + param() + + # Check for minimal XTChain version with external tools + $XTCHAIN_EXTTOOLS = $false + if ((Test-Path "$script:XTCDirectory/bin/clang") -and + ((Get-Command clang -ErrorAction SilentlyContinue).Source -eq "$script:XTCDirectory/bin/clang") -and + ($script:XTCVersion -match "min")) { + + $XTCHAIN_EXTTOOLS = $true + $requiredTools = @("clang", "clang++", "cmake", "lld-link", "ninja") + + foreach ($tool in $requiredTools) { + if (!(Get-Command $tool -ErrorAction SilentlyContinue)) { + Write-Error "You are using minimal version of XTChain and '$tool' has been not found in your system!" + Write-Error "Please install all required tools." + return + } + } + } + + Show-XTCBanner + Write-Host + + # Display tool versions + try { + $clangVersion = (clang --version | Select-String -Pattern "version (\d+\.\d+\.\d+)").Matches.Groups[1].Value + $clangPath = (Get-Command clang).Source + Write-Host "LLVM/Clang Compiler: $clangVersion ($clangPath)" + } catch { Write-Warning "Could not retrieve Clang version" } + + try { + $lldVersion = (lld-link --version | Select-String -Pattern "(\d+\.\d+\.\d+)").Matches.Groups[1].Value + $lldPath = (Get-Command lld-link).Source + Write-Host "LLVM/LLD Linker: $lldVersion ($lldPath)" + } catch { Write-Warning "Could not retrieve LLD version" } + + try { + $widlVersion = (widl -V | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value + $widlPath = (Get-Command widl).Source + Write-Host "Wine IDL Compiler: $widlVersion ($widlPath)" + } catch { Write-Warning "Could not retrieve WIDL version" } + + try { + $wmcVersion = (wmc -V | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value + $wmcPath = (Get-Command wmc).Source + Write-Host "Wine Message Compiler: $wmcVersion ($wmcPath)" + } catch { Write-Warning "Could not retrieve WMC version" } + + try { + $wrcVersion = (wrc --version | Select-String -Pattern "version (\d+\.\d+)").Matches.Groups[1].Value + $wrcPath = (Get-Command wrc).Source + Write-Host "Wine Resource Compiler: $wrcVersion ($wrcPath)" + } catch { Write-Warning "Could not retrieve WRC version" } + + try { + $xtcspeccVersion = (xtcspecc --help | Select-String -Pattern "Version (\d+\.\d+)").Matches.Groups[1].Value + $xtcspeccPath = (Get-Command xtcspecc).Source + Write-Host "XT SPEC Compiler: $xtcspeccVersion ($xtcspeccPath)" + } catch { Write-Warning "Could not retrieve XTCSPECC version" } + + try { + $cmakeVersion = (cmake --version | Select-String -Pattern "version (\d+\.\d+\.\d+)").Matches.Groups[1].Value + $cmakePath = (Get-Command cmake).Source + Write-Host "CMake Build System: $cmakeVersion ($cmakePath)" + } catch { Write-Warning "Could not retrieve CMake version" } + + try { + $ninjaVersion = (ninja --version) + $ninjaPath = (Get-Command ninja).Source + Write-Host "Ninja Build System: $ninjaVersion ($ninjaPath)" + } catch { Write-Warning "Could not retrieve Ninja version" } + + Write-Host + + # Set default values and display current configuration + $BUILD_TYPE = if ([string]::IsNullOrEmpty($env:BUILD_TYPE)) { 'DEBUG' } else { $env:BUILD_TYPE } + $TARGET = if ([string]::IsNullOrEmpty($env:TARGET)) { 'amd64' } else { $env:TARGET } + + Set-XTCArchitecture -Architecture $TARGET + Set-XTCBuildType -BuildType $BUILD_TYPE + + Write-Host + Write-Host + Write-Host "For a list of all supported commands, type 'Show-XTCHelp' or 'help'" + Write-Host "--------------------------------------------------------" + Write-Host +} + +<# +.SYNOPSIS + Builds application using Ninja build system +.DESCRIPTION + Wrapper around ninja command with architecture validation +.PARAMETER Arguments + Arguments to pass to ninja +#> +function Invoke-XTCBuild { + [CmdletBinding()] + param ( + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$Arguments + ) + + if (Test-Path "build.arch") { + $buildArch = Get-Content "build.arch" -Raw + $buildArch = $buildArch.Trim() + + if ($buildArch -ne $env:TARGET) { + Write-Host "Build is configured for '$buildArch' while current target set to '$($env:TARGET)'!" -ForegroundColor Red + Write-Host "Cannot continue until conflict is resolved..." -ForegroundColor Red + return 1 + } + } + + & ninja @Arguments + return $LASTEXITCODE +} + +# Legacy function aliases for backwards compatibility +Set-Alias -Name banner -Value Show-XTCBanner +Set-Alias -Name charch -Value Set-XTCArchitecture +Set-Alias -Name chbuild -Value Set-XTCBuildType +Set-Alias -Name help -Value Show-XTCHelp +Set-Alias -Name version -Value Show-XTCVersion +Set-Alias -Name xbuild -Value Invoke-XTCBuild + +# Export functions and aliases +Export-ModuleMember -Function Show-XTCBanner, Set-XTCArchitecture, Set-XTCBuildType, Show-XTCHelp, Show-XTCVersion, Invoke-XTCBuild +Export-ModuleMember -Alias banner, charch, chbuild, help, version, xbuild \ No newline at end of file