diff --git a/make.cmd b/make.cmd new file mode 100644 index 0000000..c3bc54d --- /dev/null +++ b/make.cmd @@ -0,0 +1 @@ +@powershell -NoProfile -ExecutionPolicy Unrestricted -File make.ps1 %* diff --git a/make.ps1 b/make.ps1 new file mode 100644 index 0000000..b19d248 --- /dev/null +++ b/make.ps1 @@ -0,0 +1,311 @@ +####### The starting point for the script is the bottom ####### + +############################################################### +########################## FUNCTIONS ########################## +############################################################### +function All-Command +{ + $msBuild = FindMSBuild + $msBuildArguments = "/t:Rebuild /nr:false" + if ($msBuild -eq $null) + { + echo "Unable to locate an appropriate version of MSBuild." + } + else + { + $proc = Start-Process $msBuild $msBuildArguments -NoNewWindow -PassThru -Wait + if ($proc.ExitCode -ne 0) + { + echo "Build failed. If just the development tools failed to build, try installing Visual Studio. You may also still be able to run the game." + } + else + { + echo "Build succeeded." + } + } +} + +function Clean-Command +{ + $msBuild = FindMSBuild + $msBuildArguments = "/t:Clean /nr:false" + if ($msBuild -eq $null) + { + echo "Unable to locate an appropriate version of MSBuild." + } + else + { + $proc = Start-Process $msBuild $msBuildArguments -NoNewWindow -PassThru -Wait + rm *.dll + rm *.dll.config + rm mods/*/*.dll + rm *.pdb + rm mods/*/*.pdb + rm *.exe + rm ./*/bin -r + rm ./*/obj -r + echo "Clean complete." + } +} + +function Version-Command +{ + if ($command.Length -gt 1) + { + $version = $command[1] + } + elseif (Get-Command 'git' -ErrorAction SilentlyContinue) + { + $gitRepo = git rev-parse --is-inside-work-tree + if ($gitRepo) + { + $version = git name-rev --name-only --tags --no-undefined HEAD 2>$null + if ($version -eq $null) + { + $version = "git-" + (git rev-parse --short HEAD) + } + } + else + { + echo "Not a git repository. The version will remain unchanged." + } + } + else + { + echo "Unable to locate Git. The version will remain unchanged." + } + + if ($version -ne $null) + { + $mod = "mods/" + $modID + "/mod.yaml" + $replacement = (gc $mod) -Replace "Version:.*", ("Version: {0}" -f $version) + sc $mod $replacement + + $prefix = $(gc $mod) | Where { $_.ToString().EndsWith(": User") } + if ($prefix -and $prefix.LastIndexOf("/") -ne -1) + { + $prefix = $prefix.Substring(0, $prefix.LastIndexOf("/")) + } + $replacement = (gc $mod) -Replace ".*: User", ("{0}/{1}: User" -f $prefix, $version) + sc $mod $replacement + + echo ("Version strings set to '{0}'." -f $version) + } +} + +function Test-Command +{ + if (Test-Path ./engine/OpenRA.Utility.exe) + { + $msg = "Testing " + $modID + " mod MiniYAML" + echo $msg + ./engine/OpenRA.Utility.exe $modID --check-yaml + } + else + { + UtilityNotFound + } +} + +function Check-Command +{ + if (Test-Path ./engine/OpenRA.Utility.exe) + { + echo "Checking for explicit interface violations..." + ./engine/OpenRA.Utility.exe $modID --check-explicit-interfaces + + $msg = "Checking for code style violations in OpenRA.Mods." + $modID + "..." + echo $msg + ./engine/OpenRA.Utility.exe $modID --check-code-style OpenRA.Mods.$modID + } + else + { + UtilityNotFound + } +} + +function Check-Scripts-Command +{ + if ((Get-Command "luac.exe" -ErrorAction SilentlyContinue) -ne $null) + { + echo "Testing Lua scripts..." + foreach ($script in ls "mods/*/maps/*/*.lua") + { + luac -p $script + } + echo "Check completed!" + } + else + { + echo "luac.exe could not be found. Please install Lua." + } +} + +function Docs-Command +{ + if (Test-Path ./engine/OpenRA.Utility.exe) + { + ./engine/OpenRA.Utility.exe $modID --docs | Out-File -Encoding "UTF8" DOCUMENTATION.md + ./engine/OpenRA.Utility.exe $modID --lua-docs | Out-File -Encoding "UTF8" Lua-API.md + echo "Docs generated." + } + else + { + UtilityNotFound + } +} + +function FindMSBuild +{ + $key = "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" + $property = Get-ItemProperty $key -ErrorAction SilentlyContinue + if ($property -eq $null -or $property.MSBuildToolsPath -eq $null) + { + return $null + } + + $path = Join-Path $property.MSBuildToolsPath -ChildPath "MSBuild.exe" + if (Test-Path $path) + { + return $path + } + + return $null +} + +function UtilityNotFound +{ + echo "OpenRA.Utility.exe could not be found. Build the project first using the `"all`" command." +} + +function WaitForInput +{ + echo "Press enter to continue." + while ($true) + { + if ([System.Console]::KeyAvailable) + { + exit + } + Start-Sleep -Milliseconds 50 + } +} + +############################################################### +############################ Main ############################# +############################################################### +if ($args.Length -eq 0) +{ + echo "Command list:" + echo "" + echo " all Builds the game, its development tools and the mod dlls." + echo " version Sets the version strings for all mods to the latest" + echo " version for the current Git branch." + echo " clean Removes all built and copied files." + echo " from the mods and the engine directories." + echo " test Tests the mod's MiniYAML for errors." + echo " check Checks .cs files for StyleCop violations." + echo " check-scripts Checks .lua files for syntax errors." + echo " docs Generates the trait and Lua API documentation." + echo "" + $command = (Read-Host "Enter command").Split(' ', 2) +} +else +{ + $command = $args +} + +# Load the environment variables from the config file +# and get the mod ID from the local environment variable +$reader = [System.IO.File]::OpenText("mod.config") +while($null -ne ($line = $reader.ReadLine())) +{ + if ($line.StartsWith("MOD_ID")) + { + $env:MOD_ID = $line.Replace('MOD_ID=', '').Replace('"', '') + $modID = $env:MOD_ID + } + + if ($line.StartsWith("INCLUDE_DEFAULT_MODS")) + { + $env:INCLUDE_DEFAULT_MODS = $line.Replace('INCLUDE_DEFAULT_MODS=', '').Replace('"', '') + } +} + +$env:MOD_SEARCH_PATHS = (Get-Item -Path ".\" -Verbose).FullName + "\mods" +if ($env:INCLUDE_DEFAULT_MODS -eq "True") +{ + $env:MOD_SEARCH_PATHS = $env:MOD_SEARCH_PATHS + ",./mods" +} + +# Run the same command on the engine's make file +if ($command -eq "all" -or $command -eq "clean") +{ + if (Test-Path ./engine/OpenRA.sln) + { + cd ".\engine\" + $exp = ".\make.cmd " + $command + Invoke-Expression $exp + echo "" + cd .. + } + else + { + if (Get-Command 'git' -ErrorAction SilentlyContinue) + { + $gitRepo = git rev-parse --is-inside-work-tree + if ($gitRepo) + { + git submodule update --init + + if (Test-Path ./engine/OpenRA.sln) + { + cd ".\engine\" + $exp = ".\make.cmd " + $command + Invoke-Expression $exp + echo "" + cd .. + } + else + { + echo "Failed to initialize the submodule. You need to download the engine by hand." + WaitForInput + } + } + else + { + echo "Not a git repository. You need to download the engine by hand." + WaitForInput + } + } + else + { + echo "Unable to locate Git. You need to download the engine by hand." + WaitForInput + } + } +} + +$execute = $command +if ($command.Length -gt 1) +{ + $execute = $command[0] +} + +switch ($execute) +{ + "all" { All-Command } + "version" { Version-Command } + "clean" { Clean-Command } + "test" { Test-Command } + "check" { Check-Command } + "check-scripts" { Check-Scripts-Command } + "docs" { Docs-Command } + Default { echo ("Invalid command '{0}'" -f $command) } +} + +# In case the script was called without any parameters we keep the window open +if ($args.Length -eq 0) +{ + WaitForInput +}