Annotation of embedaddon/sqlite3/tool/mksqlite3c-noext.tcl, revision 1.1.1.1

1.1       misho       1: #!/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: #
                      9: # 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".
                     16: #
                     17: # After the "tsrc" directory has been created and populated, run
                     18: # this script:
                     19: #
                     20: #      tclsh mksqlite3c.tcl
                     21: #
                     22: # The amalgamated SQLite code will be written into sqlite3.c
                     23: #
                     24: 
                     25: # Begin by reading the "sqlite3.h" header file.  Extract the version number
                     26: # from in this file.  The versioon number is needed to generate the header
                     27: # comment of the amalgamation.
                     28: #
                     29: if {[lsearch $argv --nostatic]>=0} {
                     30:   set addstatic 0
                     31: } else {
                     32:   set addstatic 1
                     33: }
                     34: if {[lsearch $argv --linemacros]>=0} {
                     35:   set linemacros 1
                     36: } else {
                     37:   set linemacros 0
                     38: }
                     39: set in [open tsrc/sqlite3.h]
                     40: set cnt 0
                     41: set VERSION ?????
                     42: while {![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: }
                     48: close $in
                     49: 
                     50: # Open the output file and write a header comment at the beginning
                     51: # of the file.
                     52: #
                     53: set out [open sqlite3.c w]
                     54: # Force the output to use unix line endings, even on Windows.
                     55: fconfigure $out -translation lf
                     56: set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1]
                     57: puts $out [subst \
                     58: {/******************************************************************************
                     59: ** This file is an amalgamation of many separate C source files from SQLite
                     60: ** version $VERSION.  By combining all the individual C code files into this 
                     61: ** single large file, the entire code can be compiled as a single translation
                     62: ** unit.  This allows many compilers to do optimizations that would not be
                     63: ** possible if the files were compiled separately.  Performance improvements
                     64: ** of 5% or more are commonly seen when SQLite is compiled as a single
                     65: ** 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 
                     70: ** 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.
                     76: */
                     77: #define SQLITE_CORE 1
                     78: #define SQLITE_AMALGAMATION 1}]
                     79: if {$addstatic} {
                     80:   puts $out \
                     81: {#ifndef SQLITE_PRIVATE
                     82: # define SQLITE_PRIVATE static
                     83: #endif
                     84: #ifndef SQLITE_API
                     85: # define SQLITE_API
                     86: #endif}
                     87: }
                     88: 
                     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: #
                     93: foreach hdr {
                     94:    btree.h
                     95:    btreeInt.h
                     96:    hash.h
                     97:    hwtime.h
                     98:    keywordhash.h
                     99:    mutex.h
                    100:    opcodes.h
                    101:    os_common.h
                    102:    os.h
                    103:    os_os2.h
                    104:    pager.h
                    105:    parse.h
                    106:    pcache.h
                    107:    sqlite3ext.h
                    108:    sqlite3.h
                    109:    sqliteicu.h
                    110:    sqliteInt.h
                    111:    sqliteLimit.h
                    112:    vdbe.h
                    113:    vdbeInt.h
                    114:    wal.h
                    115: } {
                    116:   set available_hdr($hdr) 1
                    117: }
                    118: set available_hdr(sqliteInt.h) 0
                    119: 
                    120: # 78 stars used for comment formatting.
                    121: set s78 \
                    122: {*****************************************************************************}
                    123: 
                    124: # Insert a comment into the code
                    125: #
                    126: proc section_comment {text} {
                    127:   global out s78
                    128:   set n [string length $text]
                    129:   set nstar [expr {60 - $n}]
                    130:   set stars [string range $s78 0 $nstar]
                    131:   puts $out "/************** $text $stars/"
                    132: }
                    133: 
                    134: # Read the source file named $filename and write it into the
                    135: # sqlite3.c output file.  If any #include statements are seen,
                    136: # process them approprately.
                    137: #
                    138: proc copy_file {filename} {
                    139:   global seen_hdr available_hdr out addstatic linemacros
                    140:   set ln 0
                    141:   set tail [file tail $filename]
                    142:   section_comment "Begin file $tail"
                    143:   if {$linemacros} {puts $out "#line 1 \"$filename\""}
                    144:   set in [open $filename r]
                    145:   set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+(sqlite3[_a-zA-Z0-9]+)(\[|;| =)}
                    146:   set declpattern {[a-zA-Z][a-zA-Z_0-9 ]+ \**(sqlite3[_a-zA-Z0-9]+)\(}
                    147:   if {[file extension $filename]==".h"} {
                    148:     set declpattern " *$declpattern"
                    149:   }
                    150:   set declpattern ^$declpattern
                    151:   while {![eof $in]} {
                    152:     set line [gets $in]
                    153:     incr ln
                    154:     if {[regexp {^\s*#\s*include\s+["<]([^">]+)[">]} $line all hdr]} {
                    155:       if {[info exists available_hdr($hdr)]} {
                    156:         if {$available_hdr($hdr)} {
                    157:           if {$hdr!="os_common.h" && $hdr!="hwtime.h"} {
                    158:             set available_hdr($hdr) 0
                    159:           }
                    160:           section_comment "Include $hdr in the middle of $tail"
                    161:           copy_file tsrc/$hdr
                    162:           section_comment "Continuing where we left off in $tail"
                    163:           if {$linemacros} {puts $out "#line [expr {$ln+1}] \"$filename\""}
                    164:         }
                    165:       } elseif {![info exists seen_hdr($hdr)]} {
                    166:         set seen_hdr($hdr) 1
                    167:         puts $out $line
                    168:       } else {
                    169:         puts $out "/* $line */"
                    170:       }
                    171:     } elseif {[regexp {^#ifdef __cplusplus} $line]} {
                    172:       puts $out "#if 0"
                    173:     } elseif {!$linemacros && [regexp {^#line} $line]} {
                    174:       # Skip #line directives.
                    175:     } elseif {$addstatic && ![regexp {^(static|typedef)} $line]} {
                    176:       regsub {^SQLITE_API } $line {} line
                    177:       if {[regexp $declpattern $line all funcname]} {
                    178:         # Add the SQLITE_PRIVATE or SQLITE_API keyword before functions.
                    179:         # so that linkage can be modified at compile-time.
                    180:         if {[regexp {^sqlite3_} $funcname]} {
                    181:           puts $out "SQLITE_API $line"
                    182:         } else {
                    183:           puts $out "SQLITE_PRIVATE $line"
                    184:         }
                    185:       } elseif {[regexp $varpattern $line all varname]} {
                    186:         # Add the SQLITE_PRIVATE before variable declarations or
                    187:         # definitions for internal use
                    188:         if {![regexp {^sqlite3_} $varname]} {
                    189:           regsub {^extern } $line {} line
                    190:           puts $out "SQLITE_PRIVATE $line"
                    191:         } else {
                    192:           if {[regexp {const char sqlite3_version\[\];} $line]} {
                    193:             set line {const char sqlite3_version[] = SQLITE_VERSION;}
                    194:           }
                    195:           regsub {^SQLITE_EXTERN } $line {} line
                    196:           puts $out "SQLITE_API $line"
                    197:         }
                    198:       } elseif {[regexp {^(SQLITE_EXTERN )?void \(\*sqlite3IoTrace\)} $line]} {
                    199:         regsub {^SQLITE_EXTERN } $line {} line
                    200:         puts $out "SQLITE_PRIVATE $line"
                    201:       } elseif {[regexp {^void \(\*sqlite3Os} $line]} {
                    202:         puts $out "SQLITE_PRIVATE $line"
                    203:       } else {
                    204:         puts $out $line
                    205:       }
                    206:     } else {
                    207:       puts $out $line
                    208:     }
                    209:   }
                    210:   close $in
                    211:   section_comment "End of $tail"
                    212: }
                    213: 
                    214: 
                    215: # Process the source files.  Process files containing commonly
                    216: # used subroutines first in order to help the compiler find
                    217: # inlining opportunities.
                    218: #
                    219: foreach file {
                    220:    sqliteInt.h
                    221: 
                    222:    global.c
                    223:    ctime.c
                    224:    status.c
                    225:    date.c
                    226:    os.c
                    227: 
                    228:    fault.c
                    229:    mem0.c
                    230:    mem1.c
                    231:    mem2.c
                    232:    mem3.c
                    233:    mem5.c
                    234:    mutex.c
                    235:    mutex_noop.c
                    236:    mutex_os2.c
                    237:    mutex_unix.c
                    238:    mutex_w32.c
                    239:    malloc.c
                    240:    printf.c
                    241:    random.c
                    242:    utf.c
                    243:    util.c
                    244:    hash.c
                    245:    opcodes.c
                    246: 
                    247:    os_os2.c
                    248:    os_unix.c
                    249:    os_win.c
                    250: 
                    251:    bitvec.c
                    252:    pcache.c
                    253:    pcache1.c
                    254:    rowset.c
                    255:    pager.c
                    256:    wal.c
                    257: 
                    258:    btmutex.c
                    259:    btree.c
                    260:    backup.c
                    261: 
                    262:    vdbemem.c
                    263:    vdbeaux.c
                    264:    vdbeapi.c
                    265:    vdbetrace.c
                    266:    vdbe.c
                    267:    vdbeblob.c
                    268:    vdbesort.c
                    269:    journal.c
                    270:    memjournal.c
                    271: 
                    272:    walker.c
                    273:    resolve.c
                    274:    expr.c
                    275:    alter.c
                    276:    analyze.c
                    277:    attach.c
                    278:    auth.c
                    279:    build.c
                    280:    callback.c
                    281:    delete.c
                    282:    func.c
                    283:    fkey.c
                    284:    insert.c
                    285:    legacy.c
                    286:    loadext.c
                    287:    pragma.c
                    288:    prepare.c
                    289:    select.c
                    290:    table.c
                    291:    trigger.c
                    292:    update.c
                    293:    vacuum.c
                    294:    vtab.c
                    295:    where.c
                    296: 
                    297:    parse.c
                    298: 
                    299:    tokenize.c
                    300:    complete.c
                    301: 
                    302:    main.c
                    303:    notify.c
                    304: } {
                    305:   copy_file tsrc/$file
                    306: }
                    307: 
                    308: close $out

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>