-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Add SQLite port (sqlite3) #17297
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add SQLite port (sqlite3) #17297
Changes from 5 commits
6a11389
e47669d
dbe4506
f51d380
04b9bf8
27d7337
926b15a
f1f330a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6665,37 +6665,23 @@ def test_freetype(self): | |
@no_asan('local count too large for VMs') | ||
@no_ubsan('local count too large for VMs') | ||
@is_slow_test | ||
def test_sqlite(self): | ||
@parameterized({ | ||
'single': (False,), | ||
'pthreads': (True,), | ||
}) | ||
def test_sqlite(self, use_pthreads): | ||
if use_pthreads: | ||
self.set_setting('USE_PTHREADS') | ||
self.setup_node_pthreads() | ||
self.set_setting('EXPORTED_FUNCTIONS', ['_main', '_sqlite3_open', '_sqlite3_close', '_sqlite3_exec', '_sqlite3_free']) | ||
tiran marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if '-g' in self.emcc_args: | ||
print("disabling inlining") # without registerize (which -g disables), we generate huge amounts of code | ||
self.set_setting('INLINING_LIMIT') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder if this block is still needed? Can you try There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this a reasonable amount of time?
|
||
|
||
# newer clang has a warning for implicit conversions that lose information, | ||
# which happens in sqlite (see #9138) | ||
self.emcc_args += ['-Wno-implicit-int-float-conversion'] | ||
# newer clang warns about "suspicious concatenation of string literals in an | ||
# array initialization; did you mean to separate the elements with a comma?" | ||
self.emcc_args += ['-Wno-string-concatenation'] | ||
# ignore unknown flags, which lets the above flags be used on github CI | ||
# before the LLVM change rolls in (the same LLVM change that adds the | ||
# warning also starts to warn on it) | ||
self.emcc_args += ['-Wno-unknown-warning-option'] | ||
self.emcc_args += ['-Wno-pointer-bool-conversion'] | ||
|
||
self.emcc_args += ['-I' + test_file('third_party/sqlite')] | ||
|
||
src = ''' | ||
#define SQLITE_DISABLE_LFS | ||
#define LONGDOUBLE_TYPE double | ||
#define SQLITE_INT64_TYPE long long int | ||
#define SQLITE_THREADSAFE 0 | ||
''' | ||
src += read_file(test_file('third_party/sqlite/sqlite3.c')) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess we can completely remove the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is still used by test_benchmark test_zzz_sqlite. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In that case we could move it under (Perhaps we could also make the benchmark code us the port.) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it belongs in |
||
src += read_file(test_file('sqlite/benchmark.c')) | ||
self.emcc_args += ['-sUSE_SQLITE3'] | ||
src = read_file(test_file('sqlite/benchmark.c')) | ||
self.do_run(src, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This can be changed to |
||
read_file(test_file('sqlite/benchmark.txt')), | ||
includes=[test_file('sqlite')], | ||
force_c=True) | ||
|
||
@needs_make('mingw32-make') | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# Copyright 2022 The Emscripten Authors. All rights reserved. | ||
# Emscripten is available under two separate licenses, the MIT license and the | ||
# University of Illinois/NCSA Open Source License. Both these licenses can be | ||
# found in the LICENSE file. | ||
|
||
import os | ||
import shutil | ||
import logging | ||
|
||
# sqlite amalgamation download URL uses relase year and tag | ||
# 2022 and (3, 38, 5) -> '/2022/sqlite-amalgamation-3380500.zip' | ||
VERSION = (3, 39, 0) | ||
VERSION_YEAR = 2022 | ||
HASH = 'cbaf4adb3e404d9aa403b34f133c5beca5f641ae1e23f84dbb021da1fb9efdc7c56b5922eb533ae5cb6d26410ac60cb3f026085591bc83ebc1c225aed0cf37ca' | ||
|
||
deps = [] | ||
|
||
|
||
def needed(settings): | ||
return settings.USE_SQLITE3 | ||
|
||
|
||
def get_lib_name(settings): | ||
return 'libsqlite3' + ('-mt' if settings.USE_PTHREADS else '') + '.a' | ||
|
||
|
||
def get(ports, settings, shared): | ||
release = f'sqlite-amalgamation-{VERSION[0]}{VERSION[1]:02}{VERSION[2]:02}00' | ||
# TODO: Fetch the file from an emscripten-hosted mirror. | ||
ports.fetch_project('sqlite3', f'https://www.sqlite.org/{VERSION_YEAR}/{release}.zip', release, sha512hash=HASH) | ||
|
||
def create(final): | ||
logging.info('building port: libsqlite3') | ||
|
||
source_path = os.path.join(ports.get_dir(), 'sqlite3', release) | ||
dest_path = os.path.join(ports.get_build_dir(), 'sqlite3') | ||
|
||
shutil.rmtree(dest_path, ignore_errors=True) | ||
shutil.copytree(source_path, dest_path) | ||
|
||
ports.install_headers(dest_path) | ||
|
||
# flags are based on sqlite-autoconf output. | ||
# SQLITE_HAVE_ZLIB is only used by shell.c | ||
flags = [ | ||
'-DSTDC_HEADERS=1', | ||
'-DHAVE_SYS_TYPES_H=1', | ||
'-DHAVE_SYS_STAT_H=1', | ||
'-DHAVE_STDLIB_H=1', | ||
'-DHAVE_STRING_H=1', | ||
'-DHAVE_MEMORY_H=1', | ||
'-DHAVE_STRINGS_H=1', | ||
'-DHAVE_INTTYPES_H=1', | ||
'-DHAVE_STDINT_H=1', | ||
'-DHAVE_UNISTD_H=1', | ||
'-DHAVE_FDATASYNC=1', | ||
'-DHAVE_USLEEP=1', | ||
'-DHAVE_LOCALTIME_R=1', | ||
'-DHAVE_GMTIME_R=1', | ||
'-DHAVE_DECL_STRERROR_R=1', | ||
'-DHAVE_STRERROR_R=1', | ||
'-DHAVE_POSIX_FALLOCATE=1', | ||
'-DSQLITE_OMIT_LOAD_EXTENSION=1', | ||
'-DSQLITE_ENABLE_MATH_FUNCTIONS=1', | ||
'-DSQLITE_ENABLE_FTS4=1', | ||
'-DSQLITE_ENABLE_FTS5=1', | ||
'-DSQLITE_ENABLE_RTREE=1', | ||
'-DSQLITE_ENABLE_GEOPOLY=1', | ||
'-DSQLITE_OMIT_POPEN=1', | ||
] | ||
if settings.USE_PTHREADS: | ||
flags += [ | ||
'-sUSE_PTHREADS', | ||
'-DSQLITE_THREADSAFE=1', | ||
] | ||
else: | ||
flags += ['-DSQLITE_THREADSAFE=0'] | ||
|
||
ports.build_port(dest_path, final, flags=flags, exclude_files=['shell.c']) | ||
|
||
return [shared.Cache.get_lib(get_lib_name(settings), create, what='port')] | ||
|
||
|
||
def clear(ports, settings, shared): | ||
shared.Cache.erase_lib(get_lib_name(settings)) | ||
|
||
|
||
def process_args(ports): | ||
return [] | ||
|
||
|
||
def show(): | ||
return 'sqlite (USE_SQLITE3=1); public domain)' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you just use the empty string here for the default case.
Also, it looks like you will need to add the two new libraries to
MINIMAL_TASKS
in embuilder.py.