File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / tool / mksqlite3c-noext.tcl
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:17 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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>