1 #!/usr/bin/tclsh 2 # 3 # This script constructs the "sqlite3.h" header file from the following 4 # sources: 5 # 6 # 1) The src/sqlite.h.in source file. This is the template for sqlite3.h. 7 # 2) The VERSION file containing the current SQLite version number. 8 # 3) The manifest file from the fossil SCM. This gives use the date. 9 # 4) The manifest.uuid file from the fossil SCM. This gives the SHA1 hash. 10 # 11 # Run this script by specifying the root directory of the source tree 12 # on the command-line. 13 # 14 # This script performs processing on src/sqlite.h.in. It: 15 # 16 # 1) Adds SQLITE_EXTERN in front of the declaration of global variables, 17 # 2) Adds SQLITE_API in front of the declaration of API functions, 18 # 3) Replaces the string --VERS-- with the current library version, 19 # formatted as a string (e.g. "3.6.17"), and 20 # 4) Replaces the string --VERSION-NUMBER-- with current library version, 21 # formatted as an integer (e.g. "3006017"). 22 # 5) Replaces the string --SOURCE-ID-- with the date and time and sha1 23 # hash of the fossil-scm manifest for the source tree. 24 # 25 # This script outputs to stdout. 26 # 27 # Example usage: 28 # 29 # tclsh mksqlite3h.tcl ../sqlite >sqlite3.h 30 # 31 32 33 # Get the source tree root directory from the command-line 34 # 35 set TOP [lindex $argv 0] 36 37 # Get the SQLite version number (ex: 3.6.18) from the $TOP/VERSION file. 38 # 39 set in [open $TOP/VERSION] 40 set zVersion [string trim [read $in]] 41 close $in 42 set nVersion [eval format "%d%03d%03d" [split $zVersion .]] 43 44 # Get the fossil-scm version number from $TOP/manifest.uuid. 45 # 46 set in [open $TOP/manifest.uuid] 47 set zUuid [string trim [read $in]] 48 close $in 49 50 # Get the fossil-scm check-in date from the "D" card of $TOP/manifest. 51 # 52 set in [open $TOP/manifest] 53 set zDate {} 54 while {![eof $in]} { 55 set line [gets $in] 56 if {[regexp {^D (2[-0-9T:]+)} $line all date]} { 57 set zDate [string map {T { }} $date] 58 break 59 } 60 } 61 close $in 62 63 # Set up patterns for recognizing API declarations. 64 # 65 set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)} 66 set declpattern {^ *[a-zA-Z][a-zA-Z_0-9 ]+ \**sqlite3_[_a-zA-Z0-9]+\(} 67 68 # Process the src/sqlite.h.in ext/rtree/sqlite3rtree.h files. 69 # 70 foreach file [list $TOP/src/sqlite.h.in $TOP/ext/rtree/sqlite3rtree.h] { 71 set in [open $file] 72 while {![eof $in]} { 73 74 set line [gets $in] 75 76 # File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this 77 # line when copying sqlite3rtree.h into sqlite3.h. 78 # 79 if {[string match {*#include*<sqlite3.h>*} $line]} continue 80 81 regsub -- --VERS-- $line $zVersion line 82 regsub -- --VERSION-NUMBER-- $line $nVersion line 83 regsub -- --SOURCE-ID-- $line "$zDate $zUuid" line 84 85 if {[regexp {define SQLITE_EXTERN extern} $line]} { 86 puts $line 87 puts [gets $in] 88 puts "" 89 puts "#ifndef SQLITE_API" 90 puts "# define SQLITE_API" 91 puts "#endif" 92 set line "" 93 } 94 95 if {([regexp $varpattern $line] && ![regexp {^ *typedef} $line]) 96 || ([regexp $declpattern $line]) 97 } { 98 set line "SQLITE_API $line" 99 } 100 puts $line 101 } 102 close $in 103 } 104