blob: 4341098a18f4895981722b1d6c739dd4a326527e (
plain)
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
|
@echo off
rem file : bootstrap-msvc.bat
rem copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
rem license : MIT; see accompanying LICENSE file
setlocal EnableDelayedExpansion
goto start
:usage
echo.
echo Usage: %0 [/?] ^<cxx^> [^<cxx-option^>...]
echo.
echo Normally this batch file is executed from one of the Visual Studio
echo command prompts with cl.exe as the compiler executable (^<cxx^>).
echo It assumes that all the relevant compiler environment variables
echo ^(INCLUDE, LIB^) are set.
echo.
echo The batch file expects to find the libbutl\ or libbutl-*\ directory
echo either in the current directory ^(build2 root^) or one level up. The
echo result is saved as build2\b-boot.exe.
echo.
echo Example usage:
echo.
echo %0 cl
echo.
echo See the INSTALL file for details.
echo.
goto end
rem Clean up .obj files from all the directories passed as arguments.
rem
:clean_obj
for %%d in (%*) do (
if exist %%d\*.obj del %%d\*.obj
)
goto :eof
:compile
rem Note that echo does not override errorlevel.
rem
echo on
%cxx% /I%owd%\%libbutl% /I%owd% /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /DBUILD2_BOOTSTRAP /DBUILD2_HOST_TRIPLET=\"x86_64-microsoft-win32-msvc\" %ops% /c /TP %*
@echo off
if errorlevel 1 exit /b 1
goto :eof
:link
echo on
%cxx% %ops% %*
@echo off
if errorlevel 1 exit /b 1
goto :eof
:start
set "owd=%CD%"
if "_%1_" == "_/?_" goto usage
rem Compiler executable.
rem
if "_%1_" == "__" (
echo error: compiler executable expected, run %0 /? for details
goto error
) else (
set "cxx=%1"
)
rem See if there is libbutl or libbutl-* in the current directory and one
rem directory up. Note that globbing returns paths in alphabetic order.
rem
if exist libbutl\ (
set "libbutl=libbutl"
) else (
for /D %%d in (libbutl-*) do set "libbutl=%%d"
)
if "_%libbutl%_" == "__" (
if exist ..\libbutl\ (
set "libbutl=..\libbutl"
) else (
for /D %%d in (..\libbutl-*) do set "libbutl=%%d"
)
)
if "_%libbutl%_" == "__" (
echo error: unable to find libbutl, run %0 /? for details
goto error
)
rem All the source directories.
rem
set "src=build2"
set "src=%src% build2\c"
set "src=%src% build2\cc"
set "src=%src% build2\cxx"
set "src=%src% libbuild2"
set "src=%src% libbuild2\config"
set "src=%src% libbuild2\dist"
set "src=%src% libbuild2\test"
set "src=%src% libbuild2\test\script"
set "src=%src% libbuild2\install"
set "src=%src% libbuild2\bin"
set "src=%src% libbuild2\version"
set "src=%src% libbuild2\in"
set "src=%src% %libbutl%\libbutl"
rem Get the compile options.
rem
set "ops=/nologo /EHsc /MT /MP"
:ops_next
shift
if "_%1_" == "__" (
goto ops_done
) else (
set "ops=%ops% %1"
goto ops_next
)
:ops_done
rem First clean up any stale .obj files we might have laying around.
rem
call :clean_obj %src%
if errorlevel 1 goto error
rem Compile.
rem
rem VC dumps .obj files in the current directory not caring if the names
rem clash. And boy do they clash.
rem
set "obj="
for %%d in (%src%) do (
cd %%d
rem Filter out *.test.cxx sources.
rem
rem Note that we don't need to worry about *.obj since we clean them all up
rem before compiling so after compiling we will only have the ones we need.
rem
set "r="
for /F "tokens=*" %%i in ('dir /b *.cxx ^| findstr /v "\.test\.cxx"') do set "r=!r! %%i"
call :compile !r!
if errorlevel 1 goto error
cd %owd%
set "obj=!obj! %%d\*.obj"
)
rem Link.
rem
call :link /Fe: build2\b-boot.exe %obj% shell32.lib imagehlp.lib
if errorlevel 1 goto error
rem Clean up.
rem
call :clean_obj %src%
if errorlevel 1 goto error
goto end
:error
cd %owd%
endlocal
exit /b 1
:end
endlocal
|