xref: /sqlite-3.40.0/tool/mkctimec.tcl (revision 3725af73)
1#!/usr/bin/tclsh
2#
3# To build the
4#
5#   const char **azCompileOpt[]
6#
7# definition used in src/ctime.c, run this script from
8# the checkout root. It generates src/ctime.c .
9#
10
11
12set ::headWarning {/* DO NOT EDIT!
13** This file is automatically generated by the script in the canonical
14** SQLite source tree at tool/mkctimec.tcl.
15**
16** To modify this header, edit any of the various lists in that script
17** which specify categories of generated conditionals in this file.
18*/}
19
20# Make { and } easier to put into literals (even on EBCDIC machines.)
21regexp {(\{)(\})} "{}" ma ::lb ::rb
22
23set ::headCode "
24/*
25** 2010 February 23
26**
27** The author disclaims copyright to this source code.  In place of
28** a legal notice, here is a blessing:
29**
30**    May you do good and not evil.
31**    May you find forgiveness for yourself and forgive others.
32**    May you share freely, never taking more than you give.
33**
34*************************************************************************
35**
36** This file implements routines used to report what compile-time options
37** SQLite was built with.
38*/
39#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */
40
41/*
42** Include the configuration header output by 'configure' if we're using the
43** autoconf-based build
44*/
45#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H)
46#include \"sqlite_cfg.h\"
47#define SQLITECONFIG_H 1
48#endif
49
50/* These macros are provided to \"stringify\" the value of the define
51** for those options in which the value is meaningful. */
52#define CTIMEOPT_VAL_(opt) #opt
53#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
54
55/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This
56** option requires a separate macro because legal values contain a single
57** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE=\"100,100\") */
58#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 \",\" #opt2
59#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt)
60#include \"sqliteInt.h\"
61
62/*
63** An array of names of all compile-time options.  This array should
64** be sorted A-Z.
65**
66** This array looks large, but in a typical installation actually uses
67** only a handful of compile-time options, so most times this array is usually
68** rather short and uses little memory space.
69*/
70static const char * const sqlite3azCompileOpt\[\] = $::lb
71"
72
73set ::tailCode "
74$::rb ;
75
76const char **sqlite3CompileOptions(int *pnOpt){
77  *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt\[0\]);
78  return (const char**)sqlite3azCompileOpt;
79}
80
81#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
82"
83
84# All Boolean compile time options which default to something
85# other than 0 or empty. The default is paired with the PP
86# symbol so that a differing define can be detected.
87#
88set boolean_defnnz_options {
89  {SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1}
90  {SQLITE_POWERSAFE_OVERWRITE 1}
91  {SQLITE_DEFAULT_MEMSTATUS 1}
92  {SQLITE_OMIT_TRACE 1}
93  {SQLITE_ALLOW_COVERING_INDEX_SCAN 1}
94}
95
96# All Boolean compile time options which default to 0 or empty.
97#
98set boolean_defnil_options {
99  SQLITE_32BIT_ROWID
100  SQLITE_4_BYTE_ALIGNED_MALLOC
101  SQLITE_64BIT_STATS
102  SQLITE_ALLOW_URI_AUTHORITY
103  SQLITE_BUG_COMPATIBLE_20160819
104  SQLITE_CASE_SENSITIVE_LIKE
105  SQLITE_CHECK_PAGES
106  SQLITE_COVERAGE_TEST
107  SQLITE_DEBUG
108  SQLITE_DEFAULT_AUTOMATIC_INDEX
109  SQLITE_DEFAULT_AUTOVACUUM
110  SQLITE_DEFAULT_CKPTFULLFSYNC
111  SQLITE_DEFAULT_FOREIGN_KEYS
112  SQLITE_DEFAULT_LOCKING_MODE
113  SQLITE_DEFAULT_RECURSIVE_TRIGGERS
114  SQLITE_DEFAULT_SYNCHRONOUS
115  SQLITE_DEFAULT_WAL_SYNCHRONOUS
116  SQLITE_DIRECT_OVERFLOW_READ
117  SQLITE_DISABLE_DIRSYNC
118  SQLITE_DISABLE_FTS3_UNICODE
119  SQLITE_DISABLE_FTS4_DEFERRED
120  SQLITE_DISABLE_INTRINSIC
121  SQLITE_DISABLE_LFS
122  SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
123  SQLITE_DISABLE_SKIPAHEAD_DISTINCT
124  SQLITE_ENABLE_8_3_NAMES
125  SQLITE_ENABLE_API_ARMOR
126  SQLITE_ENABLE_ATOMIC_WRITE
127  SQLITE_ENABLE_BATCH_ATOMIC_WRITE
128  SQLITE_ENABLE_BYTECODE_VTAB
129  SQLITE_ENABLE_COLUMN_METADATA
130  SQLITE_ENABLE_COLUMN_USED_MASK
131  SQLITE_ENABLE_COSTMULT
132  SQLITE_ENABLE_CURSOR_HINTS
133  SQLITE_ENABLE_DBPAGE_VTAB
134  SQLITE_ENABLE_DBSTAT_VTAB
135  SQLITE_ENABLE_EXPENSIVE_ASSERT
136  SQLITE_ENABLE_EXPLAIN_COMMENTS
137  SQLITE_ENABLE_FTS3
138  SQLITE_ENABLE_FTS3_PARENTHESIS
139  SQLITE_ENABLE_FTS3_TOKENIZER
140  SQLITE_ENABLE_FTS4
141  SQLITE_ENABLE_FTS5
142  SQLITE_ENABLE_GEOPOLY
143  SQLITE_ENABLE_HIDDEN_COLUMNS
144  SQLITE_ENABLE_ICU
145  SQLITE_ENABLE_IOTRACE
146  SQLITE_ENABLE_LOAD_EXTENSION
147  SQLITE_ENABLE_LOCKING_STYLE
148  SQLITE_ENABLE_MATH_FUNCTIONS
149  SQLITE_ENABLE_MEMORY_MANAGEMENT
150  SQLITE_ENABLE_MEMSYS3
151  SQLITE_ENABLE_MEMSYS5
152  SQLITE_ENABLE_MULTIPLEX
153  SQLITE_ENABLE_NORMALIZE
154  SQLITE_ENABLE_NULL_TRIM
155  SQLITE_ENABLE_OFFSET_SQL_FUNC
156  SQLITE_ENABLE_OVERSIZE_CELL_CHECK
157  SQLITE_ENABLE_PREUPDATE_HOOK
158  SQLITE_ENABLE_QPSG
159  SQLITE_ENABLE_RBU
160  SQLITE_ENABLE_RTREE
161  SQLITE_ENABLE_SESSION
162  SQLITE_ENABLE_SNAPSHOT
163  SQLITE_ENABLE_SORTER_REFERENCES
164  SQLITE_ENABLE_SQLLOG
165  SQLITE_ENABLE_STAT4
166  SQLITE_ENABLE_STMT_SCANSTATUS
167  SQLITE_ENABLE_STMTVTAB
168  SQLITE_ENABLE_TREETRACE
169  SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
170  SQLITE_ENABLE_UNLOCK_NOTIFY
171  SQLITE_ENABLE_UPDATE_DELETE_LIMIT
172  SQLITE_ENABLE_URI_00_ERROR
173  SQLITE_ENABLE_VFSTRACE
174  SQLITE_ENABLE_WHERETRACE
175  SQLITE_ENABLE_ZIPVFS
176  SQLITE_EXPLAIN_ESTIMATED_ROWS
177  SQLITE_EXTRA_IFNULLROW
178  SQLITE_FTS5_ENABLE_TEST_MI
179  SQLITE_FTS5_NO_WITHOUT_ROWID
180  SQLITE_IGNORE_AFP_LOCK_ERRORS
181  SQLITE_IGNORE_FLOCK_LOCK_ERRORS
182  SQLITE_INLINE_MEMCPY
183  SQLITE_INT64_TYPE
184  SQLITE_LIKE_DOESNT_MATCH_BLOBS
185  SQLITE_LOCK_TRACE
186  SQLITE_LOG_CACHE_SPILL
187  SQLITE_MEMDEBUG
188  SQLITE_MIXED_ENDIAN_64BIT_FLOAT
189  SQLITE_MMAP_READWRITE
190  SQLITE_MUTEX_NOOP
191  SQLITE_MUTEX_OMIT
192  SQLITE_MUTEX_PTHREADS
193  SQLITE_MUTEX_W32
194  SQLITE_NEED_ERR_NAME
195  SQLITE_NO_SYNC
196  SQLITE_OMIT_ALTERTABLE
197  SQLITE_OMIT_ANALYZE
198  SQLITE_OMIT_ATTACH
199  SQLITE_OMIT_AUTHORIZATION
200  SQLITE_OMIT_AUTOINCREMENT
201  SQLITE_OMIT_AUTOINIT
202  SQLITE_OMIT_AUTOMATIC_INDEX
203  SQLITE_OMIT_AUTORESET
204  SQLITE_OMIT_AUTOVACUUM
205  SQLITE_OMIT_BETWEEN_OPTIMIZATION
206  SQLITE_OMIT_BLOB_LITERAL
207  SQLITE_OMIT_CAST
208  SQLITE_OMIT_CHECK
209  SQLITE_OMIT_COMPLETE
210  SQLITE_OMIT_COMPOUND_SELECT
211  SQLITE_OMIT_CONFLICT_CLAUSE
212  SQLITE_OMIT_CTE
213  SQLITE_OMIT_DECLTYPE
214  SQLITE_OMIT_DEPRECATED
215  SQLITE_OMIT_DESERIALIZE
216  SQLITE_OMIT_DISKIO
217  SQLITE_OMIT_EXPLAIN
218  SQLITE_OMIT_FLAG_PRAGMAS
219  SQLITE_OMIT_FLOATING_POINT
220  SQLITE_OMIT_FOREIGN_KEY
221  SQLITE_OMIT_GET_TABLE
222  SQLITE_OMIT_HEX_INTEGER
223  SQLITE_OMIT_INCRBLOB
224  SQLITE_OMIT_INTEGRITY_CHECK
225  SQLITE_OMIT_INTROSPECTION_PRAGMAS
226  SQLITE_OMIT_JSON
227  SQLITE_OMIT_LIKE_OPTIMIZATION
228  SQLITE_OMIT_LOAD_EXTENSION
229  SQLITE_OMIT_LOCALTIME
230  SQLITE_OMIT_LOOKASIDE
231  SQLITE_OMIT_MEMORYDB
232  SQLITE_OMIT_OR_OPTIMIZATION
233  SQLITE_OMIT_PAGER_PRAGMAS
234  SQLITE_OMIT_PARSER_TRACE
235  SQLITE_OMIT_POPEN
236  SQLITE_OMIT_PRAGMA
237  SQLITE_OMIT_PROGRESS_CALLBACK
238  SQLITE_OMIT_QUICKBALANCE
239  SQLITE_OMIT_REINDEX
240  SQLITE_OMIT_SCHEMA_PRAGMAS
241  SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
242  SQLITE_OMIT_SHARED_CACHE
243  SQLITE_OMIT_SHUTDOWN_DIRECTORIES
244  SQLITE_OMIT_SUBQUERY
245  SQLITE_OMIT_TCL_VARIABLE
246  SQLITE_OMIT_TEMPDB
247  SQLITE_OMIT_TEST_CONTROL
248  SQLITE_OMIT_TRIGGER
249  SQLITE_OMIT_TRUNCATE_OPTIMIZATION
250  SQLITE_OMIT_UTF16
251  SQLITE_OMIT_VACUUM
252  SQLITE_OMIT_VIEW
253  SQLITE_OMIT_VIRTUALTABLE
254  SQLITE_OMIT_WAL
255  SQLITE_OMIT_WSD
256  SQLITE_OMIT_XFER_OPT
257  SQLITE_PERFORMANCE_TRACE
258  SQLITE_PREFER_PROXY_LOCKING
259  SQLITE_PROXY_DEBUG
260  SQLITE_REVERSE_UNORDERED_SELECTS
261  SQLITE_RTREE_INT_ONLY
262  SQLITE_SECURE_DELETE
263  SQLITE_SMALL_STACK
264  SQLITE_SOUNDEX
265  SQLITE_SUBSTR_COMPATIBILITY
266  SQLITE_TCL
267  SQLITE_TEST
268  SQLITE_UNLINK_AFTER_CLOSE
269  SQLITE_UNTESTABLE
270  SQLITE_USE_ALLOCA
271  SQLITE_USE_FCNTL_TRACE
272  SQLITE_USER_AUTHENTICATION
273  SQLITE_USE_URI
274  SQLITE_VDBE_COVERAGE
275  SQLITE_WIN32_MALLOC
276  SQLITE_ZERO_MALLOC
277}
278
279# All compile time options for which the assigned value is other than boolean
280# and is a comma-separated scalar pair.
281#
282set value2_options {
283  SQLITE_DEFAULT_LOOKASIDE
284}
285
286# All compile time options for which the assigned value is other than boolean
287# and is a single scalar.
288#
289set value_options {
290  SQLITE_ATOMIC_INTRINSICS
291  SQLITE_BITMASK_TYPE
292  SQLITE_DEFAULT_CACHE_SIZE
293  SQLITE_DEFAULT_FILE_FORMAT
294  SQLITE_DEFAULT_FILE_PERMISSIONS
295  SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
296  SQLITE_DEFAULT_LOCKING_MODE
297  SQLITE_DEFAULT_MMAP_SIZE
298  SQLITE_DEFAULT_PAGE_SIZE
299  SQLITE_DEFAULT_PCACHE_INITSZ
300  SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
301  SQLITE_DEFAULT_ROWEST
302  SQLITE_DEFAULT_SECTOR_SIZE
303  SQLITE_DEFAULT_SYNCHRONOUS
304  SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
305  SQLITE_DEFAULT_WAL_SYNCHRONOUS
306  SQLITE_DEFAULT_WORKER_THREADS
307  SQLITE_DQS
308  SQLITE_ENABLE_8_3_NAMES
309  SQLITE_ENABLE_CEROD
310  SQLITE_ENABLE_LOCKING_STYLE
311  SQLITE_EXTRA_INIT
312  SQLITE_EXTRA_SHUTDOWN
313  SQLITE_FTS3_MAX_EXPR_DEPTH
314  SQLITE_INTEGRITY_CHECK_ERROR_MAX
315  SQLITE_MALLOC_SOFT_LIMIT
316  SQLITE_MAX_ATTACHED
317  SQLITE_MAX_COLUMN
318  SQLITE_MAX_COMPOUND_SELECT
319  SQLITE_MAX_DEFAULT_PAGE_SIZE
320  SQLITE_MAX_EXPR_DEPTH
321  SQLITE_MAX_FUNCTION_ARG
322  SQLITE_MAX_LENGTH
323  SQLITE_MAX_LIKE_PATTERN_LENGTH
324  SQLITE_MAX_MEMORY
325  SQLITE_MAX_MMAP_SIZE
326  SQLITE_MAX_MMAP_SIZE_
327  SQLITE_MAX_PAGE_COUNT
328  SQLITE_MAX_PAGE_SIZE
329  SQLITE_MAX_SCHEMA_RETRY
330  SQLITE_MAX_SQL_LENGTH
331  SQLITE_MAX_TRIGGER_DEPTH
332  SQLITE_MAX_VARIABLE_NUMBER
333  SQLITE_MAX_VDBE_OP
334  SQLITE_MAX_WORKER_THREADS
335  SQLITE_SORTER_PMASZ
336  SQLITE_STAT4_SAMPLES
337  SQLITE_STMTJRNL_SPILL
338  SQLITE_TEMP_STORE
339}
340
341# Options that require custom code.
342#
343set options(COMPILER) {
344#if defined(__clang__) && defined(__clang_major__)
345  "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "."
346                    CTIMEOPT_VAL(__clang_minor__) "."
347                    CTIMEOPT_VAL(__clang_patchlevel__),
348#elif defined(_MSC_VER)
349  "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER),
350#elif defined(__GNUC__) && defined(__VERSION__)
351  "COMPILER=gcc-" __VERSION__,
352#endif
353}
354set options(HAVE_ISNAN) {
355#if HAVE_ISNAN || SQLITE_HAVE_ISNAN
356  "HAVE_ISNAN",
357#endif
358}
359set options(OMIT_DATETIME_FUNCS) {
360#if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT)
361  "OMIT_DATETIME_FUNCS",
362#endif
363}
364set options(SYSTEM_MALLOC) "\
365#if (!defined(SQLITE_WIN32_MALLOC) \\
366     && !defined(SQLITE_ZERO_MALLOC) \\
367     && !defined(SQLITE_MEMDEBUG) \\
368    ) || defined(SQLITE_SYSTEM_MALLOC)
369  \"SYSTEM_MALLOC\",
370#endif
371"
372set options(THREADSAFE) {
373#if defined(SQLITE_THREADSAFE)
374  "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
375#elif defined(THREADSAFE)
376  "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE),
377#else
378  "THREADSAFE=1",
379#endif
380}
381
382proc trim_name {in} {
383  set ret $in
384  if {[string range $in 0 6]=="SQLITE_"} {
385    set ret [string range $in 7 end]
386  }
387  return $ret
388}
389
390foreach name_defval $boolean_defnnz_options {
391  set b [lindex $name_defval 0]
392  set defval [lindex $name_defval 1]
393  set name [trim_name $b]
394  set options($name) [subst {
395#ifdef $b
396# if $b != $defval
397  "$name=" CTIMEOPT_VAL($b),
398# endif
399#endif
400}]
401}
402
403foreach b $boolean_defnil_options {
404  set name [trim_name $b]
405  set options($name) [subst {
406#ifdef $b
407  "$name",
408#endif
409}]
410}
411
412foreach v $value_options {
413  set name [trim_name $v]
414  set options($name) [subst {
415#ifdef $v
416  "$name=" CTIMEOPT_VAL($v),
417#endif
418}]
419}
420
421foreach v $value2_options {
422  set name [trim_name $v]
423  set options($name) [subst {
424#ifdef $v
425  "$name=" CTIMEOPT_VAL2($v),
426#endif
427}]
428}
429
430set ctime_c "src/ctime.c"
431
432if {[catch {set cfd [open $ctime_c w]}]!=0} {
433  puts stderr "File '$ctime_c' unwritable."
434  exit 1;
435}
436
437puts $cfd $::headWarning;
438puts $cfd $::headCode;
439foreach o [lsort [array names options]] {
440  puts $cfd [string trim $options($o)]
441}
442puts -nonewline $cfd $::tailCode;
443
444close $cfd
445