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# 35set TOP [lindex $argv 0] 36 37# Get the SQLite version number (ex: 3.6.18) from the $TOP/VERSION file. 38# 39set in [open $TOP/VERSION] 40set zVersion [string trim [read $in]] 41close $in 42set nVersion [eval format "%d%03d%03d" [split $zVersion .]] 43 44# Get the fossil-scm version number from $TOP/manifest.uuid. 45# 46set in [open $TOP/manifest.uuid] 47set zUuid [string trim [read $in]] 48close $in 49 50# Get the fossil-scm check-in date from the "D" card of $TOP/manifest. 51# 52set in [open $TOP/manifest] 53set zDate {} 54while {![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} 61close $in 62 63# Set up patterns for recognizing API declarations. 64# 65set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)} 66set 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# 70foreach 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