blob: 596787d4fd0e6b5e520924a392fe104094f47da3 [file] [log] [blame]
drh91c58e22007-03-27 12:04:04 +00001#!/usr/bin/tclsh
2#
3# To build a single huge source file holding all of SQLite (or at
mistachkin4ef916e2016-08-24 19:58:46 +00004# least the core components - the test harness, shell, and TCL
drh91c58e22007-03-27 12:04:04 +00005# interface are omitted.) first do
6#
7# make target_source
8#
drh98495b42007-03-31 22:29:05 +00009# The make target above moves all of the source code files into
10# a subdirectory named "tsrc". (This script expects to find the files
11# there and will not work if they are not found.) There are a few
12# generated C code files that are also added to the tsrc directory.
13# For example, the "parse.c" and "parse.h" files to implement the
mistachkin4ef916e2016-08-24 19:58:46 +000014# the parser are derived from "parse.y" using lemon. And the
drh98495b42007-03-31 22:29:05 +000015# "keywordhash.h" files is generated by a program named "mkkeywordhash".
drh91c58e22007-03-27 12:04:04 +000016#
drh98495b42007-03-31 22:29:05 +000017# After the "tsrc" directory has been created and populated, run
18# this script:
drh91c58e22007-03-27 12:04:04 +000019#
drh84ab9532015-05-04 17:06:39 +000020# tclsh mksqlite3c.tcl --srcdir $SRC
drh91c58e22007-03-27 12:04:04 +000021#
drh98495b42007-03-31 22:29:05 +000022# The amalgamated SQLite code will be written into sqlite3.c
23#
24
drh8de5a172009-07-20 12:25:44 +000025# Begin by reading the "sqlite3.h" header file. Extract the version number
drhe191e2c2013-03-19 15:23:18 +000026# from in this file. The version number is needed to generate the header
drh8de5a172009-07-20 12:25:44 +000027# comment of the amalgamation.
drh98495b42007-03-31 22:29:05 +000028#
drh84ab9532015-05-04 17:06:39 +000029set addstatic 1
30set linemacros 0
mistachkin4ef916e2016-08-24 19:58:46 +000031set useapicall 0
drh84ab9532015-05-04 17:06:39 +000032for {set i 0} {$i<[llength $argv]} {incr i} {
33 set x [lindex $argv $i]
34 if {[regexp {^-+nostatic$} $x]} {
35 set addstatic 0
36 } elseif {[regexp {^-+linemacros} $x]} {
37 set linemacros 1
mistachkin4ef916e2016-08-24 19:58:46 +000038 } elseif {[regexp {^-+useapicall} $x]} {
39 set useapicall 1
drh84ab9532015-05-04 17:06:39 +000040 } else {
41 error "unknown command-line option: $x"
42 }
drh96e50882011-08-15 15:27:20 +000043}
drh98495b42007-03-31 22:29:05 +000044set in [open tsrc/sqlite3.h]
45set cnt 0
46set VERSION ?????
47while {![eof $in]} {
48 set line [gets $in]
49 if {$line=="" && [eof $in]} break
50 incr cnt
51 regexp {#define\s+SQLITE_VERSION\s+"(.*)"} $line all VERSION
52}
53close $in
drh91c58e22007-03-27 12:04:04 +000054
55# Open the output file and write a header comment at the beginning
56# of the file.
57#
58set out [open sqlite3.c w]
shaneh5e0fb2c2011-06-17 15:54:59 +000059# Force the output to use unix line endings, even on Windows.
drhced174b2011-06-20 15:24:22 +000060fconfigure $out -translation lf
drh98495b42007-03-31 22:29:05 +000061set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1]
62puts $out [subst \
63{/******************************************************************************
drh19df3352007-04-01 01:57:41 +000064** This file is an amalgamation of many separate C source files from SQLite
mistachkin4ef916e2016-08-24 19:58:46 +000065** version $VERSION. By combining all the individual C code files into this
drh1d210212011-04-01 18:12:58 +000066** single large file, the entire code can be compiled as a single translation
drh98495b42007-03-31 22:29:05 +000067** unit. This allows many compilers to do optimizations that would not be
68** possible if the files were compiled separately. Performance improvements
drh0ee68622010-10-31 22:42:27 +000069** of 5% or more are commonly seen when SQLite is compiled as a single
drh98495b42007-03-31 22:29:05 +000070** translation unit.
71**
72** This file is all you need to compile SQLite. To use SQLite in other
73** programs, you need this file and the "sqlite3.h" header file that defines
mistachkin4ef916e2016-08-24 19:58:46 +000074** the programming interface to the SQLite library. (If you do not have
drh8de5a172009-07-20 12:25:44 +000075** the "sqlite3.h" header file at hand, you will find a copy embedded within
76** the text of this file. Search for "Begin file sqlite3.h" to find the start
77** of the embedded sqlite3.h header file.) Additional code files may be needed
78** if you want a wrapper to interface SQLite with your choice of programming
79** language. The code for the "sqlite3" command-line shell is also in a
80** separate file. This file contains only code for the core SQLite library.
drhbd08af42007-04-05 21:58:33 +000081*/
danielk19777c9aaa72008-01-01 05:49:07 +000082#define SQLITE_CORE 1
drhbd08af42007-04-05 21:58:33 +000083#define SQLITE_AMALGAMATION 1}]
drhb6a9ece2007-06-26 00:37:27 +000084if {$addstatic} {
85 puts $out \
86{#ifndef SQLITE_PRIVATE
87# define SQLITE_PRIVATE static
88#endif}
89}
drh91c58e22007-03-27 12:04:04 +000090
mistachkin4ef916e2016-08-24 19:58:46 +000091# These are the header files used by SQLite. The first time any of these
drh91c58e22007-03-27 12:04:04 +000092# files are seen in a #include statement in the C code, include the complete
93# text of the file in-line. The file only needs to be included once.
94#
95foreach hdr {
96 btree.h
drha3152892007-05-05 11:48:52 +000097 btreeInt.h
drh820a9062008-01-31 13:35:48 +000098 fts3.h
drhf7829ad2009-11-25 22:42:22 +000099 fts3Int.h
drh820a9062008-01-31 13:35:48 +0000100 fts3_hash.h
101 fts3_tokenizer.h
drh91c58e22007-03-27 12:04:04 +0000102 hash.h
shane9bcbdad2008-05-29 20:22:37 +0000103 hwtime.h
drh91c58e22007-03-27 12:04:04 +0000104 keywordhash.h
mistachkin2318d332015-01-12 18:02:52 +0000105 msvc.h
drh428e2822007-08-30 16:23:19 +0000106 mutex.h
drh91c58e22007-03-27 12:04:04 +0000107 opcodes.h
108 os_common.h
mistachkinf74b9e02013-11-26 01:00:31 +0000109 os_setup.h
mistachkin8bc52622013-11-25 09:36:07 +0000110 os_win.h
drh91c58e22007-03-27 12:04:04 +0000111 os.h
drh91c58e22007-03-27 12:04:04 +0000112 pager.h
113 parse.h
danielk19778c0a7912008-08-20 14:49:23 +0000114 pcache.h
drh67e65e52015-02-02 21:34:54 +0000115 pragma.h
drh58f1c8b2008-05-26 20:19:25 +0000116 rtree.h
drh498dcae2013-03-13 11:42:00 +0000117 sqlite3session.h
drh91c58e22007-03-27 12:04:04 +0000118 sqlite3.h
dancd732442015-02-10 20:00:38 +0000119 sqlite3ext.h
drhcfb8f8d2015-07-23 20:44:49 +0000120 sqlite3rbu.h
danielk19771c826652008-09-08 08:08:09 +0000121 sqliteicu.h
drh91c58e22007-03-27 12:04:04 +0000122 sqliteInt.h
drhc551dd82007-06-19 15:23:48 +0000123 sqliteLimit.h
drh91c58e22007-03-27 12:04:04 +0000124 vdbe.h
125 vdbeInt.h
drh8cd5b252015-03-02 22:06:43 +0000126 vxworks.h
drhc438efd2010-04-26 00:19:45 +0000127 wal.h
drhe54df422013-11-12 18:37:25 +0000128 whereInt.h
drh91c58e22007-03-27 12:04:04 +0000129} {
130 set available_hdr($hdr) 1
131}
drh71674ce2007-10-23 15:51:26 +0000132set available_hdr(sqliteInt.h) 0
drhe191e2c2013-03-19 15:23:18 +0000133set available_hdr(sqlite3session.h) 0
drh91c58e22007-03-27 12:04:04 +0000134
mistachkin59b9b022015-03-24 21:27:27 +0000135# These headers should be copied into the amalgamation without modifying any
136# of their function declarations or definitions.
137set varonly_hdr(sqlite3.h) 1
138
139# These are the functions that accept a variable number of arguments. They
140# always need to use the "cdecl" calling convention even when another calling
141# convention (e.g. "stcall") is being used for the rest of the library.
142set cdecllist {
143 sqlite3_config
144 sqlite3_db_config
145 sqlite3_log
146 sqlite3_mprintf
147 sqlite3_snprintf
148 sqlite3_test_control
149 sqlite3_vtab_config
150}
151
drh91c58e22007-03-27 12:04:04 +0000152# 78 stars used for comment formatting.
153set s78 \
154{*****************************************************************************}
155
156# Insert a comment into the code
157#
158proc section_comment {text} {
159 global out s78
160 set n [string length $text]
161 set nstar [expr {60 - $n}]
162 set stars [string range $s78 0 $nstar]
163 puts $out "/************** $text $stars/"
164}
165
166# Read the source file named $filename and write it into the
167# sqlite3.c output file. If any #include statements are seen,
mistachkin2a43c282013-08-31 05:46:42 +0000168# process them appropriately.
drh91c58e22007-03-27 12:04:04 +0000169#
170proc copy_file {filename} {
mistachkin4ef916e2016-08-24 19:58:46 +0000171 global seen_hdr available_hdr varonly_hdr cdecllist out
172 global addstatic linemacros useapicall
drh96e50882011-08-15 15:27:20 +0000173 set ln 0
drh91c58e22007-03-27 12:04:04 +0000174 set tail [file tail $filename]
175 section_comment "Begin file $tail"
drh96e50882011-08-15 15:27:20 +0000176 if {$linemacros} {puts $out "#line 1 \"$filename\""}
drh91c58e22007-03-27 12:04:04 +0000177 set in [open $filename r]
drh73be5012007-08-08 12:11:21 +0000178 set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+(sqlite3[_a-zA-Z0-9]+)(\[|;| =)}
mistachkin59b9b022015-03-24 21:27:27 +0000179 set declpattern {([a-zA-Z][a-zA-Z_0-9 ]+ \**)(sqlite3[_a-zA-Z0-9]+)(\(.*)}
drhee858132007-05-08 20:37:38 +0000180 if {[file extension $filename]==".h"} {
drhf7083bf2007-08-08 01:04:52 +0000181 set declpattern " *$declpattern"
drhee858132007-05-08 20:37:38 +0000182 }
mistachkin59b9b022015-03-24 21:27:27 +0000183 set declpattern ^$declpattern\$
drh91c58e22007-03-27 12:04:04 +0000184 while {![eof $in]} {
185 set line [gets $in]
drh96e50882011-08-15 15:27:20 +0000186 incr ln
drh9965a042008-10-14 18:21:11 +0000187 if {[regexp {^\s*#\s*include\s+["<]([^">]+)[">]} $line all hdr]} {
drh91c58e22007-03-27 12:04:04 +0000188 if {[info exists available_hdr($hdr)]} {
189 if {$available_hdr($hdr)} {
shane9bcbdad2008-05-29 20:22:37 +0000190 if {$hdr!="os_common.h" && $hdr!="hwtime.h"} {
drh91c58e22007-03-27 12:04:04 +0000191 set available_hdr($hdr) 0
192 }
193 section_comment "Include $hdr in the middle of $tail"
194 copy_file tsrc/$hdr
195 section_comment "Continuing where we left off in $tail"
drh96e50882011-08-15 15:27:20 +0000196 if {$linemacros} {puts $out "#line [expr {$ln+1}] \"$filename\""}
mistachkin3a2a6862015-07-15 21:00:33 +0000197 } else {
198 # Comment out the entire line, replacing any nested comment
199 # begin/end markers with the harmless substring "**".
200 puts $out "/* [string map [list /* ** */ **] $line] */"
drh91c58e22007-03-27 12:04:04 +0000201 }
202 } elseif {![info exists seen_hdr($hdr)]} {
drh1a8a0d32014-05-05 20:21:52 +0000203 if {![regexp {/\*\s+amalgamator:\s+dontcache\s+\*/} $line]} {
204 set seen_hdr($hdr) 1
205 }
drh91c58e22007-03-27 12:04:04 +0000206 puts $out $line
mistachkin1a88b142013-08-31 18:06:52 +0000207 } elseif {[regexp {/\*\s+amalgamator:\s+keep\s+\*/} $line]} {
208 # This include file must be kept because there was a "keep"
209 # directive inside of a line comment.
210 puts $out $line
drh96e50882011-08-15 15:27:20 +0000211 } else {
mistachkin1a88b142013-08-31 18:06:52 +0000212 # Comment out the entire line, replacing any nested comment
213 # begin/end markers with the harmless substring "**".
214 puts $out "/* [string map [list /* ** */ **] $line] */"
drh91c58e22007-03-27 12:04:04 +0000215 }
216 } elseif {[regexp {^#ifdef __cplusplus} $line]} {
217 puts $out "#if 0"
drh96e50882011-08-15 15:27:20 +0000218 } elseif {!$linemacros && [regexp {^#line} $line]} {
drh91c58e22007-03-27 12:04:04 +0000219 # Skip #line directives.
drh45fac882015-10-09 01:42:49 +0000220 } elseif {$addstatic
221 && ![regexp {^(static|typedef|SQLITE_PRIVATE)} $line]} {
mistachkin59b9b022015-03-24 21:27:27 +0000222 # Skip adding the SQLITE_PRIVATE or SQLITE_API keyword before
223 # functions if this header file does not need it.
224 if {![info exists varonly_hdr($tail)]
225 && [regexp $declpattern $line all rettype funcname rest]} {
226 regsub {^SQLITE_API } $line {} line
drh0a0e1312007-08-07 17:04:59 +0000227 # Add the SQLITE_PRIVATE or SQLITE_API keyword before functions.
228 # so that linkage can be modified at compile-time.
drh1ffe7c72013-03-19 17:10:10 +0000229 if {[regexp {^sqlite3[a-z]*_} $funcname]} {
mistachkin59b9b022015-03-24 21:27:27 +0000230 set line SQLITE_API
231 append line " " [string trim $rettype]
232 if {[string index $rettype end] ne "*"} {
233 append line " "
234 }
mistachkin4ef916e2016-08-24 19:58:46 +0000235 if {$useapicall} {
236 if {[lsearch -exact $cdecllist $funcname] >= 0} {
mistachkin0e4125a2016-09-08 23:16:02 +0000237 append line SQLITE_CDECL " "
mistachkin4ef916e2016-08-24 19:58:46 +0000238 } else {
mistachkin0e4125a2016-09-08 23:16:02 +0000239 append line SQLITE_APICALL " "
mistachkin4ef916e2016-08-24 19:58:46 +0000240 }
mistachkin59b9b022015-03-24 21:27:27 +0000241 }
mistachkin0e4125a2016-09-08 23:16:02 +0000242 append line $funcname $rest
mistachkin59b9b022015-03-24 21:27:27 +0000243 puts $out $line
drh0a0e1312007-08-07 17:04:59 +0000244 } else {
245 puts $out "SQLITE_PRIVATE $line"
246 }
247 } elseif {[regexp $varpattern $line all varname]} {
mistachkin59b9b022015-03-24 21:27:27 +0000248 # Add the SQLITE_PRIVATE before variable declarations or
249 # definitions for internal use
250 regsub {^SQLITE_API } $line {} line
251 if {![regexp {^sqlite3_} $varname]} {
252 regsub {^extern } $line {} line
253 puts $out "SQLITE_PRIVATE $line"
254 } else {
255 if {[regexp {const char sqlite3_version\[\];} $line]} {
256 set line {const char sqlite3_version[] = SQLITE_VERSION;}
257 }
258 regsub {^SQLITE_EXTERN } $line {} line
259 puts $out "SQLITE_API $line"
drhb3190c12008-12-08 21:37:14 +0000260 }
mlcreech3a00f902008-03-04 17:45:01 +0000261 } elseif {[regexp {^(SQLITE_EXTERN )?void \(\*sqlite3IoTrace\)} $line]} {
mistachkin59b9b022015-03-24 21:27:27 +0000262 regsub {^SQLITE_API } $line {} line
mlcreech3a00f902008-03-04 17:45:01 +0000263 regsub {^SQLITE_EXTERN } $line {} line
dan80389532014-12-24 17:17:30 +0000264 puts $out $line
drhf1581622009-02-03 13:51:17 +0000265 } elseif {[regexp {^void \(\*sqlite3Os} $line]} {
mistachkin59b9b022015-03-24 21:27:27 +0000266 regsub {^SQLITE_API } $line {} line
drhf1581622009-02-03 13:51:17 +0000267 puts $out "SQLITE_PRIVATE $line"
drh26b0fc02007-06-26 00:52:39 +0000268 } else {
drh0a0e1312007-08-07 17:04:59 +0000269 puts $out $line
drh26b0fc02007-06-26 00:52:39 +0000270 }
drh91c58e22007-03-27 12:04:04 +0000271 } else {
272 puts $out $line
273 }
274 }
275 close $in
276 section_comment "End of $tail"
277}
278
279
280# Process the source files. Process files containing commonly
281# used subroutines first in order to help the compiler find
282# inlining opportunities.
283#
284foreach file {
danda1f49b2017-06-16 19:51:47 +0000285 ctime.c
drh71674ce2007-10-23 15:51:26 +0000286 sqliteInt.h
drh98495b42007-03-31 22:29:05 +0000287
drh40257ff2008-06-13 18:24:27 +0000288 global.c
drhf7141992008-06-19 00:16:08 +0000289 status.c
drha55ca9e2007-04-02 12:22:44 +0000290 date.c
drh970f7242007-03-31 16:29:06 +0000291 os.c
292
drh643167f2008-01-22 21:30:53 +0000293 fault.c
drhd1370b62008-10-28 18:58:20 +0000294 mem0.c
drh97c8ec32007-08-27 21:49:34 +0000295 mem1.c
296 mem2.c
danielk19776b39c2e2008-06-25 14:57:53 +0000297 mem3.c
298 mem5.c
drh97c8ec32007-08-27 21:49:34 +0000299 mutex.c
drh18472fa2008-10-07 15:25:48 +0000300 mutex_noop.c
drh61f6dc62007-08-30 17:15:37 +0000301 mutex_unix.c
302 mutex_w32.c
drha3152892007-05-05 11:48:52 +0000303 malloc.c
drh91c58e22007-03-27 12:04:04 +0000304 printf.c
drh38b41492015-06-08 15:08:15 +0000305 treeview.c
drh91c58e22007-03-27 12:04:04 +0000306 random.c
drhf51446a2012-07-21 19:40:42 +0000307 threads.c
drh91c58e22007-03-27 12:04:04 +0000308 utf.c
309 util.c
310 hash.c
311 opcodes.c
312
drh91c58e22007-03-27 12:04:04 +0000313 os_unix.c
314 os_win.c
315
drhf5e7bb52008-02-18 14:47:33 +0000316 bitvec.c
danielk19778c0a7912008-08-20 14:49:23 +0000317 pcache.c
danielk1977d17e71c2008-11-13 14:42:18 +0000318 pcache1.c
drh3d4501e2008-12-04 20:40:10 +0000319 rowset.c
drh91c58e22007-03-27 12:04:04 +0000320 pager.c
shanehfd068632010-05-06 19:20:29 +0000321 wal.c
drh61f6dc62007-08-30 17:15:37 +0000322
shane9bcbdad2008-05-29 20:22:37 +0000323 btmutex.c
drh91c58e22007-03-27 12:04:04 +0000324 btree.c
danielk197704103022009-02-03 16:51:24 +0000325 backup.c
drh91c58e22007-03-27 12:04:04 +0000326
drh91c58e22007-03-27 12:04:04 +0000327 vdbemem.c
328 vdbeaux.c
329 vdbeapi.c
drhc7bc4fd2009-11-25 18:03:42 +0000330 vdbetrace.c
drh91c58e22007-03-27 12:04:04 +0000331 vdbe.c
drh3f755842007-05-03 16:55:32 +0000332 vdbeblob.c
dan7fe62702011-08-02 10:56:22 +0000333 vdbesort.c
danielk1977b3175382008-10-17 18:51:52 +0000334 memjournal.c
drh91c58e22007-03-27 12:04:04 +0000335
drh7d10d5a2008-08-20 16:35:10 +0000336 walker.c
337 resolve.c
drh91c58e22007-03-27 12:04:04 +0000338 expr.c
339 alter.c
340 analyze.c
341 attach.c
342 auth.c
343 build.c
344 callback.c
drh91c58e22007-03-27 12:04:04 +0000345 delete.c
drh70a8ca32008-08-21 18:49:27 +0000346 func.c
dan3be7d6e2009-09-19 17:59:59 +0000347 fkey.c
drh91c58e22007-03-27 12:04:04 +0000348 insert.c
349 legacy.c
350 loadext.c
351 pragma.c
352 prepare.c
353 select.c
354 table.c
355 trigger.c
356 update.c
357 vacuum.c
358 vtab.c
drh6f82e852015-06-06 20:12:09 +0000359 wherecode.c
drh6c1f4ef2015-06-08 14:23:15 +0000360 whereexpr.c
drh91c58e22007-03-27 12:04:04 +0000361 where.c
362
363 parse.c
364
365 tokenize.c
drh46c99e02007-08-27 23:26:59 +0000366 complete.c
drh91c58e22007-03-27 12:04:04 +0000367
368 main.c
danielk1977404ca072009-03-16 13:19:36 +0000369 notify.c
drh820a9062008-01-31 13:35:48 +0000370
371 fts3.c
dan290c9392011-02-01 18:59:34 +0000372 fts3_aux.c
drhaeba0202008-12-31 16:01:04 +0000373 fts3_expr.c
drh820a9062008-01-31 13:35:48 +0000374 fts3_hash.c
375 fts3_porter.c
376 fts3_tokenizer.c
377 fts3_tokenizer1.c
dand7a959c2013-04-22 15:30:37 +0000378 fts3_tokenize_vtab.c
dan16708c42009-11-19 15:25:25 +0000379 fts3_write.c
380 fts3_snippet.c
dan3d403c72012-05-25 17:50:19 +0000381 fts3_unicode.c
382 fts3_unicode2.c
drh58f1c8b2008-05-26 20:19:25 +0000383
384 rtree.c
danielk19770c8a5d02008-08-04 11:49:20 +0000385 icu.c
danielk1977f9449d02008-09-24 09:58:00 +0000386 fts3_icu.c
drhcfb8f8d2015-07-23 20:44:49 +0000387 sqlite3rbu.c
drh1a4a6802015-05-04 18:31:09 +0000388 dbstat.c
drh498dcae2013-03-13 11:42:00 +0000389 sqlite3session.c
drh50065652015-10-08 19:29:18 +0000390 json1.c
391 fts5.c
drhc6603af2017-06-29 14:33:51 +0000392 stmt.c
drh91c58e22007-03-27 12:04:04 +0000393} {
394 copy_file tsrc/$file
395}
396
drh91c58e22007-03-27 12:04:04 +0000397close $out