From 6b61bd245870bad80a2655ea4c4b56d1246233df Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 6 May 2024 06:33:36 +0200 Subject: Add libbutl-odb source subdirectory This is an additional (to libbutl) utility library which contains the source code of libodb, libodb-sqlite, and libsqlite3 configured and tuned for our needs. --- libbutl-odb/buildfile | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 libbutl-odb/buildfile (limited to 'libbutl-odb/buildfile') diff --git a/libbutl-odb/buildfile b/libbutl-odb/buildfile new file mode 100644 index 0000000..be04ed0 --- /dev/null +++ b/libbutl-odb/buildfile @@ -0,0 +1,151 @@ +# file : libbutl-odb/buildfile +# license : MIT; see accompanying LICENSE file + +sys_sqlite = $config.libbutl.system_libsqlite3 + +intf_libs = + +if $sys_sqlite + import intf_libs += libsqlite3%lib{sqlite3} + +lib{butl-odb}: odb/{h hxx ixx txx cxx}{**} +lib{butl-odb}: sqlite/{h c}{*}: include = (!$sys_sqlite) +lib{butl-odb}: $intf_libs + +# Build options. +# +cxx.poptions =+ "-I$src_base" + +if! $sys_sqlite + cxx.poptions =+ "-I($src_base/sqlite)" + +# For now we only need single-threaded ODB and SQLite. Note that if we need to +# change that, then we will most likely need to deal with MinGW stdthread mess +# (see libbutl/buildfile for details). Also see SQLITE_THREADSAFE=0 below. +# +cxx.poptions += -DODB_THREADS_NONE + +obja{*}: cxx.poptions += -DLIBODB_STATIC_BUILD -DLIBODB_SQLITE_STATIC_BUILD +objs{*}: cxx.poptions += -DLIBODB_SHARED_BUILD -DLIBODB_SQLITE_SHARED_BUILD + +if! $sys_sqlite +{ + # Note: copy of libsqlite3/buildfile except for SQLITE_THREADSAFE=0, + # -DSQLITE_OMIT_SHARED_CACHE, and removed ENABLE_UNLOCK_NOTIFY=1. + # + # We also add -Wno-unused-variable and -Wno-unused-but-set-variable. + # + tclass = $c.target.class + + bsd = ($tclass == 'bsd') + windows = ($tclass == 'windows') + + gcc = ($c.class == 'gcc') + clang = ($c.id.type == 'clang') + clang_msvc = ($clang && $c.target.system == 'win32-msvc') + + sqlite/ + { + c.poptions += \ + -DSQLITE_ALLOW_ROWID_IN_VIEW=1 \ + -DSQLITE_ENABLE_COLUMN_METADATA=1 \ + -DSQLITE_ENABLE_DBPAGE_VTAB=1 \ + -DSQLITE_ENABLE_DBSTAT_VTAB=1 \ + -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 \ + -DSQLITE_ENABLE_FTS3=1 \ + -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 \ + -DSQLITE_ENABLE_FTS3_TOKENIZER=1 \ + -DSQLITE_ENABLE_FTS4=1 \ + -DSQLITE_ENABLE_FTS5=1 \ + -DSQLITE_ENABLE_GEOPOLY=1 \ + -DSQLITE_ENABLE_JSON1=1 \ + -DSQLITE_ENABLE_LOAD_EXTENSION=1 \ + -DSQLITE_ENABLE_MATH_FUNCTIONS=1 \ + -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \ + -DSQLITE_ENABLE_RTREE=1 \ + -DSQLITE_ENABLE_SESSION=1 \ + -DSQLITE_ENABLE_STMTVTAB=1 \ + -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 \ + -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 \ + -DSQLITE_MAX_SCHEMA_RETRY=25 \ + -DSQLITE_MAX_VARIABLE_NUMBER=250000 \ + -DSQLITE_OMIT_LOOKASIDE=1 \ + -DSQLITE_SECURE_DELETE=1 \ + -DSQLITE_SOUNDEX=1 \ + -DSQLITE_THREADSAFE=0 \ + -DSQLITE_USE_URI=1 \ + -DSQLITE_OMIT_SHARED_CACHE=1 + + c.poptions += -DSQLITE_MAX_ATTACHED=125 + + if! $windows + c.poptions += -DHAVE_USLEEP=1 + + if $gcc + c.coptions += -fno-strict-aliasing + + if $clang_msvc + c.coptions += -Wno-deprecated-declarations + + if ($clang && $c.version.major >= 15) + c.coptions += -Wno-unused-but-set-variable + + if $gcc + c.coptions += -Wno-unused-variable -Wno-extra -Wno-error + } + + if! $windows + { + cxx.libs += -lm + + if! $bsd + cxx.libs += -ldl + } +} + +# Export options. +# +lib{butl-odb}: +{ + cxx.export.poptions = "-I$src_base" -DODB_THREADS_NONE + cxx.export.libs = $intf_libs +} + +liba{butl-odb}: cxx.export.poptions += -DLIBODB_STATIC -DLIBODB_SQLITE_STATIC +libs{butl-odb}: cxx.export.poptions += -DLIBODB_SHARED -DLIBODB_SQLITE_SHARED + +if! $sys_sqlite +{ + lib{butl-odb}: cc.export.poptions = "-I($src_base/sqlite)" + + if $windows + libs{butl-odb}: cc.export.poptions += '-DSQLITE_API=__declspec(dllimport)' +} + +# For pre-releases use the complete version to make sure they cannot be used +# in place of another pre-release or the final version. See the version module +# for details on the version.* variable values. +# +if $version.pre_release + lib{butl-odb}: bin.lib.version = @"-$version.project_id" +else + lib{butl-odb}: bin.lib.version = @"-$version.major.$version.minor" + +# Install into the libbutl/odb/ subdirectory of, say, /usr/include/. For odb/, +# recreate subdirectories (so we end up with libbutl/odb/odb/...>). For +# sqlite/, install directly into libbutl/odb/. Arrange via pkg-config to be +# able to include ODB headers as and SQLite as just . +# +# The reason we add an extra odb/ subdirectory instead of installing directly +# into libbutl/ is because adding -I for libbutl/ will make all the libbutl +# headers includable without a prefix and thus prone to clashes. +# +odb/{h hxx ixx txx}{*}: +{ + install = include/libbutl/odb/odb/ + install.subdirs = true +} + +sqlite/h{*}: install = include/libbutl/odb/ + +lib{butl-odb}: cxx.pkgconfig.include = include/libbutl/odb/ -- cgit v1.1