2021-08-29 17:41:41 +03:00
// Copyright 2017 The Sqlite Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
2021-09-08 23:12:23 +03:00
//go:build generator
2021-08-29 17:41:41 +03:00
// +build generator
2023-03-06 13:00:53 +03:00
//TODO 2023-02-23, netbsd/amd64 fails generating SQLite 3.41:
//
// C front end 36/85: testdata/sqlite-src-3410000/ext/recover/sqlite3recover.c ... testdata/sqlite-src-3410000/ext/recover/sqlite3recover.c:2023:41: front-end: undefined: SQLITE_FCNTL_RESET_CACHE
2021-08-29 17:41:41 +03:00
package main
import (
"archive/zip"
"bufio"
2022-11-28 13:19:39 +03:00
"bytes"
2022-05-18 17:58:26 +03:00
"flag"
2021-08-29 17:41:41 +03:00
"fmt"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"runtime"
2022-11-28 13:19:39 +03:00
"sort"
2021-08-29 17:41:41 +03:00
"strings"
"modernc.org/ccgo/v3/lib"
)
// gcc
// -g
// -O2
// -DSQLITE_OS_UNIX=1
// -I.
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/rtree
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/icu
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/async
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/session
// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/userauth
// -D_HAVE_SQLITE_CONFIG_H
// -DBUILD_sqlite
// -DNDEBUG
// -I/usr/include/tcl8.6
// -DSQLITE_THREADSAFE=1
// -DSQLITE_HAVE_ZLIB=1
// -DSQLITE_NO_SYNC=1
// -DSQLITE_TEMP_STORE=1
// -DSQLITE_TEST=1
// -DSQLITE_CRASH_TEST=1
// -DTCLSH_INIT_PROC=sqlite3TestInit
// -DSQLITE_SERVER=1
// -DSQLITE_PRIVATE=
// -DSQLITE_CORE
// -DBUILD_sqlite
// -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
// -DSQLITE_DEFAULT_PAGE_SIZE=1024
// -DSQLITE_ENABLE_STMTVTAB
// -DSQLITE_ENABLE_DBPAGE_VTAB
// -DSQLITE_ENABLE_BYTECODE_VTAB
// -DSQLITE_ENABLE_DESERIALIZE
// -o testfixture
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test1.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test2.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test3.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test4.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test5.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test6.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test7.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test8.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test9.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_autoext.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_async.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_backup.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_bestindex.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_blob.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_btree.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_config.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_delete.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_demovfs.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_devsym.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_fs.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_func.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_hexio.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_init.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_intarray.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_journal.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_malloc.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_md5.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_multiplex.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_mutex.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_onefile.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_osinst.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_pcache.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_quota.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_rtree.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_schema.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_server.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_superlock.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_syscall.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_tclsh.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_tclvar.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_thread.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_vdbecov.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_vfs.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_windirent.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_window.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_wsd.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3/fts3_term.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3/fts3_test.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/session/test_session.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/rbu/test_rbu.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/expert/sqlite3expert.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/expert/test_expert.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/amatch.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/carray.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/closure.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/csv.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/decimal.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/eval.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/explain.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/fileio.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/fuzzer.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_tcl.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_test_mi.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_test_tok.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/ieee754.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/mmapwarm.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/nextchar.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/normalize.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/percentile.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/prefixes.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/regexp.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/remember.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/series.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/spellfix.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/totype.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/unionvtab.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/wholenumber.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/zipfile.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/userauth/userauth.c
// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/tclsqlite.c
// sqlite3.c
// -L/usr/lib/x86_64-linux-gnu
// -ltcl8.6
// -ldl
// -lz
// -lpthread
const (
2022-11-28 13:19:39 +03:00
volatiles = "-volatile=sqlite3_io_error_pending,sqlite3_open_file_count,sqlite3_pager_readdb_count,sqlite3_pager_writedb_count,sqlite3_pager_writej_count,sqlite3_search_count,sqlite3_sort_count,saved_cnt,randomnessPid"
2021-08-29 17:41:41 +03:00
)
2023-01-22 14:26:47 +03:00
// 2022-11-27 Removing -DSQLITE_ENABLE_SNAPSHOT from configTest. This #define
// makes a single test fail on linux/ppc64le. That test is run only when the
// -DSQLITE_ENABLE_SNAPSHOT is present when compiling the testfixture. When
// investigating the failure it turns out this #define is actually NOT present
// when doing '$ ./configure && make tcltest' in sqlite-src-3400000, ie. in the
// original C code.
//
// libtool: link: gcc -g -O2 -DSQLITE_OS_UNIX=1 -I. -I/home/jnml/sqlite-src-3400000/src -I/home/jnml/sqlite-src-3400000/ext/rtree -I/home/jnml/sqlite-src-3400000/ext/icu -I/home/jnml/sqlite-src-3400000/ext/fts3 -I/home/jnml/sqlite-src-3400000/ext/async -I/home/jnml/sqlite-src-3400000/ext/session -I/home/jnml/sqlite-src-3400000/ext/userauth -D_HAVE_SQLITE_CONFIG_H -DBUILD_sqlite -DNDEBUG -I/usr/include/tcl8.6 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_HAVE_ZLIB=1 -DSQLITE_NO_SYNC=1 -DSQLITE_TEMP_STORE=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 -DTCLSH_INIT_PROC=sqlite3TestInit -DSQLITE_SERVER=1 -DSQLITE_PRIVATE= -DSQLITE_CORE -DBUILD_sqlite -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 -DSQLITE_DEFAULT_PAGE_SIZE=1024 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_BYTECODE_VTAB -DSQLITE_CKSUMVFS_STATIC -o testfixture ...
2021-08-29 17:41:41 +03:00
var (
configProduction = [ ] string {
"-DHAVE_USLEEP" ,
"-DLONGDOUBLE_TYPE=double" ,
"-DSQLITE_CORE" ,
2023-01-22 14:26:47 +03:00
"-DSQLITE_DEFAULT_MEMSTATUS=0" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_ENABLE_COLUMN_METADATA" ,
2023-08-16 18:09:50 +03:00
"-DSQLITE_ENABLE_DBSTAT_VTAB" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_ENABLE_FTS5" ,
"-DSQLITE_ENABLE_GEOPOLY" ,
2022-03-07 13:08:26 +03:00
"-DSQLITE_ENABLE_MATH_FUNCTIONS" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_ENABLE_MEMORY_MANAGEMENT" ,
"-DSQLITE_ENABLE_OFFSET_SQL_FUNC" ,
"-DSQLITE_ENABLE_PREUPDATE_HOOK" ,
"-DSQLITE_ENABLE_RBU" ,
"-DSQLITE_ENABLE_RTREE" ,
"-DSQLITE_ENABLE_SESSION" ,
"-DSQLITE_ENABLE_SNAPSHOT" ,
"-DSQLITE_ENABLE_STAT4" ,
"-DSQLITE_ENABLE_UNLOCK_NOTIFY" , // Adds sqlite3_unlock_notify().
"-DSQLITE_LIKE_DOESNT_MATCH_BLOBS" ,
"-DSQLITE_MUTEX_APPDEF=1" ,
2021-12-12 17:47:51 +03:00
"-DSQLITE_MUTEX_NOOP" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_SOUNDEX" ,
"-DSQLITE_THREADSAFE=1" ,
//DONT "-DNDEBUG", // To enable GO_GENERATE=-DSQLITE_DEBUG
//DONT "-DSQLITE_DQS=0", // testfixture
//DONT "-DSQLITE_NO_SYNC=1",
//DONT "-DSQLITE_OMIT_DECLTYPE", // testfixture
//DONT "-DSQLITE_OMIT_DEPRECATED", // mptest
//DONT "-DSQLITE_OMIT_LOAD_EXTENSION", // mptest
//DONT "-DSQLITE_OMIT_SHARED_CACHE",
//DONT "-DSQLITE_USE_ALLOCA",
//TODO "-DHAVE_MALLOC_USABLE_SIZE"
//TODO "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1", //TODO report bug
//TODO "-DSQLITE_ENABLE_FTS3",
//TODO "-DSQLITE_ENABLE_FTS3_PARENTHESIS",
//TODO "-DSQLITE_ENABLE_FTS3_TOKENIZER",
//TODO "-DSQLITE_ENABLE_FTS4",
//TODO "-DSQLITE_ENABLE_ICU",
//TODO "-DSQLITE_MAX_EXPR_DEPTH=0", // bug reported https://sqlite.org/forum/forumpost/87b9262f66, fixed in https://sqlite.org/src/info/5f58dd3a19605b6f
//TODO "-DSQLITE_MAX_MMAP_SIZE=8589934592", // testfixture, bug reported https://sqlite.org/forum/forumpost/34380589f7, fixed in https://sqlite.org/src/info/d8e47382160e98be
//TODO- "-DSQLITE_DEBUG",
//TODO- "-DSQLITE_ENABLE_API_ARMOR",
//TODO- "-DSQLITE_MEMDEBUG",
}
configTest = [ ] string {
"-DHAVE_USLEEP" ,
"-DLONGDOUBLE_TYPE=double" ,
"-DSQLITE_CKSUMVFS_STATIC" ,
2023-01-22 14:26:47 +03:00
"-DSQLITE_CORE" , // testfixture
"-DSQLITE_DEFAULT_MEMSTATUS=1" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_DEFAULT_PAGE_SIZE=1024" , // testfixture, hardcoded. See file_pages in autovacuum.test.
"-DSQLITE_ENABLE_BYTECODE_VTAB" , // testfixture
"-DSQLITE_ENABLE_COLUMN_METADATA" ,
"-DSQLITE_ENABLE_DBPAGE_VTAB" , // testfixture
"-DSQLITE_ENABLE_DBSTAT_VTAB" ,
"-DSQLITE_ENABLE_DESERIALIZE" , // testfixture
"-DSQLITE_ENABLE_EXPLAIN_COMMENTS" ,
"-DSQLITE_ENABLE_FTS5" ,
"-DSQLITE_ENABLE_GEOPOLY" ,
2022-03-07 13:08:26 +03:00
"-DSQLITE_ENABLE_MATH_FUNCTIONS" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_ENABLE_MEMORY_MANAGEMENT" ,
"-DSQLITE_ENABLE_OFFSET_SQL_FUNC" ,
"-DSQLITE_ENABLE_PREUPDATE_HOOK" ,
"-DSQLITE_ENABLE_RBU" ,
"-DSQLITE_ENABLE_RTREE" ,
"-DSQLITE_ENABLE_SESSION" ,
"-DSQLITE_ENABLE_STAT4" ,
"-DSQLITE_ENABLE_STMTVTAB" , // testfixture
"-DSQLITE_ENABLE_UNLOCK_NOTIFY" , // Adds sqlite3_unlock_notify().
"-DSQLITE_LIKE_DOESNT_MATCH_BLOBS" ,
"-DSQLITE_MUTEX_APPDEF=1" ,
2021-12-12 17:47:51 +03:00
"-DSQLITE_MUTEX_NOOP" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_SOUNDEX" ,
"-DSQLITE_TEMP_STORE=1" , // testfixture
"-DSQLITE_TEST" ,
"-DSQLITE_THREADSAFE=1" ,
//DONT "-DNDEBUG", // To enable GO_GENERATE=-DSQLITE_DEBUG
//DONT "-DSQLITE_DQS=0", // testfixture
2023-01-22 14:26:47 +03:00
//DONT "-DSQLITE_ENABLE_SNAPSHOT",
2021-08-29 17:41:41 +03:00
//DONT "-DSQLITE_NO_SYNC=1",
//DONT "-DSQLITE_OMIT_DECLTYPE", // testfixture
//DONT "-DSQLITE_OMIT_DEPRECATED", // mptest
//DONT "-DSQLITE_OMIT_LOAD_EXTENSION", // mptest
//DONT "-DSQLITE_OMIT_SHARED_CACHE",
//DONT "-DSQLITE_USE_ALLOCA",
//TODO "-DHAVE_MALLOC_USABLE_SIZE"
//TODO "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1", //TODO report bug
//TODO "-DSQLITE_ENABLE_FTS3",
//TODO "-DSQLITE_ENABLE_FTS3_PARENTHESIS",
//TODO "-DSQLITE_ENABLE_FTS3_TOKENIZER",
//TODO "-DSQLITE_ENABLE_FTS4",
//TODO "-DSQLITE_ENABLE_ICU",
//TODO "-DSQLITE_MAX_EXPR_DEPTH=0", // bug reported https://sqlite.org/forum/forumpost/87b9262f66, fixed in https://sqlite.org/src/info/5f58dd3a19605b6f
//TODO "-DSQLITE_MAX_MMAP_SIZE=8589934592", // testfixture, bug reported https://sqlite.org/forum/forumpost/34380589f7, fixed in https://sqlite.org/src/info/d8e47382160e98be
//TODO- "-DSQLITE_DEBUG",
//TODO- "-DSQLITE_ENABLE_API_ARMOR",
//TODO- "-DSQLITE_MEMDEBUG",
}
downloads = [ ] struct {
dir , url string
sz int
dev bool
} {
2023-04-03 12:19:05 +03:00
{ sqliteDir , "https://www.sqlite.org/2023/sqlite-amalgamation-3410200.zip" , 2457 , false } ,
{ sqliteSrcDir , "https://www.sqlite.org/2023/sqlite-src-3410200.zip" , 12814 , false } ,
2021-08-29 17:41:41 +03:00
}
2023-04-03 12:19:05 +03:00
sqliteDir = filepath . FromSlash ( "testdata/sqlite-amalgamation-3410200" )
sqliteSrcDir = filepath . FromSlash ( "testdata/sqlite-src-3410200" )
2021-08-29 17:41:41 +03:00
)
func download ( ) {
2022-09-28 20:30:40 +03:00
tmp , err := os . MkdirTemp ( "" , "" )
2021-08-29 17:41:41 +03:00
if err != nil {
fmt . Fprintf ( os . Stderr , "%s\n" , err )
return
}
defer os . RemoveAll ( tmp )
for _ , v := range downloads {
dir := filepath . FromSlash ( v . dir )
root := filepath . Dir ( v . dir )
fi , err := os . Stat ( dir )
switch {
case err == nil :
if ! fi . IsDir ( ) {
fmt . Fprintf ( os . Stderr , "expected %s to be a directory\n" , dir )
}
continue
default :
if ! os . IsNotExist ( err ) {
fmt . Fprintf ( os . Stderr , "%s" , err )
continue
}
}
if err := func ( ) error {
fmt . Printf ( "Downloading %v MB from %s\n" , float64 ( v . sz ) / 1000 , v . url )
resp , err := http . Get ( v . url )
if err != nil {
return err
}
defer resp . Body . Close ( )
base := filepath . Base ( v . url )
name := filepath . Join ( tmp , base )
f , err := os . Create ( name )
if err != nil {
return err
}
defer os . Remove ( name )
n , err := io . Copy ( f , resp . Body )
if err != nil {
return err
}
if _ , err := f . Seek ( 0 , io . SeekStart ) ; err != nil {
return err
}
switch {
case strings . HasSuffix ( base , ".zip" ) :
r , err := zip . NewReader ( f , n )
if err != nil {
return err
}
for _ , f := range r . File {
fi := f . FileInfo ( )
if fi . IsDir ( ) {
if err := os . MkdirAll ( filepath . Join ( root , f . Name ) , 0770 ) ; err != nil {
return err
}
continue
}
if err := func ( ) error {
rc , err := f . Open ( )
if err != nil {
return err
}
defer rc . Close ( )
file , err := os . OpenFile ( filepath . Join ( root , f . Name ) , os . O_CREATE | os . O_WRONLY , fi . Mode ( ) )
if err != nil {
return err
}
w := bufio . NewWriter ( file )
if _ , err = io . Copy ( w , rc ) ; err != nil {
return err
}
if err := w . Flush ( ) ; err != nil {
return err
}
return file . Close ( )
} ( ) ; err != nil {
return err
}
}
return nil
}
panic ( "internal error" ) //TODOOK
} ( ) ; err != nil {
fmt . Fprintln ( os . Stderr , err )
}
}
}
func fail ( s string , args ... interface { } ) {
fmt . Fprintf ( os . Stderr , s , args ... )
os . Exit ( 1 )
}
2022-05-18 17:58:26 +03:00
var (
oFullPathComments = flag . Bool ( "full-path-comments" , false , "" )
)
2021-08-29 17:41:41 +03:00
func main ( ) {
2022-05-18 17:58:26 +03:00
flag . Parse ( )
2021-11-27 17:26:58 +03:00
fmt . Printf ( "Running on %s/%s.\n" , runtime . GOOS , runtime . GOARCH )
2021-08-29 17:41:41 +03:00
env := os . Getenv ( "GO_GENERATE" )
goarch := runtime . GOARCH
goos := runtime . GOOS
if s := os . Getenv ( "TARGET_GOOS" ) ; s != "" {
goos = s
}
if s := os . Getenv ( "TARGET_GOARCH" ) ; s != "" {
goarch = s
}
var more [ ] string
if env != "" {
more = strings . Split ( env , "," )
}
ndebug := [ ] string { "-DNDEBUG" }
for _ , v := range more {
if v == "-DSQLITE_DEBUG" {
ndebug = nil
}
}
more = append ( more , ndebug ... )
download ( )
switch goos {
2022-03-07 13:08:26 +03:00
case "linux" , "freebsd" , "openbsd" :
2021-08-29 17:41:41 +03:00
configProduction = append ( configProduction , "-DSQLITE_OS_UNIX=1" )
2021-12-12 17:47:51 +03:00
case "netbsd" :
configProduction = append ( configProduction , [ ] string {
"-DSQLITE_OS_UNIX=1" ,
"-D__libc_cond_broadcast=pthread_cond_broadcast" ,
"-D__libc_cond_destroy=pthread_cond_destroy" ,
"-D__libc_cond_init=pthread_cond_init" ,
"-D__libc_cond_signal=pthread_cond_signal" ,
"-D__libc_cond_wait=pthread_cond_wait" ,
"-D__libc_mutex_destroy=pthread_mutex_destroy" ,
"-D__libc_mutex_init=pthread_mutex_init" ,
"-D__libc_mutex_lock=pthread_mutex_lock" ,
"-D__libc_mutex_trylock=pthread_mutex_trylock" ,
"-D__libc_mutex_unlock=pthread_mutex_unlock" ,
"-D__libc_mutexattr_destroy=pthread_mutexattr_destroy" ,
"-D__libc_mutexattr_init=pthread_mutexattr_init" ,
"-D__libc_mutexattr_settype=pthread_mutexattr_settype" ,
"-D__libc_thr_yield=sched_yield" ,
} ... )
2021-08-29 17:41:41 +03:00
case "darwin" :
configProduction = append ( configProduction ,
"-DSQLITE_OS_UNIX=1" ,
"-DSQLITE_WITHOUT_ZONEMALLOC" ,
)
configTest = append ( configTest ,
"-DSQLITE_OS_UNIX=1" ,
"-DSQLITE_WITHOUT_ZONEMALLOC" ,
)
case "windows" :
configProduction = append ( configProduction ,
"-DSQLITE_OS_WIN=1" ,
"-D_MSC_VER=1900" ,
)
configTest = append ( configTest ,
"-DSQLITE_OS_WIN=1" ,
"-D_MSC_VER=1900" ,
)
default :
fail ( "unknows/unsupported os: %s\n" , goos )
}
makeSqliteProduction ( goos , goarch , more )
makeSqliteTest ( goos , goarch , more )
makeMpTest ( goos , goarch , more )
makeSpeedTest ( goos , goarch , more )
makeTestfixture ( goos , goarch , more )
ccgo . MustCopyDir ( true , "testdata/tcl" , sqliteSrcDir + "/test" , nil )
ccgo . MustCopyDir ( true , "testdata/tcl" , "testdata/overlay" , nil )
}
func configure ( goos , goarch string ) {
wd , err := os . Getwd ( )
if err != nil {
fail ( "%s" , err )
}
defer os . Chdir ( wd )
if err := os . Chdir ( sqliteSrcDir ) ; err != nil {
fail ( "%s" , err )
}
cmd := newCmd ( "make" , "distclean" )
cmd . Run ( )
var args [ ] string
switch goos {
2022-03-07 13:08:26 +03:00
case "linux" , "freebsd" , "netbsd" , "openbsd" :
2021-08-29 17:41:41 +03:00
// nop
case "darwin" :
args = append ( args , "--with-tcl=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Tcl.framework" )
case "windows" :
switch goarch {
case "amd64" :
args = append ( args , "--host=x86_64-w64-mingw32" )
case "386" :
args = append ( args , "--host=i686-w64-mingw32" )
default :
fail ( "unknown/unsupported os/arch: %s/%s\n" , goos , goarch )
}
default :
fail ( "unknown/unsupported os/arch: %s/%s\n" , goos , goarch )
}
cmd = newCmd ( "./configure" , args ... )
if err = cmd . Run ( ) ; err != nil {
fail ( "%s\n" , err )
}
cmd = newCmd ( "make" , "parse.h" , "opcodes.h" )
if err = cmd . Run ( ) ; err != nil {
fail ( "%s\n" , err )
}
}
func newCmd ( bin string , args ... string ) * exec . Cmd {
fmt . Printf ( "==== newCmd %s\n" , bin )
for _ , v := range args {
fmt . Printf ( "\t%v\n" , v )
}
r := exec . Command ( bin , args ... )
r . Stdout = os . Stdout
r . Stderr = os . Stderr
return r
}
func makeTestfixture ( goos , goarch string , more [ ] string ) {
dir := filepath . FromSlash ( fmt . Sprintf ( "internal/testfixture" ) )
files := [ ] string {
"ext/expert/sqlite3expert.c" ,
"ext/expert/test_expert.c" ,
"ext/fts3/fts3_term.c" ,
"ext/fts3/fts3_test.c" ,
"ext/fts5/fts5_tcl.c" ,
"ext/fts5/fts5_test_mi.c" ,
"ext/fts5/fts5_test_tok.c" ,
"ext/misc/amatch.c" ,
2023-03-06 13:00:53 +03:00
"ext/misc/appendvfs.c" ,
"ext/misc/basexx.c" ,
2021-08-29 17:41:41 +03:00
"ext/misc/carray.c" ,
"ext/misc/cksumvfs.c" ,
"ext/misc/closure.c" ,
"ext/misc/csv.c" ,
"ext/misc/decimal.c" ,
"ext/misc/eval.c" ,
"ext/misc/explain.c" ,
"ext/misc/fileio.c" ,
"ext/misc/fuzzer.c" ,
"ext/misc/ieee754.c" ,
"ext/misc/mmapwarm.c" ,
"ext/misc/nextchar.c" ,
"ext/misc/normalize.c" ,
"ext/misc/percentile.c" ,
"ext/misc/prefixes.c" ,
2022-04-24 13:26:22 +03:00
"ext/misc/qpvtab.c" ,
2021-08-29 17:41:41 +03:00
"ext/misc/regexp.c" ,
"ext/misc/remember.c" ,
"ext/misc/series.c" ,
"ext/misc/spellfix.c" ,
"ext/misc/totype.c" ,
"ext/misc/unionvtab.c" ,
"ext/misc/wholenumber.c" ,
"ext/rbu/test_rbu.c" ,
2023-01-22 14:26:47 +03:00
"ext/recover/dbdata.c" ,
"ext/recover/sqlite3recover.c" ,
"ext/recover/test_recover.c" ,
2021-12-12 17:47:51 +03:00
"ext/rtree/test_rtreedoc.c" ,
2021-08-29 17:41:41 +03:00
"ext/session/test_session.c" ,
"ext/userauth/userauth.c" ,
"src/tclsqlite.c" ,
"src/test1.c" ,
"src/test2.c" ,
"src/test3.c" ,
"src/test4.c" ,
"src/test5.c" ,
"src/test6.c" ,
"src/test8.c" ,
"src/test9.c" ,
"src/test_async.c" ,
"src/test_autoext.c" ,
"src/test_backup.c" ,
"src/test_bestindex.c" ,
"src/test_blob.c" ,
"src/test_btree.c" ,
"src/test_config.c" ,
"src/test_delete.c" ,
"src/test_demovfs.c" ,
"src/test_devsym.c" ,
"src/test_fs.c" ,
"src/test_func.c" ,
"src/test_hexio.c" ,
"src/test_init.c" ,
"src/test_intarray.c" ,
"src/test_journal.c" ,
"src/test_malloc.c" ,
"src/test_md5.c" ,
"src/test_multiplex.c" ,
"src/test_mutex.c" ,
"src/test_onefile.c" ,
"src/test_osinst.c" ,
"src/test_pcache.c" ,
"src/test_quota.c" ,
"src/test_rtree.c" ,
"src/test_schema.c" ,
"src/test_superlock.c" ,
"src/test_syscall.c" ,
"src/test_tclsh.c" ,
"src/test_tclvar.c" ,
"src/test_thread.c" ,
"src/test_vdbecov.c" ,
"src/test_vfs.c" ,
"src/test_windirent.c" ,
"src/test_window.c" ,
"src/test_wsd.c" ,
}
for i , v := range files {
files [ i ] = filepath . Join ( sqliteSrcDir , filepath . FromSlash ( v ) )
}
configure ( goos , goarch )
2021-11-27 17:26:58 +03:00
var defines , includes [ ] string
switch goos {
2022-03-07 13:08:26 +03:00
case "freebsd" , "openbsd" :
2021-11-27 17:26:58 +03:00
includes = [ ] string { "-I/usr/local/include/tcl8.6" }
case "linux" :
includes = [ ] string { "-I/usr/include/tcl8.6" }
case "windows" :
includes = [ ] string { "-I/usr/include/tcl8.6" }
case "netbsd" :
includes = [ ] string { "-I/usr/pkg/include" }
defines = [ ] string {
"-D__libc_cond_broadcast=pthread_cond_broadcast" ,
"-D__libc_cond_destroy=pthread_cond_destroy" ,
"-D__libc_cond_init=pthread_cond_init" ,
"-D__libc_cond_signal=pthread_cond_signal" ,
"-D__libc_cond_wait=pthread_cond_wait" ,
"-D__libc_mutex_destroy=pthread_mutex_destroy" ,
"-D__libc_mutex_init=pthread_mutex_init" ,
"-D__libc_mutex_lock=pthread_mutex_lock" ,
"-D__libc_mutex_trylock=pthread_mutex_trylock" ,
"-D__libc_mutex_unlock=pthread_mutex_unlock" ,
2021-12-12 17:47:51 +03:00
"-D__libc_mutexattr_destroy=pthread_mutexattr_destroy" ,
"-D__libc_mutexattr_init=pthread_mutexattr_init" ,
"-D__libc_mutexattr_settype=pthread_mutexattr_settype" ,
2021-11-27 17:26:58 +03:00
"-D__libc_thr_yield=sched_yield" ,
}
}
2021-08-29 17:41:41 +03:00
args := join (
[ ] string {
"ccgo" ,
2023-01-22 14:26:47 +03:00
"-DBUILD_sqlite" ,
"-DNDEBUG" ,
"-DSQLITE_CKSUMVFS_STATIC" ,
"-DSQLITE_CORE" ,
"-DSQLITE_CRASH_TEST=1" ,
"-DSQLITE_DEFAULT_PAGE_SIZE=1024" ,
"-DSQLITE_ENABLE_BYTECODE_VTAB" ,
"-DSQLITE_ENABLE_DBPAGE_VTAB" ,
"-DSQLITE_ENABLE_MATH_FUNCTIONS" ,
"-DSQLITE_ENABLE_STMTVTAB" ,
"-DSQLITE_NO_SYNC=1" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_OMIT_LOAD_EXTENSION" ,
2023-01-22 14:26:47 +03:00
"-DSQLITE_PRIVATE=\"\"" ,
2021-08-29 17:41:41 +03:00
"-DSQLITE_SERIES_CONSTRAINT_VERIFY=1" ,
"-DSQLITE_SERVER=1" ,
2023-01-22 14:26:47 +03:00
"-DSQLITE_TEMP_STORE=1" ,
"-DSQLITE_TEST=1" ,
"-DSQLITE_THREADSAFE=1" ,
2021-08-29 17:41:41 +03:00
"-DTCLSH_INIT_PROC=sqlite3TestInit" ,
"-D_HAVE_SQLITE_CONFIG_H" ,
2021-11-27 17:26:58 +03:00
} ,
defines ,
includes ,
[ ] string {
2021-08-29 17:41:41 +03:00
"-export-defines" , "" ,
"-export-fields" , "F" ,
2021-12-12 17:47:51 +03:00
"-ignore-unsupported-alignment" ,
2021-08-29 17:41:41 +03:00
"-trace-translation-units" ,
volatiles ,
"-lmodernc.org/sqlite/libtest" ,
"-lmodernc.org/tcl/lib" ,
"-lmodernc.org/z/lib" ,
"-o" , filepath . Join ( dir , fmt . Sprintf ( "testfixture_%s_%s.go" , goos , goarch ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/async" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/fts3" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/icu" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/rtree" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/session" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "ext/userauth" ) ) ) ,
fmt . Sprintf ( "-I%s" , filepath . Join ( sqliteSrcDir , filepath . FromSlash ( "src" ) ) ) ,
fmt . Sprintf ( "-I%s" , sqliteDir ) ,
fmt . Sprintf ( "-I%s" , sqliteSrcDir ) ,
} ,
2022-05-18 17:58:26 +03:00
otherOpts ( ) ,
2021-08-29 17:41:41 +03:00
files ,
more ,
configTest ,
)
task := ccgo . NewTask ( args , nil , nil )
if err := task . Main ( ) ; err != nil {
fail ( "%s\n" , err )
}
}
2022-05-18 17:58:26 +03:00
func otherOpts ( ) ( r [ ] string ) {
if * oFullPathComments {
r = append ( r , "-full-path-comments" )
}
return r
}
2021-08-29 17:41:41 +03:00
func makeSpeedTest ( goos , goarch string , more [ ] string ) {
task := ccgo . NewTask (
join (
[ ] string {
"ccgo" ,
"-export-defines" , "" ,
2021-12-12 17:47:51 +03:00
"-ignore-unsupported-alignment" ,
2021-08-29 17:41:41 +03:00
"-o" , filepath . FromSlash ( fmt . Sprintf ( "speedtest1/main_%s_%s.go" , goos , goarch ) ) ,
"-trace-translation-units" ,
filepath . Join ( sqliteSrcDir , "test" , "speedtest1.c" ) ,
fmt . Sprintf ( "-I%s" , sqliteDir ) ,
"-l" , "modernc.org/sqlite/lib" ,
} ,
2022-05-18 17:58:26 +03:00
otherOpts ( ) ,
2021-08-29 17:41:41 +03:00
more ,
configProduction ,
) ,
nil ,
nil ,
)
if err := task . Main ( ) ; err != nil {
fail ( "%s\n" , err )
}
}
func makeMpTest ( goos , goarch string , more [ ] string ) {
task := ccgo . NewTask (
join (
[ ] string {
"ccgo" ,
"-export-defines" , "" ,
2021-12-12 17:47:51 +03:00
"-ignore-unsupported-alignment" ,
2021-08-29 17:41:41 +03:00
"-o" , filepath . FromSlash ( fmt . Sprintf ( "internal/mptest/main_%s_%s.go" , goos , goarch ) ) ,
"-trace-translation-units" ,
2022-11-28 13:19:39 +03:00
// filepath.Join(sqliteSrcDir, "mptest", "mptest.c"),
filepath . Join ( "testdata" , "mptest.c" ) ,
2021-08-29 17:41:41 +03:00
fmt . Sprintf ( "-I%s" , sqliteDir ) ,
"-l" , "modernc.org/sqlite/lib" ,
} ,
2022-05-18 17:58:26 +03:00
otherOpts ( ) ,
2021-08-29 17:41:41 +03:00
more ,
configProduction ,
) ,
nil ,
nil ,
)
if err := task . Main ( ) ; err != nil {
fail ( "%s\n" , err )
}
}
func makeSqliteProduction ( goos , goarch string , more [ ] string ) {
2022-11-28 13:19:39 +03:00
fn := filepath . FromSlash ( fmt . Sprintf ( "lib/sqlite_%s_%s.go" , goos , goarch ) )
2021-08-29 17:41:41 +03:00
task := ccgo . NewTask (
join (
[ ] string {
"ccgo" ,
"-DSQLITE_PRIVATE=" ,
"-export-defines" , "" ,
"-export-enums" , "" ,
"-export-externs" , "X" ,
"-export-fields" , "F" ,
"-export-typedefs" , "" ,
2021-12-12 17:47:51 +03:00
"-ignore-unsupported-alignment" ,
2021-08-29 17:41:41 +03:00
"-pkgname" , "sqlite3" ,
2022-11-28 13:19:39 +03:00
volatiles ,
"-o" , fn ,
2021-08-29 17:41:41 +03:00
"-trace-translation-units" ,
filepath . Join ( sqliteDir , "sqlite3.c" ) ,
} ,
2022-05-18 17:58:26 +03:00
otherOpts ( ) ,
2021-08-29 17:41:41 +03:00
more ,
configProduction ,
) ,
nil ,
nil ,
)
if err := task . Main ( ) ; err != nil {
fail ( "%s\n" , err )
}
2022-11-28 13:19:39 +03:00
if err := patchXsqlite3_initialize ( fn ) ; err != nil {
fail ( "%s\n" , err )
}
2021-08-29 17:41:41 +03:00
}
func makeSqliteTest ( goos , goarch string , more [ ] string ) {
2022-11-28 13:19:39 +03:00
fn := filepath . FromSlash ( fmt . Sprintf ( "libtest/sqlite_%s_%s.go" , goos , goarch ) )
2021-08-29 17:41:41 +03:00
task := ccgo . NewTask (
join (
[ ] string {
"ccgo" ,
"-DSQLITE_PRIVATE=" ,
"-export-defines" , "" ,
"-export-enums" , "" ,
"-export-externs" , "X" ,
"-export-fields" , "F" ,
"-export-typedefs" , "" ,
2021-12-12 17:47:51 +03:00
"-ignore-unsupported-alignment" ,
2021-08-29 17:41:41 +03:00
"-pkgname" , "sqlite3" ,
2022-11-28 13:19:39 +03:00
volatiles ,
"-o" , fn ,
2021-08-29 17:41:41 +03:00
"-trace-translation-units" ,
volatiles ,
filepath . Join ( sqliteDir , "sqlite3.c" ) ,
} ,
2022-05-18 17:58:26 +03:00
otherOpts ( ) ,
2021-08-29 17:41:41 +03:00
more ,
configTest ,
) ,
nil ,
nil ,
)
if err := task . Main ( ) ; err != nil {
fail ( "%s\n" , err )
}
2022-11-28 13:19:39 +03:00
if err := patchXsqlite3_initialize ( fn ) ; err != nil {
fail ( "%s\n" , err )
}
2021-08-29 17:41:41 +03:00
}
func join ( a ... [ ] string ) ( r [ ] string ) {
n := 0
for _ , v := range a {
n += len ( v )
}
r = make ( [ ] string , 0 , n )
for _ , v := range a {
r = append ( r , v ... )
}
return r
}
2022-11-28 13:19:39 +03:00
func patchXsqlite3_initialize ( fn string ) error {
const s = "func Xsqlite3_initialize(tls *libc.TLS) int32 {"
return patch ( fn , func ( b [ ] byte ) [ ] diff {
x := bytes . Index ( b , [ ] byte ( s ) )
return [ ] diff { { x , x + len ( s ) , `
var mu mutex
func init ( ) { mu . recursive = true }
func Xsqlite3_initialize ( tls * libc . TLS ) int32 {
mu . enter ( tls . ID )
defer mu . leave ( tls . ID )
` } }
} )
}
type diff struct {
from , to int // byte offsets
replace string // replaces b[from:to]
}
func patch ( fn string , f func ( [ ] byte ) [ ] diff ) error {
b , err := os . ReadFile ( fn )
if err != nil {
return err
}
diffs := f ( b )
sort . Slice ( diffs , func ( i , j int ) bool { return diffs [ i ] . from < diffs [ j ] . from } )
var patched [ ] [ ] byte
off := 0
for _ , diff := range diffs {
from := diff . from - off
to := diff . to - off
patched = append ( patched , b [ : from ] )
patched = append ( patched , [ ] byte ( diff . replace ) )
b = b [ to : ]
off += to
}
patched = append ( patched , b )
return os . WriteFile ( fn , bytes . Join ( patched , nil ) , 0660 )
}