relocate includes to crypto.h
[sqlcipher.git] / tool / mkctimec.tcl
blob6294609451d9d51e9a6fa825ce25db25e41b39d7
1 #!/usr/bin/tclsh
3 # To build the
5 # const char **azCompileOpt[]
7 # definition used in src/ctime.c, run this script from
8 # the checkout root. It alters src/ctime.c in-place.
11 # 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.
15 set boolean_defnnz_options {
16 {SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1}
17 {SQLITE_POWERSAFE_OVERWRITE 1}
18 {SQLITE_DEFAULT_MEMSTATUS 1}
19 {SQLITE_OMIT_TRACE 1}
20 {SQLITE_ALLOW_COVERING_INDEX_SCAN 1}
23 # All Boolean compile time options which default to 0 or empty.
25 set boolean_defnil_options {
26 SQLITE_32BIT_ROWID
27 SQLITE_4_BYTE_ALIGNED_MALLOC
28 SQLITE_64BIT_STATS
29 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
40 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
54 SQLITE_ENABLE_BATCH_ATOMIC_WRITE
55 SQLITE_ENABLE_BYTECODE_VTAB
56 SQLITE_ENABLE_COLUMN_METADATA
57 SQLITE_ENABLE_COLUMN_USED_MASK
58 SQLITE_ENABLE_COSTMULT
59 SQLITE_ENABLE_CURSOR_HINTS
60 SQLITE_ENABLE_DBPAGE_VTAB
61 SQLITE_ENABLE_DBSTAT_VTAB
62 SQLITE_ENABLE_EXPENSIVE_ASSERT
63 SQLITE_ENABLE_EXPLAIN_COMMENTS
64 SQLITE_ENABLE_FTS3
65 SQLITE_ENABLE_FTS3_PARENTHESIS
66 SQLITE_ENABLE_FTS3_TOKENIZER
67 SQLITE_ENABLE_FTS4
68 SQLITE_ENABLE_FTS5
69 SQLITE_ENABLE_GEOPOLY
70 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
76 SQLITE_ENABLE_MATH_FUNCTIONS
77 SQLITE_ENABLE_MEMORY_MANAGEMENT
78 SQLITE_ENABLE_MEMSYS3
79 SQLITE_ENABLE_MEMSYS5
80 SQLITE_ENABLE_MULTIPLEX
81 SQLITE_ENABLE_NORMALIZE
82 SQLITE_ENABLE_NULL_TRIM
83 SQLITE_ENABLE_OFFSET_SQL_FUNC
84 SQLITE_ENABLE_OVERSIZE_CELL_CHECK
85 SQLITE_ENABLE_PREUPDATE_HOOK
86 SQLITE_ENABLE_QPSG
87 SQLITE_ENABLE_RBU
88 SQLITE_ENABLE_RTREE
89 SQLITE_ENABLE_SELECTTRACE
90 SQLITE_ENABLE_SESSION
91 SQLITE_ENABLE_SNAPSHOT
92 SQLITE_ENABLE_SORTER_REFERENCES
93 SQLITE_ENABLE_SQLLOG
94 SQLITE_ENABLE_STAT4
95 SQLITE_ENABLE_STMT_SCANSTATUS
96 SQLITE_ENABLE_STMTVTAB
97 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
108 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
119 SQLITE_MUTEX_OMIT
120 SQLITE_MUTEX_PTHREADS
121 SQLITE_MUTEX_W32
122 SQLITE_NEED_ERR_NAME
123 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
135 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
141 SQLITE_OMIT_DECLTYPE
142 SQLITE_OMIT_DEPRECATED
143 SQLITE_OMIT_DESERIALIZE
144 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
153 SQLITE_OMIT_INTROSPECTION_PRAGMAS
154 SQLITE_OMIT_LIKE_OPTIMIZATION
155 SQLITE_OMIT_LOAD_EXTENSION
156 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
175 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
186 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
194 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
207 # All compile time options for which the assigned value is other than boolean
208 # and is a comma-separated scalar pair.
210 set value2_options {
211 SQLITE_DEFAULT_LOOKASIDE
214 # All compile time options for which the assigned value is other than boolean
215 # and is a single scalar.
217 set value_options {
218 SQLITE_ATOMIC_INTRINSICS
219 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
225 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
236 SQLITE_ENABLE_CEROD
237 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
268 # Options that require custom code.
270 set 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
281 set options(HAVE_ISNAN) {
282 #if HAVE_ISNAN || SQLITE_HAVE_ISNAN
283 "HAVE_ISNAN",
284 #endif
286 set options(OMIT_DATETIME_FUNCS) {
287 #if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT)
288 "OMIT_DATETIME_FUNCS",
289 #endif
291 set 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
299 set options(THREADSAFE) {
300 #if defined(SQLITE_THREADSAFE)
301 "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
302 #elif defined(THREADSAFE)
303 "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE),
304 #else
305 "THREADSAFE=1",
306 #endif
309 proc trim_name {in} {
310 set ret $in
311 if {[string range $in 0 6]=="SQLITE_"} {
312 set ret [string range $in 7 end]
314 return $ret
317 foreach 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
330 foreach b $boolean_defnil_options {
331 set name [trim_name $b]
332 set options($name) [subst {
333 #ifdef $b
334 "$name",
335 #endif
339 foreach v $value_options {
340 set name [trim_name $v]
341 set options($name) [subst {
342 #ifdef $v
343 "$name=" CTIMEOPT_VAL($v),
344 #endif
348 foreach v $value2_options {
349 set name [trim_name $v]
350 set options($name) [subst {
351 #ifdef $v
352 "$name=" CTIMEOPT_VAL2($v),
353 #endif
357 # 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.
360 proc 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
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]
377 lappend chunks [string range $str $cix end]
378 return $chunks
382 set ctime_c "src/ctime.c"
383 if {[catch {set cfd [open $ctime_c r]}]!=0} {
384 puts stderr "File '$ctime_c' unreadable. Run this script from checkout root."
385 exit 1;
388 set ctfc [read $cfd]
389 close $cfd
391 set re {/\*\s+\*+\s*((BEGIN)|(END)) CODE GENERATED BY (\S+)\s+\*/\s+}
392 set renpp 5
394 set ctfcChunks [split_on_re $re $ctfc $renpp]
395 if {[llength $ctfcChunks] != 5} {
396 puts stderr "File '$ctime_c' has too few generated code markers."
397 exit 1;
400 if {[catch {set cfd [open $ctime_c w]}]!=0} {
401 puts stderr "File '$ctime_c' unwritable."
402 exit 1;
405 puts -nonewline $cfd [lindex $ctfcChunks 0]
406 puts -nonewline $cfd [lindex $ctfcChunks 1]
407 foreach o [lsort [array names options]] {
408 puts $cfd [string trim $options($o)]
410 puts -nonewline $cfd [lindex $ctfcChunks 3]
411 puts -nonewline $cfd [lindex $ctfcChunks 4]
413 close $cfd