-
-
Notifications
You must be signed in to change notification settings - Fork 544
Expand file tree
/
Copy pathbuild-repo.ps1
More file actions
executable file
·186 lines (150 loc) · 6.66 KB
/
build-repo.ps1
File metadata and controls
executable file
·186 lines (150 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
<#
.SYNOPSIS
Builds a repo
.DESCRIPTION
This PowerShell script builds an arbitrary source code repository by supporting
build systems like: autogen, cargo, cmake, configure, Gradle, Imakefile, Makefile,
Meson, and PowerShell (build.ps1).
.PARAMETER path
Specifies the file path to the Git repository (default: current working directory)
.EXAMPLE
PS> ./build-repo.ps1 C:\Repos\ninja
⏳ Configuring CMake by executing 'cmake .'...
...
✅ Repo 'ninja' built in 47s, results at: 📂C:\Repos\ninja\_x86_64_builds
.LINK
https://github.com/fleschutz/PowerShell
.NOTES
Author: Markus Fleschutz | License: CC0
#>
param([string]$path = "$PWD")
function BuildFolder([string]$path) {
$dirName = (Get-Item "$path").Name
if (Test-Path "$path/CMakeLists.txt" -pathType leaf) {
"⏳ (1/3) Configuring CMake by executing 'cmake .'..."
if ($IsLinux -or $IsMacOS) {
$architecture = (uname -m)
} else {
$architecture = "win64"
}
$global:results = "$path/_$($architecture)_builds/"
if (-not(Test-Path $global:results -pathType container)) {
& mkdir $global:results
}
Set-Location $global:results
& cmake ..
if ($lastExitCode -ne 0) { throw "Executing 'cmake ..' failed with exit code $lastExitCode" }
"⏳ (2/3) Building $dirName by executing 'make'..."
& make
if ($lastExitCode -ne 0) { throw "Executing 'make' failed with exit code $lastExitCode" }
"⏳ (3/3) Testing $dirName by executing 'ctest -V'... (if tests are provided)"
& ctest -V
if ($lastExitCode -ne 0) { throw "Executing 'ctest -V' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/.cargo/release.toml" -pathType leaf) {
"⏳ Building '$dirName' by executing 'cargo build'..."
Set-Location "$path/"
& cargo build --config .cargo/release.toml --release
if ($lastExitCode -ne 0) { throw "Executing 'cargo build' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/autogen.sh" -pathType leaf) {
"⏳ (1/3) Building '$dirName' by executing 'autogen.sh'..."
Set-Location "$path/"
& ./autogen.sh --force
if ($lastExitCode -ne 0) { throw "Executing './autogen.sh --force' failed with exit code $lastExitCode" }
"⏳ (2/3) Executing './configure'..."
& ./configure
if ($lastExitCode -ne 0) { throw "Executing './configure' failed with exit code $lastExitCode" }
"⏳ (3/3) Executing 'make -j4' to compile and link..."
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/configure" -pathType leaf) {
"⏳ (1/3) Building '$dirName' by executing './configure'..."
Set-Location "$path/"
& ./configure
#if ($lastExitCode -ne 0) { throw "Executing './configure' exited with error code $lastExitCode" }
"⏳ (2/3) Compiling and linking '$dirName' by executing 'make -j4'..."
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
"⏳ (3/3) Checking '$dirName' by executing 'make test'..."
& make test
if ($lastExitCode -ne 0) { throw "Executing 'make test' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/build.gradle" -pathType leaf) {
"⏳ (1/2) Building '$dirName' by executing 'gradle build'..."
Set-Location "$path"
& gradle build
if ($lastExitCode -ne 0) { throw "Executing 'gradle build' failed with exit code $lastExitCode" }
"⏳ (2/2) Checking '$dirName' by executing 'gradle test'..."
& gradle test
if ($lastExitCode -ne 0) { throw "Executing 'gradle test' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/meson.build" -pathType leaf) {
"⏳ Building '$dirName' by using Meson..."
Set-Location "$path"
& meson . build --prefix=/usr/local
if ($lastExitCode -ne 0) { throw "Executing 'meson . build' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/Imakefile" -pathType leaf) {
"⏳ Building '$dirName' by using Imakefile..."
Set-Location "$path/"
& xmkmf
if ($lastExitCode -ne 0) { throw "Executing 'xmkmf' failed with exit code $lastExitCode" }
"⏳ Executing 'make -j4' to compile and link..."
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/Makefile" -pathType leaf) {
"⏳ Building '$dirName' by using Makefile..."
Set-Location "$path"
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/makefile" -pathType leaf) {
"⏳ Building '$dirName' by using makefile..."
Set-Location "$path"
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/build.ps1" -pathType leaf) {
"⏳ Building '$dirName' by executing 'build.ps1'..."
Set-Location "$path/"
& ./build.ps1
if ($lastExitCode -ne 0) { throw "Executing './build.ps1' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/compile.sh" -pathType leaf) {
"⏳ Building '$dirName' by executing 'compile.sh'..."
Set-Location "$path/"
& ./compile.sh
if ($lastExitCode -ne 0) { throw "Executing './compile.sh' failed with exit code $lastExitCode" }
"⏳ Executing 'make -j4' to compile and link..."
& make -j4
if ($lastExitCode -ne 0) { throw "Executing 'make -j4' failed with exit code $lastExitCode" }
} elseif (Test-Path "$path/attower/src/build/DevBuild/build.bat" -pathType leaf) {
Write-Host "⏳ Building '$dirName' by executing 'build.bat'..."
Set-Location "$path/attower/src/build/DevBuild/"
& ./build.bat build-core-release
if ($lastExitCode -ne 0) { throw "Executing 'build.bat' failed with exit code $lastExitCode" }
$global:results = "$path\attower\Executables"
} elseif (Test-Path "$path/src" -pathType container) {
"⏳ Trying to build in 📂src subfolder..."
BuildFolder "$path/src"
} elseif (Test-Path "$path/$dirName" -pathType container) {
"⏳ Trying to build in 📂$($dirName) subfolder..."
BuildFolder "$path/$dirName"
} else {
Write-Warning "Sorry, no make rule applies to: 📂$dirName"
exit 0 # success
}
}
try {
$stopWatch = [system.diagnostics.stopwatch]::startNew()
$previousPath = Get-Location
if (-not(Test-Path "$path" -pathType container)) { throw "The file path '$path' doesn't exist (yet)" }
$global:results = ""
BuildFolder "$path"
Set-Location "$previousPath"
$dirName = (Get-Item "$path").Name
[int]$elapsed = $stopWatch.Elapsed.TotalSeconds
if ($global:results -eq "") {
"✅ Repo '$dirName' built in $($elapsed)s."
} else {
"✅ Repo '$dirName' built in $($elapsed)s, results at: 📂$($global:results)"
}
exit 0 # success
} catch {
"⚠️ ERROR: $($Error[0]) (at line $($_.InvocationInfo.ScriptLineNumber))"
Set-Location "$previousPath"
exit 1
}