blob: 0e979234f3203c35b9c97bc0e942d0f934adfada [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
4# least the core components - the test harness, shell, and TCL
5# 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
14# the parser are derived from "parse.y" using lemon. And the
15# "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#
drh98495b42007-03-31 22:29:05 +000020# tclsh mksqlite3c.tcl
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
drh339d6c62013-03-19 16:12:40 +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#
drhb36d20d2007-05-16 13:55:26 +000029if {[lsearch $argv --nostatic]>=0} {
30 set addstatic 0
31} else {
32 set addstatic 1
33}
drh96e50882011-08-15 15:27:20 +000034if {[lsearch $argv --linemacros]>=0} {
35 set linemacros 1
36} else {
37 set linemacros 0
38}
drh98495b42007-03-31 22:29:05 +000039set in [open tsrc/sqlite3.h]
40set cnt 0
41set VERSION ?????
42while {![eof $in]} {
43 set line [gets $in]
44 if {$line=="" && [eof $in]} break
45 incr cnt
46 regexp {#define\s+SQLITE_VERSION\s+"(.*)"} $line all VERSION
47}
48close $in
drh91c58e22007-03-27 12:04:04 +000049
50# Open the output file and write a header comment at the beginning
51# of the file.
52#
53set out [open sqlite3.c w]
shaneh5e0fb2c2011-06-17 15:54:59 +000054# Force the output to use unix line endings, even on Windows.
drhced174b2011-06-20 15:24:22 +000055fconfigure $out -translation lf
drh98495b42007-03-31 22:29:05 +000056set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1]
57puts $out [subst \
58{/******************************************************************************
drh19df3352007-04-01 01:57:41 +000059** This file is an amalgamation of many separate C source files from SQLite
drh98495b42007-03-31 22:29:05 +000060** version $VERSION. By combining all the individual C code files into this
drh1d210212011-04-01 18:12:58 +000061** single large file, the entire code can be compiled as a single translation
drh98495b42007-03-31 22:29:05 +000062** unit. This allows many compilers to do optimizations that would not be
63** possible if the files were compiled separately. Performance improvements
drh0ee68622010-10-31 22:42:27 +000064** of 5% or more are commonly seen when SQLite is compiled as a single
drh98495b42007-03-31 22:29:05 +000065** translation unit.
66**
67** This file is all you need to compile SQLite. To use SQLite in other
68** programs, you need this file and the "sqlite3.h" header file that defines
69** the programming interface to the SQLite library. (If you do not have
drh8de5a172009-07-20 12:25:44 +000070** the "sqlite3.h" header file at hand, you will find a copy embedded within
71** the text of this file. Search for "Begin file sqlite3.h" to find the start
72** of the embedded sqlite3.h header file.) Additional code files may be needed
73** if you want a wrapper to interface SQLite with your choice of programming
74** language. The code for the "sqlite3" command-line shell is also in a
75** separate file. This file contains only code for the core SQLite library.
drhbd08af42007-04-05 21:58:33 +000076*/
danielk19777c9aaa72008-01-01 05:49:07 +000077#define SQLITE_CORE 1
drhbd08af42007-04-05 21:58:33 +000078#define SQLITE_AMALGAMATION 1}]
drhb6a9ece2007-06-26 00:37:27 +000079if {$addstatic} {
80 puts $out \
81{#ifndef SQLITE_PRIVATE
82# define SQLITE_PRIVATE static
drh26b0fc02007-06-26 00:52:39 +000083#endif
84#ifndef SQLITE_API
85# define SQLITE_API
drhb6a9ece2007-06-26 00:37:27 +000086#endif}
87}
drh91c58e22007-03-27 12:04:04 +000088
89# These are the header files used by SQLite. The first time any of these
90# files are seen in a #include statement in the C code, include the complete
91# text of the file in-line. The file only needs to be included once.
92#
93foreach hdr {
94 btree.h
drha3152892007-05-05 11:48:52 +000095 btreeInt.h
drh820a9062008-01-31 13:35:48 +000096 fts3.h
drhf7829ad2009-11-25 22:42:22 +000097 fts3Int.h
drh820a9062008-01-31 13:35:48 +000098 fts3_hash.h
99 fts3_tokenizer.h
drh91c58e22007-03-27 12:04:04 +0000100 hash.h
shane9bcbdad2008-05-29 20:22:37 +0000101 hwtime.h
drh91c58e22007-03-27 12:04:04 +0000102 keywordhash.h
drh428e2822007-08-30 16:23:19 +0000103 mutex.h
drh91c58e22007-03-27 12:04:04 +0000104 opcodes.h
105 os_common.h
mistachkinf74b9e02013-11-26 01:00:31 +0000106 os_setup.h
mistachkin8bc52622013-11-25 09:36:07 +0000107 os_win.h
drh91c58e22007-03-27 12:04:04 +0000108 os.h
drh91c58e22007-03-27 12:04:04 +0000109 pager.h
110 parse.h
danielk19778c0a7912008-08-20 14:49:23 +0000111 pcache.h
drh58f1c8b2008-05-26 20:19:25 +0000112 rtree.h
drh91c58e22007-03-27 12:04:04 +0000113 sqlite3ext.h
114 sqlite3.h
danielk19771c826652008-09-08 08:08:09 +0000115 sqliteicu.h
drh91c58e22007-03-27 12:04:04 +0000116 sqliteInt.h
drhc551dd82007-06-19 15:23:48 +0000117 sqliteLimit.h
drh91c58e22007-03-27 12:04:04 +0000118 vdbe.h
119 vdbeInt.h
drhc438efd2010-04-26 00:19:45 +0000120 wal.h
drhe54df422013-11-12 18:37:25 +0000121 whereInt.h
drh91c58e22007-03-27 12:04:04 +0000122} {
123 set available_hdr($hdr) 1
124}
drh71674ce2007-10-23 15:51:26 +0000125set available_hdr(sqliteInt.h) 0
drh91c58e22007-03-27 12:04:04 +0000126
127# 78 stars used for comment formatting.
128set s78 \
129{*****************************************************************************}
130
131# Insert a comment into the code
132#
133proc section_comment {text} {
134 global out s78
135 set n [string length $text]
136 set nstar [expr {60 - $n}]
137 set stars [string range $s78 0 $nstar]
138 puts $out "/************** $text $stars/"
139}
140
141# Read the source file named $filename and write it into the
142# sqlite3.c output file. If any #include statements are seen,
mistachkin2a43c282013-08-31 05:46:42 +0000143# process them appropriately.
drh91c58e22007-03-27 12:04:04 +0000144#
145proc copy_file {filename} {
drh96e50882011-08-15 15:27:20 +0000146 global seen_hdr available_hdr out addstatic linemacros
147 set ln 0
drh91c58e22007-03-27 12:04:04 +0000148 set tail [file tail $filename]
149 section_comment "Begin file $tail"
drh96e50882011-08-15 15:27:20 +0000150 if {$linemacros} {puts $out "#line 1 \"$filename\""}
drh91c58e22007-03-27 12:04:04 +0000151 set in [open $filename r]
drh73be5012007-08-08 12:11:21 +0000152 set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+(sqlite3[_a-zA-Z0-9]+)(\[|;| =)}
drh40a390d2009-02-18 12:25:28 +0000153 set declpattern {[a-zA-Z][a-zA-Z_0-9 ]+ \**(sqlite3[_a-zA-Z0-9]+)\(}
drhee858132007-05-08 20:37:38 +0000154 if {[file extension $filename]==".h"} {
drhf7083bf2007-08-08 01:04:52 +0000155 set declpattern " *$declpattern"
drhee858132007-05-08 20:37:38 +0000156 }
drhf7083bf2007-08-08 01:04:52 +0000157 set declpattern ^$declpattern
drh91c58e22007-03-27 12:04:04 +0000158 while {![eof $in]} {
159 set line [gets $in]
drh96e50882011-08-15 15:27:20 +0000160 incr ln
drh9965a042008-10-14 18:21:11 +0000161 if {[regexp {^\s*#\s*include\s+["<]([^">]+)[">]} $line all hdr]} {
drh91c58e22007-03-27 12:04:04 +0000162 if {[info exists available_hdr($hdr)]} {
163 if {$available_hdr($hdr)} {
shane9bcbdad2008-05-29 20:22:37 +0000164 if {$hdr!="os_common.h" && $hdr!="hwtime.h"} {
drh91c58e22007-03-27 12:04:04 +0000165 set available_hdr($hdr) 0
166 }
167 section_comment "Include $hdr in the middle of $tail"
168 copy_file tsrc/$hdr
169 section_comment "Continuing where we left off in $tail"
drh96e50882011-08-15 15:27:20 +0000170 if {$linemacros} {puts $out "#line [expr {$ln+1}] \"$filename\""}
drh91c58e22007-03-27 12:04:04 +0000171 }
172 } elseif {![info exists seen_hdr($hdr)]} {
drh1a8a0d32014-05-05 20:21:52 +0000173 if {![regexp {/\*\s+amalgamator:\s+dontcache\s+\*/} $line]} {
174 set seen_hdr($hdr) 1
175 }
drh91c58e22007-03-27 12:04:04 +0000176 puts $out $line
mistachkin1a88b142013-08-31 18:06:52 +0000177 } elseif {[regexp {/\*\s+amalgamator:\s+keep\s+\*/} $line]} {
178 # This include file must be kept because there was a "keep"
179 # directive inside of a line comment.
180 puts $out $line
drh96e50882011-08-15 15:27:20 +0000181 } else {
mistachkin1a88b142013-08-31 18:06:52 +0000182 # Comment out the entire line, replacing any nested comment
183 # begin/end markers with the harmless substring "**".
184 puts $out "/* [string map [list /* ** */ **] $line] */"
drh91c58e22007-03-27 12:04:04 +0000185 }
186 } elseif {[regexp {^#ifdef __cplusplus} $line]} {
187 puts $out "#if 0"
drh96e50882011-08-15 15:27:20 +0000188 } elseif {!$linemacros && [regexp {^#line} $line]} {
drh91c58e22007-03-27 12:04:04 +0000189 # Skip #line directives.
drh73be5012007-08-08 12:11:21 +0000190 } elseif {$addstatic && ![regexp {^(static|typedef)} $line]} {
drhd9c50f72009-08-14 18:18:03 +0000191 regsub {^SQLITE_API } $line {} line
drh0a0e1312007-08-07 17:04:59 +0000192 if {[regexp $declpattern $line all funcname]} {
193 # Add the SQLITE_PRIVATE or SQLITE_API keyword before functions.
194 # so that linkage can be modified at compile-time.
195 if {[regexp {^sqlite3_} $funcname]} {
196 puts $out "SQLITE_API $line"
197 } else {
198 puts $out "SQLITE_PRIVATE $line"
199 }
200 } elseif {[regexp $varpattern $line all varname]} {
201 # Add the SQLITE_PRIVATE before variable declarations or
202 # definitions for internal use
203 if {![regexp {^sqlite3_} $varname]} {
204 regsub {^extern } $line {} line
205 puts $out "SQLITE_PRIVATE $line"
206 } else {
drhb3190c12008-12-08 21:37:14 +0000207 if {[regexp {const char sqlite3_version\[\];} $line]} {
208 set line {const char sqlite3_version[] = SQLITE_VERSION;}
209 }
mlcreech6f10b3c2008-03-09 01:14:41 +0000210 regsub {^SQLITE_EXTERN } $line {} line
211 puts $out "SQLITE_API $line"
drh0a0e1312007-08-07 17:04:59 +0000212 }
mlcreech3a00f902008-03-04 17:45:01 +0000213 } elseif {[regexp {^(SQLITE_EXTERN )?void \(\*sqlite3IoTrace\)} $line]} {
214 regsub {^SQLITE_EXTERN } $line {} line
215 puts $out "SQLITE_PRIVATE $line"
drhf1581622009-02-03 13:51:17 +0000216 } elseif {[regexp {^void \(\*sqlite3Os} $line]} {
217 puts $out "SQLITE_PRIVATE $line"
drh26b0fc02007-06-26 00:52:39 +0000218 } else {
drh0a0e1312007-08-07 17:04:59 +0000219 puts $out $line
drh26b0fc02007-06-26 00:52:39 +0000220 }
drh91c58e22007-03-27 12:04:04 +0000221 } else {
222 puts $out $line
223 }
224 }
225 close $in
226 section_comment "End of $tail"
227}
228
229
230# Process the source files. Process files containing commonly
231# used subroutines first in order to help the compiler find
232# inlining opportunities.
233#
234foreach file {
drh71674ce2007-10-23 15:51:26 +0000235 sqliteInt.h
drh98495b42007-03-31 22:29:05 +0000236
drh40257ff2008-06-13 18:24:27 +0000237 global.c
drh735b9cb2010-03-10 23:13:53 +0000238 ctime.c
drhf7141992008-06-19 00:16:08 +0000239 status.c
drha55ca9e2007-04-02 12:22:44 +0000240 date.c
drh970f7242007-03-31 16:29:06 +0000241 os.c
242
drh643167f2008-01-22 21:30:53 +0000243 fault.c
drhd1370b62008-10-28 18:58:20 +0000244 mem0.c
drh97c8ec32007-08-27 21:49:34 +0000245 mem1.c
246 mem2.c
danielk19776b39c2e2008-06-25 14:57:53 +0000247 mem3.c
248 mem5.c
drh97c8ec32007-08-27 21:49:34 +0000249 mutex.c
drh18472fa2008-10-07 15:25:48 +0000250 mutex_noop.c
drh61f6dc62007-08-30 17:15:37 +0000251 mutex_unix.c
252 mutex_w32.c
drha3152892007-05-05 11:48:52 +0000253 malloc.c
drh91c58e22007-03-27 12:04:04 +0000254 printf.c
255 random.c
drhf51446a2012-07-21 19:40:42 +0000256 threads.c
drh91c58e22007-03-27 12:04:04 +0000257 utf.c
258 util.c
259 hash.c
260 opcodes.c
261
drh91c58e22007-03-27 12:04:04 +0000262 os_unix.c
263 os_win.c
264
drhf5e7bb52008-02-18 14:47:33 +0000265 bitvec.c
danielk19778c0a7912008-08-20 14:49:23 +0000266 pcache.c
danielk1977d17e71c2008-11-13 14:42:18 +0000267 pcache1.c
drh3d4501e2008-12-04 20:40:10 +0000268 rowset.c
drh91c58e22007-03-27 12:04:04 +0000269 pager.c
shanehfd068632010-05-06 19:20:29 +0000270 wal.c
drh61f6dc62007-08-30 17:15:37 +0000271
shane9bcbdad2008-05-29 20:22:37 +0000272 btmutex.c
drh91c58e22007-03-27 12:04:04 +0000273 btree.c
danielk197704103022009-02-03 16:51:24 +0000274 backup.c
drh91c58e22007-03-27 12:04:04 +0000275
drh91c58e22007-03-27 12:04:04 +0000276 vdbemem.c
277 vdbeaux.c
278 vdbeapi.c
drhc7bc4fd2009-11-25 18:03:42 +0000279 vdbetrace.c
drh91c58e22007-03-27 12:04:04 +0000280 vdbe.c
drh3f755842007-05-03 16:55:32 +0000281 vdbeblob.c
dan7fe62702011-08-02 10:56:22 +0000282 vdbesort.c
drh97c8ec32007-08-27 21:49:34 +0000283 journal.c
danielk1977b3175382008-10-17 18:51:52 +0000284 memjournal.c
drh91c58e22007-03-27 12:04:04 +0000285
drh7d10d5a2008-08-20 16:35:10 +0000286 walker.c
287 resolve.c
drh91c58e22007-03-27 12:04:04 +0000288 expr.c
289 alter.c
290 analyze.c
291 attach.c
292 auth.c
293 build.c
294 callback.c
drh91c58e22007-03-27 12:04:04 +0000295 delete.c
drh70a8ca32008-08-21 18:49:27 +0000296 func.c
dan3be7d6e2009-09-19 17:59:59 +0000297 fkey.c
drh91c58e22007-03-27 12:04:04 +0000298 insert.c
299 legacy.c
300 loadext.c
301 pragma.c
302 prepare.c
303 select.c
304 table.c
305 trigger.c
306 update.c
307 vacuum.c
308 vtab.c
309 where.c
310
311 parse.c
312
313 tokenize.c
drh46c99e02007-08-27 23:26:59 +0000314 complete.c
drh91c58e22007-03-27 12:04:04 +0000315
316 main.c
danielk1977404ca072009-03-16 13:19:36 +0000317 notify.c
drh820a9062008-01-31 13:35:48 +0000318
319 fts3.c
dan290c9392011-02-01 18:59:34 +0000320 fts3_aux.c
drhaeba0202008-12-31 16:01:04 +0000321 fts3_expr.c
drh820a9062008-01-31 13:35:48 +0000322 fts3_hash.c
323 fts3_porter.c
324 fts3_tokenizer.c
325 fts3_tokenizer1.c
dand7a959c2013-04-22 15:30:37 +0000326 fts3_tokenize_vtab.c
dan16708c42009-11-19 15:25:25 +0000327 fts3_write.c
328 fts3_snippet.c
dan3d403c72012-05-25 17:50:19 +0000329 fts3_unicode.c
330 fts3_unicode2.c
drh58f1c8b2008-05-26 20:19:25 +0000331
332 rtree.c
danielk19770c8a5d02008-08-04 11:49:20 +0000333 icu.c
danielk1977f9449d02008-09-24 09:58:00 +0000334 fts3_icu.c
drh91c58e22007-03-27 12:04:04 +0000335} {
336 copy_file tsrc/$file
337}
338
drh91c58e22007-03-27 12:04:04 +0000339close $out