-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.cmd
222 lines (177 loc) · 5.07 KB
/
build.cmd
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd %~dp0
if not exist "src" (
echo No src directory found. Make sure build.cmd is in the same directory as src.
echo If you want to create a new project, use create-project.cmd instead.
exit /b
)
:: Create dist ::
rmdir /S /Q dist 2>nul
mkdir dist
echo 1 >dist\1
echo 2 >dist\2
echo @echo off >dist\settings.cmd
echo rem Built by batchbuilder >>dist\settings.cmd
:: Parse INI
set settings_entry=entry.cmd
set settings_delete_compiled=yes
set settings_compile_if=batch ~-4 .cmd,batch ~-4 .bat
set settings_packed=yes
for /F "tokens=1,* delims==" %%a IN (src\build.ini) do (
set settings_%%a=%%b
)
for /F "tokens=1,* delims==" %%a IN ('set settings_') do (
echo set %%a=%%b>>dist\settings.cmd
)
:: Parse compile_if
set compile_if_count=0
for %%i in ("%settings_compile_if:,=" "%") do (
set i=%%~i
for /F "tokens=1* delims= " %%u in ("!i:* =!") do (
set key=%%u
set value=%%v
)
for /F "delims=" %%k in ("!i:* =!") do (
set compiler=!i: %%k=!
)
if not exist "compiler\!compiler!_compiler" (
echo Compiler !compiler! does not exist
exit /b
)
set /a compile_if_count=!compile_if_count! + 1
set compile_if_compiler_!compile_if_count!=!compiler!
set compile_if_key_!compile_if_count!=!key!
set compile_if_value_!compile_if_count!=!value!
)
:: Compile ::
rmdir /S /Q compiler\compiled 2>nul
mkdir compiler\compiled
mkdir compiler\info
mkdir compiler\info\exports
mkdir compiler\info\exports_has_return
mkdir compiler\info\classes
set root=%~dp0src\
for /R src %%a IN (*) DO (
set ext=%%a
set compiler=none
for /L %%i in (1,1,%compile_if_count%) do (
for /F "delims=" %%k in ("!compile_if_key_%%i!") do (
if "!ext:%%k!" == "!compile_if_value_%%i!" (
set compiler=!compile_if_compiler_%%i!
)
)
)
set relative=%%a
set relative=!relative:%root%=!
if not "!compiler!" == "none" (
call "compiler\!compiler!_compiler\compile1.cmd" "%%a" "!relative!" >"compiler\compiled\!relative!" 2>compiler\info\log
if "!ERRORLEVEL!" == "1" (
echo Compile error in !relative!:
type compiler\info\log
rmdir /S /Q compiler\compiled
rmdir /S /Q compiler\info
popd
exit /b
) else (
set first_line=
<compiler\info\log set /p first_line=
if not "!first_line!" == "" (
echo Warnings in !relative!:
type compiler\info\log
)
)
) else (
copy "%%a" "compiler\compiled\!relative!"
)
)
set root=%~dp0compiler\compiled\
for /R compiler\compiled %%a IN (*) DO (
set ext=%%a
set ext=!ext:~-4!
set compiler=none
for /L %%i in (1,1,%compile_if_count%) do (
for /F "delims=" %%k in ("!compile_if_key_%%i!") do (
if "!ext:%%k!" == "!compile_if_value_%%i!" (
set compiler=!compile_if_compiler_%%i!
)
)
)
set relative=%%a
set relative=!relative:%root%=!
if not "!compiler!" == "none" (
move "%%a" "%%a.before_compilation"
call "compiler\!compiler!_compiler\compile2.cmd" "%%a.before_compilation" "!relative!" >"compiler\compiled\!relative!" 2>compiler\info\log
if "!ERRORLEVEL!" == "1" (
echo Compile error in !relative!:
type compiler\info\log
rmdir /S /Q compiler\compiled
rmdir /S /Q compiler\info
popd
exit /b
) else (
set first_line=
<compiler\info\log set /p first_line=
if not "!first_line!" == "" (
echo Warnings in !relative!:
type compiler\info\log
)
)
del "%%a.before_compilation"
)
)
:: Run finish hooks ::
for /L %%i in (1,1,%compile_if_count%) do (
set compiler=!compile_if_compiler_%%i!
if not defined __compiler_handled_!compiler!__ (
set __compiler_handled_!compiler!__=yes
call "compiler\!compiler!_compiler\finish.cmd"
)
)
for /L %%i in (1,1,%compile_if_count%) do (
set __compiler_handled_!compiler!__=
)
:: Add __class__
copy "%~dp0compiler\__class__.cmd" "compiler\compiled\__class__.cmd"
if "%settings_packed%" == "local" (
set settings_packed=no
)
if "%settings_packed%" == "no" (
:: Create bootstrap ::
copy dist\settings.cmd+compiler\bootstrap_unpacked.cmd /B dist\bootstrap.cmd
:: Save scripts :
robocopy compiler\compiled dist\contents /E >nul
) else (
:: Create CAB ::
echo .OPTION EXPLICIT >tmp.ddf
echo .Set CabinetNameTemplate=data.cab >>tmp.ddf
echo .Set Cabinet=on >>tmp.ddf
echo .Set Compress=on >>tmp.ddf
echo .Set DiskDirectoryTemplate=dist >>tmp.ddf
set root=%~dp0compiler\compiled\
for /R compiler\compiled %%a IN (*) DO (
set relative=%%a
set relative=!relative:%root%=!
echo "%%a" >>tmp.ddf
)
:: Always add 2 more files because EXPAND works with >1 files only ::
echo "%~dp0dist\1" >>tmp.ddf
echo "%~dp0dist\2" >>tmp.ddf
makecab /F tmp.ddf >nul
del tmp.ddf
del setup.rpt
del setup.inf
:: Append CAB to bootstrapper ::
copy dist\settings.cmd+compiler\bootstrap.cmd+dist\data.cab /B dist\bootstrap.cmd
if not "%settings_delete_compiled%" == "no" (
del dist\data.cab
)
)
if not "%settings_delete_compiled%" == "no" (
rmdir /S /Q compiler\compiled
)
rmdir /S /Q compiler\info
del dist\1
del dist\2
del dist\settings.cmd
popd