Annotation of embedaddon/sqlite3/tool/mksqlite3c-noext.tcl, revision 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>