blob: 6294609451d9d51e9a6fa825ce25db25e41b39d7 [file] [log] [blame]
danda1f49b2017-06-16 19:51:47 +00001#!/usr/bin/tclsh
2#
3# To build the
4#
5# const char **azCompileOpt[]
6#
larrybrcf5ad422021-04-15 23:43:25 +00007# definition used in src/ctime.c, run this script from
8# the checkout root. It alters src/ctime.c in-place.
danda1f49b2017-06-16 19:51:47 +00009#
10
larrybrcf5ad422021-04-15 23:43:25 +000011# All Boolean compile time options which default to something
12# other than 0 or empty. The default is paired with the PP
13# symbol so that a differing define can be detected.
danda1f49b2017-06-16 19:51:47 +000014#
larrybrcf5ad422021-04-15 23:43:25 +000015set boolean_defnnz_options {
16 {SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1}
larrybrcf5ad422021-04-15 23:43:25 +000017 {SQLITE_POWERSAFE_OVERWRITE 1}
18 {SQLITE_DEFAULT_MEMSTATUS 1}
larrybrcf5ad422021-04-15 23:43:25 +000019 {SQLITE_OMIT_TRACE 1}
larrybrcf5ad422021-04-15 23:43:25 +000020 {SQLITE_ALLOW_COVERING_INDEX_SCAN 1}
larrybrcf5ad422021-04-15 23:43:25 +000021}
22
23# All Boolean compile time options which default to 0 or empty.
24#
25set boolean_defnil_options {
danda1f49b2017-06-16 19:51:47 +000026 SQLITE_32BIT_ROWID
27 SQLITE_4_BYTE_ALIGNED_MALLOC
28 SQLITE_64BIT_STATS
danda1f49b2017-06-16 19:51:47 +000029 SQLITE_ALLOW_URI_AUTHORITY
30 SQLITE_BUG_COMPATIBLE_20160819
31 SQLITE_CASE_SENSITIVE_LIKE
32 SQLITE_CHECK_PAGES
33 SQLITE_COVERAGE_TEST
34 SQLITE_DEBUG
35 SQLITE_DEFAULT_AUTOMATIC_INDEX
36 SQLITE_DEFAULT_AUTOVACUUM
37 SQLITE_DEFAULT_CKPTFULLFSYNC
38 SQLITE_DEFAULT_FOREIGN_KEYS
39 SQLITE_DEFAULT_LOCKING_MODE
danda1f49b2017-06-16 19:51:47 +000040 SQLITE_DEFAULT_RECURSIVE_TRIGGERS
41 SQLITE_DEFAULT_SYNCHRONOUS
42 SQLITE_DEFAULT_WAL_SYNCHRONOUS
43 SQLITE_DIRECT_OVERFLOW_READ
44 SQLITE_DISABLE_DIRSYNC
45 SQLITE_DISABLE_FTS3_UNICODE
46 SQLITE_DISABLE_FTS4_DEFERRED
47 SQLITE_DISABLE_INTRINSIC
48 SQLITE_DISABLE_LFS
49 SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
50 SQLITE_DISABLE_SKIPAHEAD_DISTINCT
51 SQLITE_ENABLE_8_3_NAMES
52 SQLITE_ENABLE_API_ARMOR
53 SQLITE_ENABLE_ATOMIC_WRITE
larrybrf8fb27f2021-04-15 00:26:34 +000054 SQLITE_ENABLE_BATCH_ATOMIC_WRITE
55 SQLITE_ENABLE_BYTECODE_VTAB
danda1f49b2017-06-16 19:51:47 +000056 SQLITE_ENABLE_COLUMN_METADATA
57 SQLITE_ENABLE_COLUMN_USED_MASK
58 SQLITE_ENABLE_COSTMULT
59 SQLITE_ENABLE_CURSOR_HINTS
larrybrf8fb27f2021-04-15 00:26:34 +000060 SQLITE_ENABLE_DBPAGE_VTAB
danda1f49b2017-06-16 19:51:47 +000061 SQLITE_ENABLE_DBSTAT_VTAB
62 SQLITE_ENABLE_EXPENSIVE_ASSERT
larrybrf8fb27f2021-04-15 00:26:34 +000063 SQLITE_ENABLE_EXPLAIN_COMMENTS
danda1f49b2017-06-16 19:51:47 +000064 SQLITE_ENABLE_FTS3
65 SQLITE_ENABLE_FTS3_PARENTHESIS
66 SQLITE_ENABLE_FTS3_TOKENIZER
67 SQLITE_ENABLE_FTS4
68 SQLITE_ENABLE_FTS5
larrybrf8fb27f2021-04-15 00:26:34 +000069 SQLITE_ENABLE_GEOPOLY
danda1f49b2017-06-16 19:51:47 +000070 SQLITE_ENABLE_HIDDEN_COLUMNS
71 SQLITE_ENABLE_ICU
72 SQLITE_ENABLE_IOTRACE
73 SQLITE_ENABLE_JSON1
74 SQLITE_ENABLE_LOAD_EXTENSION
75 SQLITE_ENABLE_LOCKING_STYLE
larrybrf8fb27f2021-04-15 00:26:34 +000076 SQLITE_ENABLE_MATH_FUNCTIONS
danda1f49b2017-06-16 19:51:47 +000077 SQLITE_ENABLE_MEMORY_MANAGEMENT
78 SQLITE_ENABLE_MEMSYS3
79 SQLITE_ENABLE_MEMSYS5
80 SQLITE_ENABLE_MULTIPLEX
larrybrf8fb27f2021-04-15 00:26:34 +000081 SQLITE_ENABLE_NORMALIZE
danda1f49b2017-06-16 19:51:47 +000082 SQLITE_ENABLE_NULL_TRIM
larrybrf8fb27f2021-04-15 00:26:34 +000083 SQLITE_ENABLE_OFFSET_SQL_FUNC
danda1f49b2017-06-16 19:51:47 +000084 SQLITE_ENABLE_OVERSIZE_CELL_CHECK
85 SQLITE_ENABLE_PREUPDATE_HOOK
larrybrf8fb27f2021-04-15 00:26:34 +000086 SQLITE_ENABLE_QPSG
danda1f49b2017-06-16 19:51:47 +000087 SQLITE_ENABLE_RBU
88 SQLITE_ENABLE_RTREE
89 SQLITE_ENABLE_SELECTTRACE
90 SQLITE_ENABLE_SESSION
91 SQLITE_ENABLE_SNAPSHOT
larrybrf8fb27f2021-04-15 00:26:34 +000092 SQLITE_ENABLE_SORTER_REFERENCES
danda1f49b2017-06-16 19:51:47 +000093 SQLITE_ENABLE_SQLLOG
larrybrf8fb27f2021-04-15 00:26:34 +000094 SQLITE_ENABLE_STAT4
danda1f49b2017-06-16 19:51:47 +000095 SQLITE_ENABLE_STMT_SCANSTATUS
larrybrf8fb27f2021-04-15 00:26:34 +000096 SQLITE_ENABLE_STMTVTAB
danda1f49b2017-06-16 19:51:47 +000097 SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
98 SQLITE_ENABLE_UNLOCK_NOTIFY
99 SQLITE_ENABLE_UPDATE_DELETE_LIMIT
100 SQLITE_ENABLE_URI_00_ERROR
101 SQLITE_ENABLE_VFSTRACE
102 SQLITE_ENABLE_WHERETRACE
103 SQLITE_ENABLE_ZIPVFS
104 SQLITE_EXPLAIN_ESTIMATED_ROWS
105 SQLITE_EXTRA_IFNULLROW
106 SQLITE_FTS5_ENABLE_TEST_MI
107 SQLITE_FTS5_NO_WITHOUT_ROWID
danda1f49b2017-06-16 19:51:47 +0000108 SQLITE_IGNORE_AFP_LOCK_ERRORS
109 SQLITE_IGNORE_FLOCK_LOCK_ERRORS
110 SQLITE_INLINE_MEMCPY
111 SQLITE_INT64_TYPE
112 SQLITE_LIKE_DOESNT_MATCH_BLOBS
113 SQLITE_LOCK_TRACE
114 SQLITE_LOG_CACHE_SPILL
115 SQLITE_MEMDEBUG
116 SQLITE_MIXED_ENDIAN_64BIT_FLOAT
117 SQLITE_MMAP_READWRITE
118 SQLITE_MUTEX_NOOP
danda1f49b2017-06-16 19:51:47 +0000119 SQLITE_MUTEX_OMIT
120 SQLITE_MUTEX_PTHREADS
121 SQLITE_MUTEX_W32
122 SQLITE_NEED_ERR_NAME
danda1f49b2017-06-16 19:51:47 +0000123 SQLITE_NO_SYNC
124 SQLITE_OMIT_ALTERTABLE
125 SQLITE_OMIT_ANALYZE
126 SQLITE_OMIT_ATTACH
127 SQLITE_OMIT_AUTHORIZATION
128 SQLITE_OMIT_AUTOINCREMENT
129 SQLITE_OMIT_AUTOINIT
130 SQLITE_OMIT_AUTOMATIC_INDEX
131 SQLITE_OMIT_AUTORESET
132 SQLITE_OMIT_AUTOVACUUM
133 SQLITE_OMIT_BETWEEN_OPTIMIZATION
134 SQLITE_OMIT_BLOB_LITERAL
danda1f49b2017-06-16 19:51:47 +0000135 SQLITE_OMIT_CAST
136 SQLITE_OMIT_CHECK
137 SQLITE_OMIT_COMPLETE
138 SQLITE_OMIT_COMPOUND_SELECT
139 SQLITE_OMIT_CONFLICT_CLAUSE
140 SQLITE_OMIT_CTE
danda1f49b2017-06-16 19:51:47 +0000141 SQLITE_OMIT_DECLTYPE
142 SQLITE_OMIT_DEPRECATED
larrybr14e250a2021-05-19 20:01:53 +0000143 SQLITE_OMIT_DESERIALIZE
danda1f49b2017-06-16 19:51:47 +0000144 SQLITE_OMIT_DISKIO
145 SQLITE_OMIT_EXPLAIN
146 SQLITE_OMIT_FLAG_PRAGMAS
147 SQLITE_OMIT_FLOATING_POINT
148 SQLITE_OMIT_FOREIGN_KEY
149 SQLITE_OMIT_GET_TABLE
150 SQLITE_OMIT_HEX_INTEGER
151 SQLITE_OMIT_INCRBLOB
152 SQLITE_OMIT_INTEGRITY_CHECK
larrybrf8fb27f2021-04-15 00:26:34 +0000153 SQLITE_OMIT_INTROSPECTION_PRAGMAS
danda1f49b2017-06-16 19:51:47 +0000154 SQLITE_OMIT_LIKE_OPTIMIZATION
larrybr5ae13142021-04-16 10:25:54 +0000155 SQLITE_OMIT_LOAD_EXTENSION
danda1f49b2017-06-16 19:51:47 +0000156 SQLITE_OMIT_LOCALTIME
157 SQLITE_OMIT_LOOKASIDE
158 SQLITE_OMIT_MEMORYDB
159 SQLITE_OMIT_OR_OPTIMIZATION
160 SQLITE_OMIT_PAGER_PRAGMAS
161 SQLITE_OMIT_PARSER_TRACE
162 SQLITE_OMIT_POPEN
163 SQLITE_OMIT_PRAGMA
164 SQLITE_OMIT_PROGRESS_CALLBACK
165 SQLITE_OMIT_QUICKBALANCE
166 SQLITE_OMIT_REINDEX
167 SQLITE_OMIT_SCHEMA_PRAGMAS
168 SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
169 SQLITE_OMIT_SHARED_CACHE
170 SQLITE_OMIT_SHUTDOWN_DIRECTORIES
171 SQLITE_OMIT_SUBQUERY
172 SQLITE_OMIT_TCL_VARIABLE
173 SQLITE_OMIT_TEMPDB
174 SQLITE_OMIT_TEST_CONTROL
danda1f49b2017-06-16 19:51:47 +0000175 SQLITE_OMIT_TRIGGER
176 SQLITE_OMIT_TRUNCATE_OPTIMIZATION
177 SQLITE_OMIT_UTF16
178 SQLITE_OMIT_VACUUM
179 SQLITE_OMIT_VIEW
180 SQLITE_OMIT_VIRTUALTABLE
181 SQLITE_OMIT_WAL
182 SQLITE_OMIT_WSD
183 SQLITE_OMIT_XFER_OPT
184 SQLITE_PCACHE_SEPARATE_HEADER
185 SQLITE_PERFORMANCE_TRACE
danda1f49b2017-06-16 19:51:47 +0000186 SQLITE_PREFER_PROXY_LOCKING
187 SQLITE_PROXY_DEBUG
188 SQLITE_REVERSE_UNORDERED_SELECTS
189 SQLITE_RTREE_INT_ONLY
190 SQLITE_SECURE_DELETE
191 SQLITE_SMALL_STACK
192 SQLITE_SOUNDEX
193 SQLITE_SUBSTR_COMPATIBILITY
danda1f49b2017-06-16 19:51:47 +0000194 SQLITE_TCL
195 SQLITE_TEST
196 SQLITE_UNLINK_AFTER_CLOSE
197 SQLITE_UNTESTABLE
198 SQLITE_USE_ALLOCA
199 SQLITE_USE_FCNTL_TRACE
200 SQLITE_USER_AUTHENTICATION
201 SQLITE_USE_URI
202 SQLITE_VDBE_COVERAGE
203 SQLITE_WIN32_MALLOC
204 SQLITE_ZERO_MALLOC
205}
206
larrybrf8fb27f2021-04-15 00:26:34 +0000207# All compile time options for which the assigned value is other than boolean
208# and is a comma-separated scalar pair.
209#
210set value2_options {
211 SQLITE_DEFAULT_LOOKASIDE
212}
213
214# All compile time options for which the assigned value is other than boolean
215# and is a single scalar.
danda1f49b2017-06-16 19:51:47 +0000216#
217set value_options {
drha612c1c2021-07-05 18:37:37 +0000218 SQLITE_ATOMIC_INTRINSICS
danda1f49b2017-06-16 19:51:47 +0000219 SQLITE_BITMASK_TYPE
220 SQLITE_DEFAULT_CACHE_SIZE
221 SQLITE_DEFAULT_FILE_FORMAT
222 SQLITE_DEFAULT_FILE_PERMISSIONS
223 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
224 SQLITE_DEFAULT_LOCKING_MODE
danda1f49b2017-06-16 19:51:47 +0000225 SQLITE_DEFAULT_MMAP_SIZE
226 SQLITE_DEFAULT_PAGE_SIZE
227 SQLITE_DEFAULT_PCACHE_INITSZ
228 SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
229 SQLITE_DEFAULT_ROWEST
230 SQLITE_DEFAULT_SECTOR_SIZE
231 SQLITE_DEFAULT_SYNCHRONOUS
232 SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
233 SQLITE_DEFAULT_WAL_SYNCHRONOUS
234 SQLITE_DEFAULT_WORKER_THREADS
235 SQLITE_ENABLE_8_3_NAMES
larrybrf8fb27f2021-04-15 00:26:34 +0000236 SQLITE_ENABLE_CEROD
danda1f49b2017-06-16 19:51:47 +0000237 SQLITE_ENABLE_LOCKING_STYLE
238 SQLITE_EXTRA_INIT
239 SQLITE_EXTRA_SHUTDOWN
240 SQLITE_FTS3_MAX_EXPR_DEPTH
241 SQLITE_INTEGRITY_CHECK_ERROR_MAX
242 SQLITE_MALLOC_SOFT_LIMIT
243 SQLITE_MAX_ATTACHED
244 SQLITE_MAX_COLUMN
245 SQLITE_MAX_COMPOUND_SELECT
246 SQLITE_MAX_DEFAULT_PAGE_SIZE
247 SQLITE_MAX_EXPR_DEPTH
248 SQLITE_MAX_FUNCTION_ARG
249 SQLITE_MAX_LENGTH
250 SQLITE_MAX_LIKE_PATTERN_LENGTH
251 SQLITE_MAX_MEMORY
252 SQLITE_MAX_MMAP_SIZE
253 SQLITE_MAX_MMAP_SIZE_
254 SQLITE_MAX_PAGE_COUNT
255 SQLITE_MAX_PAGE_SIZE
256 SQLITE_MAX_SCHEMA_RETRY
257 SQLITE_MAX_SQL_LENGTH
258 SQLITE_MAX_TRIGGER_DEPTH
259 SQLITE_MAX_VARIABLE_NUMBER
260 SQLITE_MAX_VDBE_OP
261 SQLITE_MAX_WORKER_THREADS
262 SQLITE_SORTER_PMASZ
263 SQLITE_STAT4_SAMPLES
264 SQLITE_STMTJRNL_SPILL
265 SQLITE_TEMP_STORE
danda1f49b2017-06-16 19:51:47 +0000266}
267
268# Options that require custom code.
269#
danda1f49b2017-06-16 19:51:47 +0000270set options(COMPILER) {
271#if defined(__clang__) && defined(__clang_major__)
272 "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "."
273 CTIMEOPT_VAL(__clang_minor__) "."
274 CTIMEOPT_VAL(__clang_patchlevel__),
275#elif defined(_MSC_VER)
276 "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER),
277#elif defined(__GNUC__) && defined(__VERSION__)
278 "COMPILER=gcc-" __VERSION__,
279#endif
280}
281set options(HAVE_ISNAN) {
282#if HAVE_ISNAN || SQLITE_HAVE_ISNAN
283 "HAVE_ISNAN",
284#endif
285}
larrybr5ae13142021-04-16 10:25:54 +0000286set options(OMIT_DATETIME_FUNCS) {
287#if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT)
288 "OMIT_DATETIME_FUNCS",
289#endif
290}
291set options(SYSTEM_MALLOC) "\
292#if (!defined(SQLITE_WIN32_MALLOC) \\
293 && !defined(SQLITE_ZERO_MALLOC) \\
294 && !defined(SQLITE_MEMDEBUG) \\
295 ) || defined(SQLITE_SYSTEM_MALLOC)
296 \"SYSTEM_MALLOC\",
297#endif
298"
dan814aad62017-06-17 17:29:24 +0000299set options(THREADSAFE) {
300#if defined(SQLITE_THREADSAFE)
301 "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
302#elif defined(THREADSAFE)
303 "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE),
304#else
larrybrf8fb27f2021-04-15 00:26:34 +0000305 "THREADSAFE=1",
dan814aad62017-06-17 17:29:24 +0000306#endif
307}
danda1f49b2017-06-16 19:51:47 +0000308
309proc trim_name {in} {
310 set ret $in
311 if {[string range $in 0 6]=="SQLITE_"} {
312 set ret [string range $in 7 end]
313 }
314 return $ret
315}
316
larrybrcf5ad422021-04-15 23:43:25 +0000317foreach name_defval $boolean_defnnz_options {
318 set b [lindex $name_defval 0]
319 set defval [lindex $name_defval 1]
320 set name [trim_name $b]
321 set options($name) [subst {
322#ifdef $b
323# if $b != $defval
324 "$name=" CTIMEOPT_VAL($b),
325# endif
326#endif
327}]
328}
329
330foreach b $boolean_defnil_options {
danda1f49b2017-06-16 19:51:47 +0000331 set name [trim_name $b]
332 set options($name) [subst {
drha612c1c2021-07-05 18:37:37 +0000333#ifdef $b
danda1f49b2017-06-16 19:51:47 +0000334 "$name",
335#endif
336}]
337}
338
339foreach v $value_options {
340 set name [trim_name $v]
341 set options($name) [subst {
342#ifdef $v
343 "$name=" CTIMEOPT_VAL($v),
344#endif
345}]
346}
larrybrf8fb27f2021-04-15 00:26:34 +0000347
348foreach v $value2_options {
349 set name [trim_name $v]
350 set options($name) [subst {
351#ifdef $v
352 "$name=" CTIMEOPT_VAL2($v),
353#endif
354}]
355}
danda1f49b2017-06-16 19:51:47 +0000356
larrybrf8fb27f2021-04-15 00:26:34 +0000357# Split a string on a regex, return all parts in order.
358# Any elements with an even index may be empty.
359# Elements with odd indices will match the regex.
360proc split_on_re {re str {nrepps 1}} {
361 set chunks {}
362 set cix 0
363 set resm [regexp -all -inline -indices $re $str]
364 if {[llength $resm]==0} {
365 return $str
366 }
367 set rix 0
368 while {$rix < [llength $resm]} {
369 set mre [lindex $resm $rix]
370 incr rix $nrepps
371 set mbx [lindex $mre 0]
372 set mex [lindex $mre 1]
373 lappend chunks [string range $str $cix [expr $mbx - 1]]
374 lappend chunks [string range $str $mbx $mex]
375 set cix [expr $mex + 1]
376 }
377 lappend chunks [string range $str $cix end]
378 return $chunks
danda1f49b2017-06-16 19:51:47 +0000379}
380
381
larrybrf8fb27f2021-04-15 00:26:34 +0000382set ctime_c "src/ctime.c"
383if {[catch {set cfd [open $ctime_c r]}]!=0} {
384 puts stderr "File '$ctime_c' unreadable. Run this script from checkout root."
385 exit 1;
386}
387
388set ctfc [read $cfd]
389close $cfd
390
391set re {/\*\s+\*+\s*((BEGIN)|(END)) CODE GENERATED BY (\S+)\s+\*/\s+}
392set renpp 5
393
394set ctfcChunks [split_on_re $re $ctfc $renpp]
395if {[llength $ctfcChunks] != 5} {
396 puts stderr "File '$ctime_c' has too few generated code markers."
397 exit 1;
398}
399
400if {[catch {set cfd [open $ctime_c w]}]!=0} {
401 puts stderr "File '$ctime_c' unwritable."
402 exit 1;
403}
404
405puts -nonewline $cfd [lindex $ctfcChunks 0]
406puts -nonewline $cfd [lindex $ctfcChunks 1]
407foreach o [lsort [array names options]] {
408 puts $cfd [string trim $options($o)]
409}
410puts -nonewline $cfd [lindex $ctfcChunks 3]
411puts -nonewline $cfd [lindex $ctfcChunks 4]
412
413close $cfd