source: code/trunk/vendor/modernc.org/sqlite/generator.go@ 822

Last change on this file since 822 was 822, checked in by yakumo.izuru, 22 months ago

Prefer immortal.run over runit and rc.d, use vendored modules
for convenience.

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

File size: 28.2 KB
Line 
1// Copyright 2017 The Sqlite Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build generator
6// +build generator
7
8//TODO 2023-02-23, netbsd/amd64 fails generating SQLite 3.41:
9//
10// 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
11
12package main
13
14import (
15 "archive/zip"
16 "bufio"
17 "bytes"
18 "flag"
19 "fmt"
20 "io"
21 "net/http"
22 "os"
23 "os/exec"
24 "path/filepath"
25 "runtime"
26 "sort"
27 "strings"
28
29 "modernc.org/ccgo/v3/lib"
30)
31
32// gcc
33// -g
34// -O2
35// -DSQLITE_OS_UNIX=1
36// -I.
37// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src
38// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/rtree
39// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/icu
40// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3
41// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/async
42// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/session
43// -I/home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/userauth
44// -D_HAVE_SQLITE_CONFIG_H
45// -DBUILD_sqlite
46// -DNDEBUG
47// -I/usr/include/tcl8.6
48// -DSQLITE_THREADSAFE=1
49// -DSQLITE_HAVE_ZLIB=1
50// -DSQLITE_NO_SYNC=1
51// -DSQLITE_TEMP_STORE=1
52// -DSQLITE_TEST=1
53// -DSQLITE_CRASH_TEST=1
54// -DTCLSH_INIT_PROC=sqlite3TestInit
55// -DSQLITE_SERVER=1
56// -DSQLITE_PRIVATE=
57// -DSQLITE_CORE
58// -DBUILD_sqlite
59// -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
60// -DSQLITE_DEFAULT_PAGE_SIZE=1024
61// -DSQLITE_ENABLE_STMTVTAB
62// -DSQLITE_ENABLE_DBPAGE_VTAB
63// -DSQLITE_ENABLE_BYTECODE_VTAB
64// -DSQLITE_ENABLE_DESERIALIZE
65// -o testfixture
66// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test1.c
67// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test2.c
68// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test3.c
69// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test4.c
70// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test5.c
71// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test6.c
72// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test7.c
73// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test8.c
74// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test9.c
75// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_autoext.c
76// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_async.c
77// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_backup.c
78// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_bestindex.c
79// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_blob.c
80// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_btree.c
81// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_config.c
82// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_delete.c
83// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_demovfs.c
84// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_devsym.c
85// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_fs.c
86// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_func.c
87// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_hexio.c
88// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_init.c
89// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_intarray.c
90// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_journal.c
91// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_malloc.c
92// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_md5.c
93// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_multiplex.c
94// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_mutex.c
95// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_onefile.c
96// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_osinst.c
97// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_pcache.c
98// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_quota.c
99// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_rtree.c
100// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_schema.c
101// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_server.c
102// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_superlock.c
103// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_syscall.c
104// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_tclsh.c
105// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_tclvar.c
106// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_thread.c
107// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_vdbecov.c
108// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_vfs.c
109// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_windirent.c
110// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_window.c
111// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/test_wsd.c
112// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3/fts3_term.c
113// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts3/fts3_test.c
114// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/session/test_session.c
115// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/rbu/test_rbu.c
116// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/expert/sqlite3expert.c
117// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/expert/test_expert.c
118// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/amatch.c
119// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/carray.c
120// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/closure.c
121// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/csv.c
122// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/decimal.c
123// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/eval.c
124// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/explain.c
125// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/fileio.c
126// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/fuzzer.c
127// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_tcl.c
128// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_test_mi.c
129// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/fts5/fts5_test_tok.c
130// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/ieee754.c
131// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/mmapwarm.c
132// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/nextchar.c
133// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/normalize.c
134// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/percentile.c
135// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/prefixes.c
136// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/regexp.c
137// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/remember.c
138// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/series.c
139// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/spellfix.c
140// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/totype.c
141// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/unionvtab.c
142// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/wholenumber.c
143// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/misc/zipfile.c
144// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/ext/userauth/userauth.c
145// /home/jnml/src/modernc.org/sqlite/testdata/SQLite-3c5e63c2/src/tclsqlite.c
146// sqlite3.c
147// -L/usr/lib/x86_64-linux-gnu
148// -ltcl8.6
149// -ldl
150// -lz
151// -lpthread
152
153const (
154 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"
155)
156
157// 2022-11-27 Removing -DSQLITE_ENABLE_SNAPSHOT from configTest. This #define
158// makes a single test fail on linux/ppc64le. That test is run only when the
159// -DSQLITE_ENABLE_SNAPSHOT is present when compiling the testfixture. When
160// investigating the failure it turns out this #define is actually NOT present
161// when doing '$ ./configure && make tcltest' in sqlite-src-3400000, ie. in the
162// original C code.
163//
164// 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 ...
165
166var (
167 configProduction = []string{
168 "-DHAVE_USLEEP",
169 "-DLONGDOUBLE_TYPE=double",
170 "-DSQLITE_CORE",
171 "-DSQLITE_DEFAULT_MEMSTATUS=0",
172 "-DSQLITE_ENABLE_COLUMN_METADATA",
173 "-DSQLITE_ENABLE_FTS5",
174 "-DSQLITE_ENABLE_GEOPOLY",
175 "-DSQLITE_ENABLE_MATH_FUNCTIONS",
176 "-DSQLITE_ENABLE_MEMORY_MANAGEMENT",
177 "-DSQLITE_ENABLE_OFFSET_SQL_FUNC",
178 "-DSQLITE_ENABLE_PREUPDATE_HOOK",
179 "-DSQLITE_ENABLE_RBU",
180 "-DSQLITE_ENABLE_RTREE",
181 "-DSQLITE_ENABLE_SESSION",
182 "-DSQLITE_ENABLE_SNAPSHOT",
183 "-DSQLITE_ENABLE_STAT4",
184 "-DSQLITE_ENABLE_UNLOCK_NOTIFY", // Adds sqlite3_unlock_notify().
185 "-DSQLITE_LIKE_DOESNT_MATCH_BLOBS",
186 "-DSQLITE_MUTEX_APPDEF=1",
187 "-DSQLITE_MUTEX_NOOP",
188 "-DSQLITE_SOUNDEX",
189 "-DSQLITE_THREADSAFE=1",
190 //DONT "-DNDEBUG", // To enable GO_GENERATE=-DSQLITE_DEBUG
191 //DONT "-DSQLITE_DQS=0", // testfixture
192 //DONT "-DSQLITE_NO_SYNC=1",
193 //DONT "-DSQLITE_OMIT_DECLTYPE", // testfixture
194 //DONT "-DSQLITE_OMIT_DEPRECATED", // mptest
195 //DONT "-DSQLITE_OMIT_LOAD_EXTENSION", // mptest
196 //DONT "-DSQLITE_OMIT_SHARED_CACHE",
197 //DONT "-DSQLITE_USE_ALLOCA",
198 //TODO "-DHAVE_MALLOC_USABLE_SIZE"
199 //TODO "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1", //TODO report bug
200 //TODO "-DSQLITE_ENABLE_FTS3",
201 //TODO "-DSQLITE_ENABLE_FTS3_PARENTHESIS",
202 //TODO "-DSQLITE_ENABLE_FTS3_TOKENIZER",
203 //TODO "-DSQLITE_ENABLE_FTS4",
204 //TODO "-DSQLITE_ENABLE_ICU",
205 //TODO "-DSQLITE_MAX_EXPR_DEPTH=0", // bug reported https://sqlite.org/forum/forumpost/87b9262f66, fixed in https://sqlite.org/src/info/5f58dd3a19605b6f
206 //TODO "-DSQLITE_MAX_MMAP_SIZE=8589934592", // testfixture, bug reported https://sqlite.org/forum/forumpost/34380589f7, fixed in https://sqlite.org/src/info/d8e47382160e98be
207 //TODO- "-DSQLITE_DEBUG",
208 //TODO- "-DSQLITE_ENABLE_API_ARMOR",
209 //TODO- "-DSQLITE_MEMDEBUG",
210 }
211
212 configTest = []string{
213 "-DHAVE_USLEEP",
214 "-DLONGDOUBLE_TYPE=double",
215 "-DSQLITE_CKSUMVFS_STATIC",
216 "-DSQLITE_CORE", // testfixture
217 "-DSQLITE_DEFAULT_MEMSTATUS=1",
218 "-DSQLITE_DEFAULT_PAGE_SIZE=1024", // testfixture, hardcoded. See file_pages in autovacuum.test.
219 "-DSQLITE_ENABLE_BYTECODE_VTAB", // testfixture
220 "-DSQLITE_ENABLE_COLUMN_METADATA",
221 "-DSQLITE_ENABLE_DBPAGE_VTAB", // testfixture
222 "-DSQLITE_ENABLE_DBSTAT_VTAB",
223 "-DSQLITE_ENABLE_DESERIALIZE", // testfixture
224 "-DSQLITE_ENABLE_EXPLAIN_COMMENTS",
225 "-DSQLITE_ENABLE_FTS5",
226 "-DSQLITE_ENABLE_GEOPOLY",
227 "-DSQLITE_ENABLE_MATH_FUNCTIONS",
228 "-DSQLITE_ENABLE_MEMORY_MANAGEMENT",
229 "-DSQLITE_ENABLE_OFFSET_SQL_FUNC",
230 "-DSQLITE_ENABLE_PREUPDATE_HOOK",
231 "-DSQLITE_ENABLE_RBU",
232 "-DSQLITE_ENABLE_RTREE",
233 "-DSQLITE_ENABLE_SESSION",
234 "-DSQLITE_ENABLE_STAT4",
235 "-DSQLITE_ENABLE_STMTVTAB", // testfixture
236 "-DSQLITE_ENABLE_UNLOCK_NOTIFY", // Adds sqlite3_unlock_notify().
237 "-DSQLITE_LIKE_DOESNT_MATCH_BLOBS",
238 "-DSQLITE_MUTEX_APPDEF=1",
239 "-DSQLITE_MUTEX_NOOP",
240 "-DSQLITE_SOUNDEX",
241 "-DSQLITE_TEMP_STORE=1", // testfixture
242 "-DSQLITE_TEST",
243 "-DSQLITE_THREADSAFE=1",
244 //DONT "-DNDEBUG", // To enable GO_GENERATE=-DSQLITE_DEBUG
245 //DONT "-DSQLITE_DQS=0", // testfixture
246 //DONT "-DSQLITE_ENABLE_SNAPSHOT",
247 //DONT "-DSQLITE_NO_SYNC=1",
248 //DONT "-DSQLITE_OMIT_DECLTYPE", // testfixture
249 //DONT "-DSQLITE_OMIT_DEPRECATED", // mptest
250 //DONT "-DSQLITE_OMIT_LOAD_EXTENSION", // mptest
251 //DONT "-DSQLITE_OMIT_SHARED_CACHE",
252 //DONT "-DSQLITE_USE_ALLOCA",
253 //TODO "-DHAVE_MALLOC_USABLE_SIZE"
254 //TODO "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1", //TODO report bug
255 //TODO "-DSQLITE_ENABLE_FTS3",
256 //TODO "-DSQLITE_ENABLE_FTS3_PARENTHESIS",
257 //TODO "-DSQLITE_ENABLE_FTS3_TOKENIZER",
258 //TODO "-DSQLITE_ENABLE_FTS4",
259 //TODO "-DSQLITE_ENABLE_ICU",
260 //TODO "-DSQLITE_MAX_EXPR_DEPTH=0", // bug reported https://sqlite.org/forum/forumpost/87b9262f66, fixed in https://sqlite.org/src/info/5f58dd3a19605b6f
261 //TODO "-DSQLITE_MAX_MMAP_SIZE=8589934592", // testfixture, bug reported https://sqlite.org/forum/forumpost/34380589f7, fixed in https://sqlite.org/src/info/d8e47382160e98be
262 //TODO- "-DSQLITE_DEBUG",
263 //TODO- "-DSQLITE_ENABLE_API_ARMOR",
264 //TODO- "-DSQLITE_MEMDEBUG",
265 }
266
267 downloads = []struct {
268 dir, url string
269 sz int
270 dev bool
271 }{
272 {sqliteDir, "https://www.sqlite.org/2023/sqlite-amalgamation-3410000.zip", 2457, false},
273 {sqliteSrcDir, "https://www.sqlite.org/2023/sqlite-src-3410000.zip", 12814, false},
274 }
275
276 sqliteDir = filepath.FromSlash("testdata/sqlite-amalgamation-3410000")
277 sqliteSrcDir = filepath.FromSlash("testdata/sqlite-src-3410000")
278)
279
280func download() {
281 tmp, err := os.MkdirTemp("", "")
282 if err != nil {
283 fmt.Fprintf(os.Stderr, "%s\n", err)
284 return
285 }
286
287 defer os.RemoveAll(tmp)
288
289 for _, v := range downloads {
290 dir := filepath.FromSlash(v.dir)
291 root := filepath.Dir(v.dir)
292 fi, err := os.Stat(dir)
293 switch {
294 case err == nil:
295 if !fi.IsDir() {
296 fmt.Fprintf(os.Stderr, "expected %s to be a directory\n", dir)
297 }
298 continue
299 default:
300 if !os.IsNotExist(err) {
301 fmt.Fprintf(os.Stderr, "%s", err)
302 continue
303 }
304 }
305
306 if err := func() error {
307 fmt.Printf("Downloading %v MB from %s\n", float64(v.sz)/1000, v.url)
308 resp, err := http.Get(v.url)
309 if err != nil {
310 return err
311 }
312
313 defer resp.Body.Close()
314
315 base := filepath.Base(v.url)
316 name := filepath.Join(tmp, base)
317 f, err := os.Create(name)
318 if err != nil {
319 return err
320 }
321
322 defer os.Remove(name)
323
324 n, err := io.Copy(f, resp.Body)
325 if err != nil {
326 return err
327 }
328
329 if _, err := f.Seek(0, io.SeekStart); err != nil {
330 return err
331 }
332
333 switch {
334 case strings.HasSuffix(base, ".zip"):
335 r, err := zip.NewReader(f, n)
336 if err != nil {
337 return err
338 }
339
340 for _, f := range r.File {
341 fi := f.FileInfo()
342 if fi.IsDir() {
343 if err := os.MkdirAll(filepath.Join(root, f.Name), 0770); err != nil {
344 return err
345 }
346
347 continue
348 }
349
350 if err := func() error {
351 rc, err := f.Open()
352 if err != nil {
353 return err
354 }
355
356 defer rc.Close()
357
358 file, err := os.OpenFile(filepath.Join(root, f.Name), os.O_CREATE|os.O_WRONLY, fi.Mode())
359 if err != nil {
360 return err
361 }
362
363 w := bufio.NewWriter(file)
364 if _, err = io.Copy(w, rc); err != nil {
365 return err
366 }
367
368 if err := w.Flush(); err != nil {
369 return err
370 }
371
372 return file.Close()
373 }(); err != nil {
374 return err
375 }
376 }
377 return nil
378 }
379 panic("internal error") //TODOOK
380 }(); err != nil {
381 fmt.Fprintln(os.Stderr, err)
382 }
383 }
384}
385
386func fail(s string, args ...interface{}) {
387 fmt.Fprintf(os.Stderr, s, args...)
388 os.Exit(1)
389}
390
391var (
392 oFullPathComments = flag.Bool("full-path-comments", false, "")
393)
394
395func main() {
396 flag.Parse()
397 fmt.Printf("Running on %s/%s.\n", runtime.GOOS, runtime.GOARCH)
398 env := os.Getenv("GO_GENERATE")
399 goarch := runtime.GOARCH
400 goos := runtime.GOOS
401 if s := os.Getenv("TARGET_GOOS"); s != "" {
402 goos = s
403 }
404 if s := os.Getenv("TARGET_GOARCH"); s != "" {
405 goarch = s
406 }
407 var more []string
408 if env != "" {
409 more = strings.Split(env, ",")
410 }
411 ndebug := []string{"-DNDEBUG"}
412 for _, v := range more {
413 if v == "-DSQLITE_DEBUG" {
414 ndebug = nil
415 }
416 }
417 more = append(more, ndebug...)
418 download()
419 switch goos {
420 case "linux", "freebsd", "openbsd":
421 configProduction = append(configProduction, "-DSQLITE_OS_UNIX=1")
422 case "netbsd":
423 configProduction = append(configProduction, []string{
424 "-DSQLITE_OS_UNIX=1",
425 "-D__libc_cond_broadcast=pthread_cond_broadcast",
426 "-D__libc_cond_destroy=pthread_cond_destroy",
427 "-D__libc_cond_init=pthread_cond_init",
428 "-D__libc_cond_signal=pthread_cond_signal",
429 "-D__libc_cond_wait=pthread_cond_wait",
430 "-D__libc_mutex_destroy=pthread_mutex_destroy",
431 "-D__libc_mutex_init=pthread_mutex_init",
432 "-D__libc_mutex_lock=pthread_mutex_lock",
433 "-D__libc_mutex_trylock=pthread_mutex_trylock",
434 "-D__libc_mutex_unlock=pthread_mutex_unlock",
435 "-D__libc_mutexattr_destroy=pthread_mutexattr_destroy",
436 "-D__libc_mutexattr_init=pthread_mutexattr_init",
437 "-D__libc_mutexattr_settype=pthread_mutexattr_settype",
438 "-D__libc_thr_yield=sched_yield",
439 }...)
440 case "darwin":
441 configProduction = append(configProduction,
442 "-DSQLITE_OS_UNIX=1",
443 "-DSQLITE_WITHOUT_ZONEMALLOC",
444 )
445 configTest = append(configTest,
446 "-DSQLITE_OS_UNIX=1",
447 "-DSQLITE_WITHOUT_ZONEMALLOC",
448 )
449 case "windows":
450 configProduction = append(configProduction,
451 "-DSQLITE_OS_WIN=1",
452 "-D_MSC_VER=1900",
453 )
454 configTest = append(configTest,
455 "-DSQLITE_OS_WIN=1",
456 "-D_MSC_VER=1900",
457 )
458 default:
459 fail("unknows/unsupported os: %s\n", goos)
460 }
461 makeSqliteProduction(goos, goarch, more)
462 makeSqliteTest(goos, goarch, more)
463 makeMpTest(goos, goarch, more)
464 makeSpeedTest(goos, goarch, more)
465 makeTestfixture(goos, goarch, more)
466 ccgo.MustCopyDir(true, "testdata/tcl", sqliteSrcDir+"/test", nil)
467 ccgo.MustCopyDir(true, "testdata/tcl", "testdata/overlay", nil)
468}
469
470func configure(goos, goarch string) {
471 wd, err := os.Getwd()
472 if err != nil {
473 fail("%s", err)
474 }
475
476 defer os.Chdir(wd)
477
478 if err := os.Chdir(sqliteSrcDir); err != nil {
479 fail("%s", err)
480 }
481
482 cmd := newCmd("make", "distclean")
483 cmd.Run()
484 var args []string
485 switch goos {
486 case "linux", "freebsd", "netbsd", "openbsd":
487 // nop
488 case "darwin":
489 args = append(args, "--with-tcl=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Tcl.framework")
490 case "windows":
491 switch goarch {
492 case "amd64":
493 args = append(args, "--host=x86_64-w64-mingw32")
494 case "386":
495 args = append(args, "--host=i686-w64-mingw32")
496 default:
497 fail("unknown/unsupported os/arch: %s/%s\n", goos, goarch)
498 }
499 default:
500 fail("unknown/unsupported os/arch: %s/%s\n", goos, goarch)
501 }
502 cmd = newCmd("./configure", args...)
503 if err = cmd.Run(); err != nil {
504 fail("%s\n", err)
505 }
506
507 cmd = newCmd("make", "parse.h", "opcodes.h")
508 if err = cmd.Run(); err != nil {
509 fail("%s\n", err)
510 }
511}
512
513func newCmd(bin string, args ...string) *exec.Cmd {
514 fmt.Printf("==== newCmd %s\n", bin)
515 for _, v := range args {
516 fmt.Printf("\t%v\n", v)
517 }
518 r := exec.Command(bin, args...)
519 r.Stdout = os.Stdout
520 r.Stderr = os.Stderr
521 return r
522}
523
524func makeTestfixture(goos, goarch string, more []string) {
525 dir := filepath.FromSlash(fmt.Sprintf("internal/testfixture"))
526 files := []string{
527 "ext/expert/sqlite3expert.c",
528 "ext/expert/test_expert.c",
529 "ext/fts3/fts3_term.c",
530 "ext/fts3/fts3_test.c",
531 "ext/fts5/fts5_tcl.c",
532 "ext/fts5/fts5_test_mi.c",
533 "ext/fts5/fts5_test_tok.c",
534 "ext/misc/amatch.c",
535 "ext/misc/appendvfs.c",
536 "ext/misc/basexx.c",
537 "ext/misc/carray.c",
538 "ext/misc/cksumvfs.c",
539 "ext/misc/closure.c",
540 "ext/misc/csv.c",
541 "ext/misc/decimal.c",
542 "ext/misc/eval.c",
543 "ext/misc/explain.c",
544 "ext/misc/fileio.c",
545 "ext/misc/fuzzer.c",
546 "ext/misc/ieee754.c",
547 "ext/misc/mmapwarm.c",
548 "ext/misc/nextchar.c",
549 "ext/misc/normalize.c",
550 "ext/misc/percentile.c",
551 "ext/misc/prefixes.c",
552 "ext/misc/qpvtab.c",
553 "ext/misc/regexp.c",
554 "ext/misc/remember.c",
555 "ext/misc/series.c",
556 "ext/misc/spellfix.c",
557 "ext/misc/totype.c",
558 "ext/misc/unionvtab.c",
559 "ext/misc/wholenumber.c",
560 "ext/rbu/test_rbu.c",
561 "ext/recover/dbdata.c",
562 "ext/recover/sqlite3recover.c",
563 "ext/recover/test_recover.c",
564 "ext/rtree/test_rtreedoc.c",
565 "ext/session/test_session.c",
566 "ext/userauth/userauth.c",
567 "src/tclsqlite.c",
568 "src/test1.c",
569 "src/test2.c",
570 "src/test3.c",
571 "src/test4.c",
572 "src/test5.c",
573 "src/test6.c",
574 "src/test8.c",
575 "src/test9.c",
576 "src/test_async.c",
577 "src/test_autoext.c",
578 "src/test_backup.c",
579 "src/test_bestindex.c",
580 "src/test_blob.c",
581 "src/test_btree.c",
582 "src/test_config.c",
583 "src/test_delete.c",
584 "src/test_demovfs.c",
585 "src/test_devsym.c",
586 "src/test_fs.c",
587 "src/test_func.c",
588 "src/test_hexio.c",
589 "src/test_init.c",
590 "src/test_intarray.c",
591 "src/test_journal.c",
592 "src/test_malloc.c",
593 "src/test_md5.c",
594 "src/test_multiplex.c",
595 "src/test_mutex.c",
596 "src/test_onefile.c",
597 "src/test_osinst.c",
598 "src/test_pcache.c",
599 "src/test_quota.c",
600 "src/test_rtree.c",
601 "src/test_schema.c",
602 "src/test_superlock.c",
603 "src/test_syscall.c",
604 "src/test_tclsh.c",
605 "src/test_tclvar.c",
606 "src/test_thread.c",
607 "src/test_vdbecov.c",
608 "src/test_vfs.c",
609 "src/test_windirent.c",
610 "src/test_window.c",
611 "src/test_wsd.c",
612 }
613 for i, v := range files {
614 files[i] = filepath.Join(sqliteSrcDir, filepath.FromSlash(v))
615 }
616 configure(goos, goarch)
617
618 var defines, includes []string
619 switch goos {
620 case "freebsd", "openbsd":
621 includes = []string{"-I/usr/local/include/tcl8.6"}
622 case "linux":
623 includes = []string{"-I/usr/include/tcl8.6"}
624 case "windows":
625 includes = []string{"-I/usr/include/tcl8.6"}
626 case "netbsd":
627 includes = []string{"-I/usr/pkg/include"}
628 defines = []string{
629 "-D__libc_cond_broadcast=pthread_cond_broadcast",
630 "-D__libc_cond_destroy=pthread_cond_destroy",
631 "-D__libc_cond_init=pthread_cond_init",
632 "-D__libc_cond_signal=pthread_cond_signal",
633 "-D__libc_cond_wait=pthread_cond_wait",
634 "-D__libc_mutex_destroy=pthread_mutex_destroy",
635 "-D__libc_mutex_init=pthread_mutex_init",
636 "-D__libc_mutex_lock=pthread_mutex_lock",
637 "-D__libc_mutex_trylock=pthread_mutex_trylock",
638 "-D__libc_mutex_unlock=pthread_mutex_unlock",
639 "-D__libc_mutexattr_destroy=pthread_mutexattr_destroy",
640 "-D__libc_mutexattr_init=pthread_mutexattr_init",
641 "-D__libc_mutexattr_settype=pthread_mutexattr_settype",
642 "-D__libc_thr_yield=sched_yield",
643 }
644 }
645
646 args := join(
647 []string{
648 "ccgo",
649 "-DBUILD_sqlite",
650 "-DNDEBUG",
651 "-DSQLITE_CKSUMVFS_STATIC",
652 "-DSQLITE_CORE",
653 "-DSQLITE_CRASH_TEST=1",
654 "-DSQLITE_DEFAULT_PAGE_SIZE=1024",
655 "-DSQLITE_ENABLE_BYTECODE_VTAB",
656 "-DSQLITE_ENABLE_DBPAGE_VTAB",
657 "-DSQLITE_ENABLE_MATH_FUNCTIONS",
658 "-DSQLITE_ENABLE_STMTVTAB",
659 "-DSQLITE_NO_SYNC=1",
660 "-DSQLITE_OMIT_LOAD_EXTENSION",
661 "-DSQLITE_PRIVATE=\"\"",
662 "-DSQLITE_SERIES_CONSTRAINT_VERIFY=1",
663 "-DSQLITE_SERVER=1",
664 "-DSQLITE_TEMP_STORE=1",
665 "-DSQLITE_TEST=1",
666 "-DSQLITE_THREADSAFE=1",
667 "-DTCLSH_INIT_PROC=sqlite3TestInit",
668 "-D_HAVE_SQLITE_CONFIG_H",
669 },
670 defines,
671 includes,
672 []string{
673 "-export-defines", "",
674 "-export-fields", "F",
675 "-ignore-unsupported-alignment",
676 "-trace-translation-units",
677 volatiles,
678 "-lmodernc.org/sqlite/libtest",
679 "-lmodernc.org/tcl/lib",
680 "-lmodernc.org/z/lib",
681 "-o", filepath.Join(dir, fmt.Sprintf("testfixture_%s_%s.go", goos, goarch)),
682 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/async"))),
683 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/fts3"))),
684 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/icu"))),
685 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/rtree"))),
686 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/session"))),
687 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("ext/userauth"))),
688 fmt.Sprintf("-I%s", filepath.Join(sqliteSrcDir, filepath.FromSlash("src"))),
689 fmt.Sprintf("-I%s", sqliteDir),
690 fmt.Sprintf("-I%s", sqliteSrcDir),
691 },
692 otherOpts(),
693 files,
694 more,
695 configTest,
696 )
697 task := ccgo.NewTask(args, nil, nil)
698 if err := task.Main(); err != nil {
699 fail("%s\n", err)
700 }
701}
702
703func otherOpts() (r []string) {
704 if *oFullPathComments {
705 r = append(r, "-full-path-comments")
706 }
707 return r
708}
709
710func makeSpeedTest(goos, goarch string, more []string) {
711 task := ccgo.NewTask(
712 join(
713 []string{
714 "ccgo",
715 "-export-defines", "",
716 "-ignore-unsupported-alignment",
717 "-o", filepath.FromSlash(fmt.Sprintf("speedtest1/main_%s_%s.go", goos, goarch)),
718 "-trace-translation-units",
719 filepath.Join(sqliteSrcDir, "test", "speedtest1.c"),
720 fmt.Sprintf("-I%s", sqliteDir),
721 "-l", "modernc.org/sqlite/lib",
722 },
723 otherOpts(),
724 more,
725 configProduction,
726 ),
727 nil,
728 nil,
729 )
730 if err := task.Main(); err != nil {
731 fail("%s\n", err)
732 }
733}
734
735func makeMpTest(goos, goarch string, more []string) {
736 task := ccgo.NewTask(
737 join(
738 []string{
739 "ccgo",
740 "-export-defines", "",
741 "-ignore-unsupported-alignment",
742 "-o", filepath.FromSlash(fmt.Sprintf("internal/mptest/main_%s_%s.go", goos, goarch)),
743 "-trace-translation-units",
744 // filepath.Join(sqliteSrcDir, "mptest", "mptest.c"),
745 filepath.Join("testdata", "mptest.c"),
746 fmt.Sprintf("-I%s", sqliteDir),
747 "-l", "modernc.org/sqlite/lib",
748 },
749 otherOpts(),
750 more,
751 configProduction,
752 ),
753 nil,
754 nil,
755 )
756 if err := task.Main(); err != nil {
757 fail("%s\n", err)
758 }
759}
760
761func makeSqliteProduction(goos, goarch string, more []string) {
762 fn := filepath.FromSlash(fmt.Sprintf("lib/sqlite_%s_%s.go", goos, goarch))
763 task := ccgo.NewTask(
764 join(
765 []string{
766 "ccgo",
767 "-DSQLITE_PRIVATE=",
768 "-export-defines", "",
769 "-export-enums", "",
770 "-export-externs", "X",
771 "-export-fields", "F",
772 "-export-typedefs", "",
773 "-ignore-unsupported-alignment",
774 "-pkgname", "sqlite3",
775 volatiles,
776 "-o", fn,
777 "-trace-translation-units",
778 filepath.Join(sqliteDir, "sqlite3.c"),
779 },
780 otherOpts(),
781 more,
782 configProduction,
783 ),
784 nil,
785 nil,
786 )
787 if err := task.Main(); err != nil {
788 fail("%s\n", err)
789 }
790
791 if err := patchXsqlite3_initialize(fn); err != nil {
792 fail("%s\n", err)
793 }
794}
795
796func makeSqliteTest(goos, goarch string, more []string) {
797 fn := filepath.FromSlash(fmt.Sprintf("libtest/sqlite_%s_%s.go", goos, goarch))
798 task := ccgo.NewTask(
799 join(
800 []string{
801 "ccgo",
802 "-DSQLITE_PRIVATE=",
803 "-export-defines", "",
804 "-export-enums", "",
805 "-export-externs", "X",
806 "-export-fields", "F",
807 "-export-typedefs", "",
808 "-ignore-unsupported-alignment",
809 "-pkgname", "sqlite3",
810 volatiles,
811 "-o", fn,
812 "-trace-translation-units",
813 volatiles,
814 filepath.Join(sqliteDir, "sqlite3.c"),
815 },
816 otherOpts(),
817 more,
818 configTest,
819 ),
820 nil,
821 nil,
822 )
823 if err := task.Main(); err != nil {
824 fail("%s\n", err)
825 }
826
827 if err := patchXsqlite3_initialize(fn); err != nil {
828 fail("%s\n", err)
829 }
830}
831
832func join(a ...[]string) (r []string) {
833 n := 0
834 for _, v := range a {
835 n += len(v)
836 }
837 r = make([]string, 0, n)
838 for _, v := range a {
839 r = append(r, v...)
840 }
841 return r
842}
843
844func patchXsqlite3_initialize(fn string) error {
845 const s = "func Xsqlite3_initialize(tls *libc.TLS) int32 {"
846 return patch(fn, func(b []byte) []diff {
847 x := bytes.Index(b, []byte(s))
848 return []diff{{x, x + len(s), `
849var mu mutex
850
851func init() { mu.recursive = true }
852
853func Xsqlite3_initialize(tls *libc.TLS) int32 {
854 mu.enter(tls.ID)
855 defer mu.leave(tls.ID)
856
857`}}
858 })
859}
860
861type diff struct {
862 from, to int // byte offsets
863 replace string // replaces b[from:to]
864}
865
866func patch(fn string, f func([]byte) []diff) error {
867 b, err := os.ReadFile(fn)
868 if err != nil {
869 return err
870 }
871
872 diffs := f(b)
873 sort.Slice(diffs, func(i, j int) bool { return diffs[i].from < diffs[j].from })
874 var patched [][]byte
875 off := 0
876 for _, diff := range diffs {
877 from := diff.from - off
878 to := diff.to - off
879 patched = append(patched, b[:from])
880 patched = append(patched, []byte(diff.replace))
881 b = b[to:]
882 off += to
883 }
884 patched = append(patched, b)
885 return os.WriteFile(fn, bytes.Join(patched, nil), 0660)
886}
Note: See TracBrowser for help on using the repository browser.