blob: 909ff010bca0df3a2c991aa83c9e3beb23306204 (
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
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
|
@echo off
if [%1]==[/d] (
SET DEBUG=1
shift
) else (
SET DEBUG=0
)
SET CC=clang
SET CXX=clang++
SET ARCH=PORTABLE
SET THREADS=1
SET SANITIZE=
:: TODO depends on ARCH variable
SET ARCHOPTS=
:: TODO depends on SANITIZE variable
SET DFLAGS=-g3 -DDEBUG
SET WARNINGS=-Wno-deprecated-declarations
SET VARIABLES=-DTHREADS=%THREADS% -D%ARCH%
SET OFLAGS=-O3
SET CFLAGS=-std=c11 %ARCHOPTS% %WARNINGS% %VARIABLES%
SET STACKSIZE=-Wl,-stack:16777216
SET LFLAGS=%STACKSIZE%
:: Python libraries - change to match your local installation
SET PYPATH=%userprofile%\AppData\Local\Programs\Python\Python313
SET PYINCLUDE=%PYPATH%\include
SET PYLIBS=%PYPATH%\libs
SET TARGET=%1
if not defined TARGET SET TARGET=nissy
SET EXPR=%2
for %%a in (nissy python shell test config help clean tool cpp solvetest) do (
if %TARGET%==%%a (
call:build_%TARGET% %*
exit /b
)
)
echo Target '%TARGET%' unavailable, run 'build help' for info
exit /b 1
:build_help
echo *** Warning: support for building nissy on Windows is incomplete ***
echo.
echo Build system for nissy. Usage:
echo.
echo build [/d] [TARGET]
echo.
echo Possible values for TARGET (defaults to 'nissy' if unspecified):
echo.
echo nissy Build the nissy.o object file.
echo python Build the Python module for nissy.
echo NOTE: Python development headers must be installed in
echo order to build the Python module. The path of these
echo headers is hardcoded in the PYPATH varible in
echo build.bat. You may need to edit this file.
echo shell Build the basic nissy shell (./run).
echo cpp FILE Build and run the given C++ FILE.
echo test [EXPR] Build and run unit tests. If EXPR is provided, only the
echo tests whose name contains EXPR are run. The /d option is
echo is always implied.
echo tool EXPR Run the 'tool' matching the given EXPR.
echo solvetest Build nissy and run a collection of tools for testing"
echo various solvers.
echo help Show this help message.
echo config Show build configuration and exit.
echo clean Remove all build files.
echo.
echo The /d option activates debug mode (slower, used for testing).
echo Tests are automatically built in debug mode even without /d.
echo For more on build configurations, see the comments in build.bat.
exit /b
:build_config
echo Compiler: %CC%
echo Architecture: %ARCH%
echo Max threads: %THREADS%
echo Optimization flags: %OFLAGS%
echo Debug flags: %DFLAGS%
exit /b
:build_nissy
call:odflags
@echo on
%CC% %CFLAGS% %ODFLAGS% -c src\nissy.c || exit /b 1
@echo off
exit /b
:build_shell
call:build_nissy || exit /b 1
call:odflags
@echo on
%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o shell\shell.c -o run.exe ^
|| exit /b 1
@echo off
exit /b
:build_python
call:build_nissy || exit /b 1
call:odflags
@echo on
%CC% %CFLAGS% %LFLAGS% -I%PYINCLUDE% -L%PYLIBS% -shared -lpython3 ^
python\nissy_module.c nissy.o -o python\nissy.pyd || exit /b 1
@echo off
exit /b
:build_test
SET DEBUG=1
call:build_nissy || exit /b 1
if not defined EXPR (
SET WILDCARD=*
) else (
SET WILDCARD=*%EXPR%*
)
for /d %%d in ( test\%WILDCARD% ) do (
if exist %%d\* (
call:build_single_test %%d || exit /b 1
)
)
exit /b
:build_clean
@echo on
del *.o *.so *.a *.ilk *.pdb *.exe
@echo off
exit /b
:build_tool
if not defined EXPR (
@echo Please provide a valid EXPR to select a tool
exit /b 1
)
set toolname=
for /d %%d in ( tools\*%EXPR%* ) do (
set toolname=%%~nd
)
if [%toolname%]==[] (
@echo Expression '%EXPR%' does not match any tool
exit /b 1
)
call:build_nissy || exit /b 1
call:build_single_tool %*
exit /b
:build_cpp
if not defined EXPR (
@echo Please provide a valid C++ source file.
exit /b 1
)
if not exist %EXPR% (
@echo File %EXPR% does not exist.
exit /b 1
)
call:build_nissy || exit /b 1
@echo on
%CXX% %ODFLAGS% -std=c++20 -o runcpp.exe cpp\nissy.cpp nissy.o %EXPR% ^
|| exit /b 1
runcpp
@echo off
exit /b
:build_solvetest
call:build_nissy || exit /b 1
for /d %%d in ( tools\*solvetest* ) do (
set toolname=%%~nd
call:build_single_tool
)
exit /b
:build_single_test
call:odflags
%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o %1\*.c -o runtest.exe || exit /b 1
set error=0
for %%c in ( %1\*.in ) do (
if %error%==1 exit /b 1
@echo | set /p v="%1\%%~nc: "
runtest < %%c > test\last.out 2> test\last.err
FC /a %1\%%~nc.out test\last.out > test\last.fc.out
if ERRORLEVEL 1 (
@echo Test failed! Different output:
type test\last.fc.out
@echo stderr:
type test\last.err
goto :error
) else (
@echo ok
)
)
if %error%==1 exit /b 1
del runtest.*
exit /b
:build_single_tool
@echo on
%CC% %CFLAGS% %ODFLAGS% %LFLAGS% nissy.o tools\%toolname%\*.c ^
-o runtool.exe || exit /b 1
@echo off
runtool %3 %4 %5 %6 %7 %8 %9 || exit /b 1
@echo.
@echo (On Windows, the output of a tool is not saved to any file.)
exit /b
:odflags
if %DEBUG%==1 (
SET ODFLAGS=%DFLAGS%
) else (
SET ODFLAGS=%OFLAGS%
)
exit /b
:error
exit /b 1
|