aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes4
-rw-r--r--.gitmodules9
-rw-r--r--LICENSE23
-rw-r--r--README-GIT2
-rw-r--r--build/export.build34
-rw-r--r--build/root.build17
-rw-r--r--buildfile2
-rw-r--r--libbutl-odb/README-DEV41
-rw-r--r--libbutl-odb/buildfile151
l---------libbutl-odb/odb/c-array-traits.hxx1
l---------libbutl-odb/odb/cache-traits.hxx1
l---------libbutl-odb/odb/callback.hxx1
l---------libbutl-odb/odb/connection.cxx1
l---------libbutl-odb/odb/connection.hxx1
l---------libbutl-odb/odb/connection.ixx1
l---------libbutl-odb/odb/connection.txx1
l---------libbutl-odb/odb/container-traits.hxx1
l---------libbutl-odb/odb/core.hxx1
l---------libbutl-odb/odb/database.cxx1
l---------libbutl-odb/odb/database.hxx1
l---------libbutl-odb/odb/database.ixx1
l---------libbutl-odb/odb/database.txx1
l---------libbutl-odb/odb/details/buffer.cxx1
l---------libbutl-odb/odb/details/buffer.hxx1
l---------libbutl-odb/odb/details/c-string.hxx1
l---------libbutl-odb/odb/details/condition.hxx1
l---------libbutl-odb/odb/details/config-vc.h1
l---------libbutl-odb/odb/details/config.h1
l---------libbutl-odb/odb/details/config.hxx1
l---------libbutl-odb/odb/details/exception.hxx1
l---------libbutl-odb/odb/details/export.hxx1
l---------libbutl-odb/odb/details/function-wrapper.hxx1
l---------libbutl-odb/odb/details/function-wrapper.ixx1
l---------libbutl-odb/odb/details/function-wrapper.txx1
l---------libbutl-odb/odb/details/lock.hxx1
l---------libbutl-odb/odb/details/meta1
l---------libbutl-odb/odb/details/mutex.hxx1
l---------libbutl-odb/odb/details/shared-ptr1
l---------libbutl-odb/odb/details/shared-ptr-fwd.hxx1
l---------libbutl-odb/odb/details/shared-ptr.hxx1
l---------libbutl-odb/odb/details/thread.hxx1
l---------libbutl-odb/odb/details/tls.hxx1
l---------libbutl-odb/odb/details/transfer-ptr.hxx1
l---------libbutl-odb/odb/details/type-info.hxx1
l---------libbutl-odb/odb/details/unique-ptr.hxx1
l---------libbutl-odb/odb/details/unused.hxx1
l---------libbutl-odb/odb/details/win32/windows.hxx1
l---------libbutl-odb/odb/details/wrapper-p.hxx1
l---------libbutl-odb/odb/exception.hxx1
l---------libbutl-odb/odb/exceptions.cxx1
l---------libbutl-odb/odb/exceptions.hxx1
l---------libbutl-odb/odb/forward.hxx1
l---------libbutl-odb/odb/function-table.hxx1
l---------libbutl-odb/odb/lazy-pointer-traits.hxx1
l---------libbutl-odb/odb/lazy-ptr-impl.hxx1
l---------libbutl-odb/odb/lazy-ptr-impl.ixx1
l---------libbutl-odb/odb/lazy-ptr-impl.txx1
l---------libbutl-odb/odb/lazy-ptr.hxx1
l---------libbutl-odb/odb/lazy-ptr.ixx1
l---------libbutl-odb/odb/lazy-ptr.txx1
l---------libbutl-odb/odb/nested-container.hxx1
l---------libbutl-odb/odb/no-id-object-result.hxx1
l---------libbutl-odb/odb/no-id-object-result.txx1
l---------libbutl-odb/odb/no-op-cache-traits.hxx1
l---------libbutl-odb/odb/nullable.hxx1
l---------libbutl-odb/odb/object-result.hxx1
l---------libbutl-odb/odb/pointer-traits.hxx1
l---------libbutl-odb/odb/polymorphic-info.hxx1
l---------libbutl-odb/odb/polymorphic-map.hxx1
l---------libbutl-odb/odb/polymorphic-map.ixx1
l---------libbutl-odb/odb/polymorphic-map.txx1
l---------libbutl-odb/odb/polymorphic-object-result.hxx1
l---------libbutl-odb/odb/polymorphic-object-result.txx1
l---------libbutl-odb/odb/post.hxx1
l---------libbutl-odb/odb/pre.hxx1
l---------libbutl-odb/odb/prepared-query.cxx1
l---------libbutl-odb/odb/prepared-query.hxx1
l---------libbutl-odb/odb/query-dynamic.cxx1
l---------libbutl-odb/odb/query-dynamic.hxx1
l---------libbutl-odb/odb/query-dynamic.ixx1
l---------libbutl-odb/odb/query-dynamic.txx1
l---------libbutl-odb/odb/query.hxx1
l---------libbutl-odb/odb/result.cxx1
l---------libbutl-odb/odb/result.hxx1
l---------libbutl-odb/odb/result.txx1
l---------libbutl-odb/odb/schema-catalog-impl.hxx1
l---------libbutl-odb/odb/schema-catalog.cxx1
l---------libbutl-odb/odb/schema-catalog.hxx1
l---------libbutl-odb/odb/schema-version.hxx1
l---------libbutl-odb/odb/section.cxx1
l---------libbutl-odb/odb/section.hxx1
l---------libbutl-odb/odb/session.cxx1
l---------libbutl-odb/odb/session.hxx1
l---------libbutl-odb/odb/session.ixx1
l---------libbutl-odb/odb/session.txx1
l---------libbutl-odb/odb/simple-object-result.hxx1
l---------libbutl-odb/odb/simple-object-result.txx1
l---------libbutl-odb/odb/sqlite/auto-handle.hxx1
l---------libbutl-odb/odb/sqlite/binding.hxx1
l---------libbutl-odb/odb/sqlite/blob-stream.hxx1
l---------libbutl-odb/odb/sqlite/blob.hxx1
l---------libbutl-odb/odb/sqlite/connection-factory.cxx1
l---------libbutl-odb/odb/sqlite/connection-factory.hxx1
l---------libbutl-odb/odb/sqlite/connection.cxx1
l---------libbutl-odb/odb/sqlite/connection.hxx1
l---------libbutl-odb/odb/sqlite/connection.ixx1
l---------libbutl-odb/odb/sqlite/container-statements.hxx1
l---------libbutl-odb/odb/sqlite/container-statements.txx1
l---------libbutl-odb/odb/sqlite/database.cxx1
l---------libbutl-odb/odb/sqlite/database.hxx1
l---------libbutl-odb/odb/sqlite/database.ixx1
l---------libbutl-odb/odb/sqlite/details/config.hxx1
l---------libbutl-odb/odb/sqlite/details/conversion.hxx1
l---------libbutl-odb/odb/sqlite/details/export.hxx1
l---------libbutl-odb/odb/sqlite/details/options.cxx1
l---------libbutl-odb/odb/sqlite/details/options.hxx1
l---------libbutl-odb/odb/sqlite/details/options.ixx1
l---------libbutl-odb/odb/sqlite/error.cxx1
l---------libbutl-odb/odb/sqlite/error.hxx1
l---------libbutl-odb/odb/sqlite/exceptions.cxx1
l---------libbutl-odb/odb/sqlite/exceptions.hxx1
l---------libbutl-odb/odb/sqlite/forward.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-result.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-result.txx1
l---------libbutl-odb/odb/sqlite/no-id-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-statements.txx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-result.hxx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-result.txx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-statements.txx1
l---------libbutl-odb/odb/sqlite/prepared-query.cxx1
l---------libbutl-odb/odb/sqlite/prepared-query.hxx1
l---------libbutl-odb/odb/sqlite/query-const-expr.cxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.cxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.hxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.ixx1
l---------libbutl-odb/odb/sqlite/query-dynamic.txx1
l---------libbutl-odb/odb/sqlite/query.cxx1
l---------libbutl-odb/odb/sqlite/query.hxx1
l---------libbutl-odb/odb/sqlite/query.ixx1
l---------libbutl-odb/odb/sqlite/query.txx1
l---------libbutl-odb/odb/sqlite/section-statements.hxx1
l---------libbutl-odb/odb/sqlite/section-statements.txx1
l---------libbutl-odb/odb/sqlite/simple-object-result.hxx1
l---------libbutl-odb/odb/sqlite/simple-object-result.txx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.cxx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.ixx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.txx1
l---------libbutl-odb/odb/sqlite/sqlite-types.hxx1
l---------libbutl-odb/odb/sqlite/statement-cache.hxx1
l---------libbutl-odb/odb/sqlite/statement-cache.txx1
l---------libbutl-odb/odb/sqlite/statement.cxx1
l---------libbutl-odb/odb/sqlite/statement.hxx1
l---------libbutl-odb/odb/sqlite/statements-base.cxx1
l---------libbutl-odb/odb/sqlite/statements-base.hxx1
l---------libbutl-odb/odb/sqlite/stream.cxx1
l---------libbutl-odb/odb/sqlite/stream.hxx1
l---------libbutl-odb/odb/sqlite/text-stream.hxx1
l---------libbutl-odb/odb/sqlite/text.hxx1
l---------libbutl-odb/odb/sqlite/tracer.cxx1
l---------libbutl-odb/odb/sqlite/tracer.hxx1
l---------libbutl-odb/odb/sqlite/traits-calls.hxx1
l---------libbutl-odb/odb/sqlite/traits.cxx1
l---------libbutl-odb/odb/sqlite/traits.hxx1
l---------libbutl-odb/odb/sqlite/transaction-impl.cxx1
l---------libbutl-odb/odb/sqlite/transaction-impl.hxx1
l---------libbutl-odb/odb/sqlite/transaction.cxx1
l---------libbutl-odb/odb/sqlite/transaction.hxx1
l---------libbutl-odb/odb/sqlite/transaction.ixx1
-rw-r--r--libbutl-odb/odb/sqlite/version.hxx65
l---------libbutl-odb/odb/sqlite/view-result.hxx1
l---------libbutl-odb/odb/sqlite/view-result.txx1
l---------libbutl-odb/odb/sqlite/view-statements.hxx1
l---------libbutl-odb/odb/sqlite/view-statements.txx1
l---------libbutl-odb/odb/statement-processing-common.hxx1
l---------libbutl-odb/odb/statement-processing.cxx1
l---------libbutl-odb/odb/statement.cxx1
l---------libbutl-odb/odb/statement.hxx1
l---------libbutl-odb/odb/std-array-traits.hxx1
l---------libbutl-odb/odb/std-deque-traits.hxx1
l---------libbutl-odb/odb/std-forward-list-traits.hxx1
l---------libbutl-odb/odb/std-list-traits.hxx1
l---------libbutl-odb/odb/std-map-traits.hxx1
l---------libbutl-odb/odb/std-set-traits.hxx1
l---------libbutl-odb/odb/std-unordered-map-traits.hxx1
l---------libbutl-odb/odb/std-unordered-set-traits.hxx1
l---------libbutl-odb/odb/std-vector-traits.hxx1
l---------libbutl-odb/odb/tracer.cxx1
l---------libbutl-odb/odb/tracer.hxx1
l---------libbutl-odb/odb/traits.hxx1
l---------libbutl-odb/odb/transaction.cxx1
l---------libbutl-odb/odb/transaction.hxx1
l---------libbutl-odb/odb/transaction.ixx1
l---------libbutl-odb/odb/vector-impl.cxx1
l---------libbutl-odb/odb/vector-impl.hxx1
l---------libbutl-odb/odb/vector-impl.ixx1
l---------libbutl-odb/odb/vector-traits.hxx1
l---------libbutl-odb/odb/vector-traits.txx1
l---------libbutl-odb/odb/vector.hxx1
l---------libbutl-odb/odb/vector.ixx1
-rw-r--r--libbutl-odb/odb/version.hxx65
l---------libbutl-odb/odb/view-image.hxx1
l---------libbutl-odb/odb/view-result.hxx1
l---------libbutl-odb/odb/view-result.txx1
l---------libbutl-odb/odb/wrapper-traits.hxx1
l---------libbutl-odb/sqlite/sqlite3.c1
l---------libbutl-odb/sqlite/sqlite3.h1
-rw-r--r--libbutl-pkg-config/README-DEV30
-rw-r--r--libbutl-pkg-config/buildfile65
l---------libbutl-pkg-config/libpkg-config/argvsplit.c1
l---------libbutl-pkg-config/libpkg-config/bsdstubs.c1
l---------libbutl-pkg-config/libpkg-config/cache.c1
l---------libbutl-pkg-config/libpkg-config/client.c1
-rw-r--r--libbutl-pkg-config/libpkg-config/config.h41
l---------libbutl-pkg-config/libpkg-config/dependency.c1
l---------libbutl-pkg-config/libpkg-config/export.h1
l---------libbutl-pkg-config/libpkg-config/fileio.c1
l---------libbutl-pkg-config/libpkg-config/fragment.c1
l---------libbutl-pkg-config/libpkg-config/list.h1
l---------libbutl-pkg-config/libpkg-config/parser.c1
l---------libbutl-pkg-config/libpkg-config/path.c1
l---------libbutl-pkg-config/libpkg-config/pkg-config.h1
l---------libbutl-pkg-config/libpkg-config/pkg.c1
l---------libbutl-pkg-config/libpkg-config/stdinc.h1
l---------libbutl-pkg-config/libpkg-config/tuple.c1
-rw-r--r--libbutl-pkg-config/libpkg-config/version.h37
-rw-r--r--libbutl/utility.hxx23
-rw-r--r--libbutl/utility.ixx60
-rw-r--r--manifest2
-rw-r--r--tests/build/root.build5
-rw-r--r--tests/next-word/buildfile6
-rw-r--r--tests/next-word/driver.cxx46
-rw-r--r--tests/odb/buildfile6
l---------tests/odb/driver.cxx1
-rw-r--r--tests/pkg-config/buildfile6
l---------tests/pkg-config/driver.c1
l---------tests/pkg-config/testscript1
m---------upstream/libpkg-config0
m---------upstream/odb0
m---------upstream/sqlite0
241 files changed, 942 insertions, 13 deletions
diff --git a/.gitattributes b/.gitattributes
index d01efdc..cf4b5ef 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -18,3 +18,7 @@
#
#*.png binary
*.lz4 binary
+
+libbutl-odb/odb/details/meta symlink=dir
+libbutl-odb/odb/details/shared-ptr symlink=dir
+
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..5f622ca
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "upstream/odb"]
+ path = upstream/odb
+ url = https://git.codesynthesis.com/odb/odb.git
+[submodule "upstream/sqlite"]
+ path = upstream/sqlite
+ url = https://git.build2.org/packaging/sqlite/sqlite.git
+[submodule "upstream/libpkg-config"]
+ path = upstream/libpkg-config
+ url = https://github.com/build2/libpkg-config.git
diff --git a/LICENSE b/LICENSE
index f22e52f..8065dbc 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,16 +1,33 @@
libbutl/sha1.c:
-3-clause BSD License; see the file header for details.
+ 3-clause BSD License; see the file header for details.
libbutl/{sha256c.c, strptime.c, timelocal.[hc]}:
libbutl/{xxhash.[hc], lz4*.[hc]}:
libbutl/mingw-*.hxx:
-2-clause BSD License; see the file headers for details.
+ 2-clause BSD License; see the file headers for details.
libbutl/json/pdjson.[hc]:
-UNLICENSE (dedicated to the public domain).
+ UNLICENSE (dedicated to the public domain).
+
+libbutl-pkg-config/**.[hc]:
+
+ ISC License (see upstream/libpkg-config/LICENSE for details).
+
+libbutl-odb/sqlite/*.[hc]:
+
+ SQLite Blessing (see upstream/sqlite/ for details).
+
+libbutl-odb/odb/{**.h **.?xx}:
+
+ GPLv2 with License Exception which allows the use of the original build2
+ software in open source or proprietary works without imposing any additional
+ restrictions to the terms and conditions of the MIT license used by build2.
+ For details, see:
+
+ https://git.codesynthesis.com/cgit/odb/odb-etc/tree/license-exceptions/build2-odb-license-exception.txt
The rest:
diff --git a/README-GIT b/README-GIT
index 1ca0940..de9bc9c 100644
--- a/README-GIT
+++ b/README-GIT
@@ -1,3 +1,5 @@
+Note that this repository uses git submodules.
+
The checked out libbutl/version.hxx will be overwritten during the build
process but these changes should be ignored. To do this automatically, run:
diff --git a/build/export.build b/build/export.build
index 427f76b..e7dfa5b 100644
--- a/build/export.build
+++ b/build/export.build
@@ -1,9 +1,35 @@
# file : build/export.build
# license : MIT; see accompanying LICENSE file
-$out_root/
+switch $name($import.target)
{
- include libbutl/
-}
+ case 'butl-odb'
+ {
+ $out_root/
+ {
+ include libbutl-odb/
+ }
+
+ export $out_root/libbutl-odb/$import.target
+ }
+
+ case 'butl-pkg-config'
+ {
+ $out_root/
+ {
+ include libbutl-pkg-config/
+ }
-export $out_root/libbutl/lib{butl}
+ export $out_root/libbutl-pkg-config/$import.target
+ }
+
+ default
+ {
+ $out_root/
+ {
+ include libbutl/
+ }
+
+ export $out_root/libbutl/$import.target
+ }
+}
diff --git a/build/root.build b/build/root.build
index 17e42b1..274b23b 100644
--- a/build/root.build
+++ b/build/root.build
@@ -1,9 +1,22 @@
# file : build/root.build
# license : MIT; see accompanying LICENSE file
+# Ability to build with system libsqlite3.
+#
+# Note that unless libsqlite3 on your system was built with an increased
+# SQLITE_MAX_ATTACHED value (the default is 10), you will most likely come to
+# regret using the system version.
+#
+# Also, while most distributions have to build libsqlite3 in a multi-threaded
+# configuration, we build it single-threaded (and with disabled shared cache
+# support), which gives us a non-negligible performance boost.
+#
+config [bool, config.report=false] config.libbutl.system_libsqlite3 ?= false
+
cxx.std = latest
using cxx
+using c
hxx{*}: extension = hxx
ixx{*}: extension = ixx
@@ -11,10 +24,10 @@ txx{*}: extension = txx
cxx{*}: extension = cxx
if ($cxx.target.system == 'win32-msvc')
- cxx.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
+ cc.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
if ($cxx.class == 'msvc')
- cxx.coptions += /wd4251 /wd4275 /wd4800
+ cc.coptions += /wd4251 /wd4275 /wd4800
elif ($cxx.id == 'gcc')
{
# See GCC bugs 100115, 98753 (attachment 50081/comment 15), and 101361. Note
diff --git a/buildfile b/buildfile
index 1097d1f..e1b94fa 100644
--- a/buildfile
+++ b/buildfile
@@ -1,7 +1,7 @@
# file : buildfile
# license : MIT; see accompanying LICENSE file
-./: {*/ -build/} \
+./: {*/ -build/ -upstream/} \
doc{INSTALL NEWS README} legal{LICENSE COPYRIGHT AUTHORS} \
manifest
diff --git a/libbutl-odb/README-DEV b/libbutl-odb/README-DEV
new file mode 100644
index 0000000..997f5a0
--- /dev/null
+++ b/libbutl-odb/README-DEV
@@ -0,0 +1,41 @@
+Excluded/replaced/relocated ODB upstream files/directories:
+ - libodb/odb/tr1/
+ - libodb/odb/buildfile
+ - libodb/odb/details/{condition.cxx lock.cxx mutex.cxx thread.cxx}
+ - libodb/odb/details/posix/
+ - libodb/odb/details/win32/* except for windows.hxx
+
+
+ - libodb/odb/sqlite/buildfile
+ - libodb/odb/sqlite/details/.gitignore
+ - libodb/odb/sqlite/details/options.cli
+ - libodb/odb/sqlite/details/pregenerated/ -- symlink options.?xx directly in details/
+
+ - libodb/odb/version.hxx.in
+ - libodb/odb/sqlite/version.hxx.in
+ - libodb/odb/version.hxx -- replace with pre-generated for submodule commit
+ - libodb/odb/sqlite/version.hxx -- replace with pre-generated for submodule commit
+
+SQLite is placed into a subdirectory to support the use of external version
+(in which case we omit the corresponding -I option).
+
+Submodule update procedure (similar to updating to a new version of a
+third-party package):
+
+1. Update submodule:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-submodule
+
+2. Review upstream changes:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-review
+
+ Look for:
+
+ - files to add/remove (see above)
+ - changes to buildfiles that would need to be replicated (including to
+ root.build)
+
+3. Replace verison.hxx with pre-generated for this submodule commit.
+
+4. Review .gitattributes for any symlink=dir changes.
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 <odb/...> and SQLite as just <sqlite3.h>.
+#
+# 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/
diff --git a/libbutl-odb/odb/c-array-traits.hxx b/libbutl-odb/odb/c-array-traits.hxx
new file mode 120000
index 0000000..112e8bc
--- /dev/null
+++ b/libbutl-odb/odb/c-array-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/c-array-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/cache-traits.hxx b/libbutl-odb/odb/cache-traits.hxx
new file mode 120000
index 0000000..73c5fbf
--- /dev/null
+++ b/libbutl-odb/odb/cache-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/cache-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/callback.hxx b/libbutl-odb/odb/callback.hxx
new file mode 120000
index 0000000..1144ff5
--- /dev/null
+++ b/libbutl-odb/odb/callback.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/callback.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.cxx b/libbutl-odb/odb/connection.cxx
new file mode 120000
index 0000000..89f6c19
--- /dev/null
+++ b/libbutl-odb/odb/connection.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.hxx b/libbutl-odb/odb/connection.hxx
new file mode 120000
index 0000000..cc8a0a5
--- /dev/null
+++ b/libbutl-odb/odb/connection.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.ixx b/libbutl-odb/odb/connection.ixx
new file mode 120000
index 0000000..bc1cfb0
--- /dev/null
+++ b/libbutl-odb/odb/connection.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.txx b/libbutl-odb/odb/connection.txx
new file mode 120000
index 0000000..37e8e2e
--- /dev/null
+++ b/libbutl-odb/odb/connection.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/container-traits.hxx b/libbutl-odb/odb/container-traits.hxx
new file mode 120000
index 0000000..d71c3e7
--- /dev/null
+++ b/libbutl-odb/odb/container-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/container-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/core.hxx b/libbutl-odb/odb/core.hxx
new file mode 120000
index 0000000..f59ab1c
--- /dev/null
+++ b/libbutl-odb/odb/core.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/core.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.cxx b/libbutl-odb/odb/database.cxx
new file mode 120000
index 0000000..11e9538
--- /dev/null
+++ b/libbutl-odb/odb/database.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.hxx b/libbutl-odb/odb/database.hxx
new file mode 120000
index 0000000..0def196
--- /dev/null
+++ b/libbutl-odb/odb/database.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.ixx b/libbutl-odb/odb/database.ixx
new file mode 120000
index 0000000..f3a769b
--- /dev/null
+++ b/libbutl-odb/odb/database.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.txx b/libbutl-odb/odb/database.txx
new file mode 120000
index 0000000..9d439a5
--- /dev/null
+++ b/libbutl-odb/odb/database.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/buffer.cxx b/libbutl-odb/odb/details/buffer.cxx
new file mode 120000
index 0000000..6af5fbc
--- /dev/null
+++ b/libbutl-odb/odb/details/buffer.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/buffer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/buffer.hxx b/libbutl-odb/odb/details/buffer.hxx
new file mode 120000
index 0000000..a05e24f
--- /dev/null
+++ b/libbutl-odb/odb/details/buffer.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/buffer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/c-string.hxx b/libbutl-odb/odb/details/c-string.hxx
new file mode 120000
index 0000000..6e1cd46
--- /dev/null
+++ b/libbutl-odb/odb/details/c-string.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/c-string.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/condition.hxx b/libbutl-odb/odb/details/condition.hxx
new file mode 120000
index 0000000..80ddb83
--- /dev/null
+++ b/libbutl-odb/odb/details/condition.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/condition.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config-vc.h b/libbutl-odb/odb/details/config-vc.h
new file mode 120000
index 0000000..2e879c9
--- /dev/null
+++ b/libbutl-odb/odb/details/config-vc.h
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config-vc.h \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config.h b/libbutl-odb/odb/details/config.h
new file mode 120000
index 0000000..8fc2729
--- /dev/null
+++ b/libbutl-odb/odb/details/config.h
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config.h \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config.hxx b/libbutl-odb/odb/details/config.hxx
new file mode 120000
index 0000000..16ad4db
--- /dev/null
+++ b/libbutl-odb/odb/details/config.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/exception.hxx b/libbutl-odb/odb/details/exception.hxx
new file mode 120000
index 0000000..41e9c35
--- /dev/null
+++ b/libbutl-odb/odb/details/exception.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/exception.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/export.hxx b/libbutl-odb/odb/details/export.hxx
new file mode 120000
index 0000000..ddbd800
--- /dev/null
+++ b/libbutl-odb/odb/details/export.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/export.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.hxx b/libbutl-odb/odb/details/function-wrapper.hxx
new file mode 120000
index 0000000..94b8f9e
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.ixx b/libbutl-odb/odb/details/function-wrapper.ixx
new file mode 120000
index 0000000..05ec736
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.txx b/libbutl-odb/odb/details/function-wrapper.txx
new file mode 120000
index 0000000..4e33625
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/lock.hxx b/libbutl-odb/odb/details/lock.hxx
new file mode 120000
index 0000000..4099cee
--- /dev/null
+++ b/libbutl-odb/odb/details/lock.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/lock.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/meta b/libbutl-odb/odb/details/meta
new file mode 120000
index 0000000..c12653e
--- /dev/null
+++ b/libbutl-odb/odb/details/meta
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/meta \ No newline at end of file
diff --git a/libbutl-odb/odb/details/mutex.hxx b/libbutl-odb/odb/details/mutex.hxx
new file mode 120000
index 0000000..7bae0aa
--- /dev/null
+++ b/libbutl-odb/odb/details/mutex.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/mutex.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr b/libbutl-odb/odb/details/shared-ptr
new file mode 120000
index 0000000..591da08
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr-fwd.hxx b/libbutl-odb/odb/details/shared-ptr-fwd.hxx
new file mode 120000
index 0000000..21e771e
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr-fwd.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr-fwd.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr.hxx b/libbutl-odb/odb/details/shared-ptr.hxx
new file mode 120000
index 0000000..871bd50
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/thread.hxx b/libbutl-odb/odb/details/thread.hxx
new file mode 120000
index 0000000..9e3a478
--- /dev/null
+++ b/libbutl-odb/odb/details/thread.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/thread.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/tls.hxx b/libbutl-odb/odb/details/tls.hxx
new file mode 120000
index 0000000..72e1d04
--- /dev/null
+++ b/libbutl-odb/odb/details/tls.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/tls.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/transfer-ptr.hxx b/libbutl-odb/odb/details/transfer-ptr.hxx
new file mode 120000
index 0000000..360e1b9
--- /dev/null
+++ b/libbutl-odb/odb/details/transfer-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/transfer-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/type-info.hxx b/libbutl-odb/odb/details/type-info.hxx
new file mode 120000
index 0000000..c0aadef
--- /dev/null
+++ b/libbutl-odb/odb/details/type-info.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/type-info.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/unique-ptr.hxx b/libbutl-odb/odb/details/unique-ptr.hxx
new file mode 120000
index 0000000..63cf03a
--- /dev/null
+++ b/libbutl-odb/odb/details/unique-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/unique-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/unused.hxx b/libbutl-odb/odb/details/unused.hxx
new file mode 120000
index 0000000..d2d3488
--- /dev/null
+++ b/libbutl-odb/odb/details/unused.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/unused.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/win32/windows.hxx b/libbutl-odb/odb/details/win32/windows.hxx
new file mode 120000
index 0000000..9c1ebea
--- /dev/null
+++ b/libbutl-odb/odb/details/win32/windows.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb/odb/details/win32/windows.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/wrapper-p.hxx b/libbutl-odb/odb/details/wrapper-p.hxx
new file mode 120000
index 0000000..a8389ae
--- /dev/null
+++ b/libbutl-odb/odb/details/wrapper-p.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/wrapper-p.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exception.hxx b/libbutl-odb/odb/exception.hxx
new file mode 120000
index 0000000..e7f27bc
--- /dev/null
+++ b/libbutl-odb/odb/exception.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exception.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exceptions.cxx b/libbutl-odb/odb/exceptions.cxx
new file mode 120000
index 0000000..7d6764e
--- /dev/null
+++ b/libbutl-odb/odb/exceptions.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exceptions.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exceptions.hxx b/libbutl-odb/odb/exceptions.hxx
new file mode 120000
index 0000000..29476de
--- /dev/null
+++ b/libbutl-odb/odb/exceptions.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exceptions.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/forward.hxx b/libbutl-odb/odb/forward.hxx
new file mode 120000
index 0000000..fce7288
--- /dev/null
+++ b/libbutl-odb/odb/forward.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/forward.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/function-table.hxx b/libbutl-odb/odb/function-table.hxx
new file mode 120000
index 0000000..be670b3
--- /dev/null
+++ b/libbutl-odb/odb/function-table.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/function-table.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-pointer-traits.hxx b/libbutl-odb/odb/lazy-pointer-traits.hxx
new file mode 120000
index 0000000..40886bb
--- /dev/null
+++ b/libbutl-odb/odb/lazy-pointer-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-pointer-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.hxx b/libbutl-odb/odb/lazy-ptr-impl.hxx
new file mode 120000
index 0000000..d6ebbf9
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.ixx b/libbutl-odb/odb/lazy-ptr-impl.ixx
new file mode 120000
index 0000000..d1e4d67
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.txx b/libbutl-odb/odb/lazy-ptr-impl.txx
new file mode 120000
index 0000000..d32a56c
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.hxx b/libbutl-odb/odb/lazy-ptr.hxx
new file mode 120000
index 0000000..4ec473c
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.ixx b/libbutl-odb/odb/lazy-ptr.ixx
new file mode 120000
index 0000000..990c6df
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.txx b/libbutl-odb/odb/lazy-ptr.txx
new file mode 120000
index 0000000..7d13166
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/nested-container.hxx b/libbutl-odb/odb/nested-container.hxx
new file mode 120000
index 0000000..6204ec6
--- /dev/null
+++ b/libbutl-odb/odb/nested-container.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/nested-container.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-id-object-result.hxx b/libbutl-odb/odb/no-id-object-result.hxx
new file mode 120000
index 0000000..a4feda3
--- /dev/null
+++ b/libbutl-odb/odb/no-id-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-id-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-id-object-result.txx b/libbutl-odb/odb/no-id-object-result.txx
new file mode 120000
index 0000000..73def1a
--- /dev/null
+++ b/libbutl-odb/odb/no-id-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-id-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-op-cache-traits.hxx b/libbutl-odb/odb/no-op-cache-traits.hxx
new file mode 120000
index 0000000..c1ab173
--- /dev/null
+++ b/libbutl-odb/odb/no-op-cache-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-op-cache-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/nullable.hxx b/libbutl-odb/odb/nullable.hxx
new file mode 120000
index 0000000..be1e9ec
--- /dev/null
+++ b/libbutl-odb/odb/nullable.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/nullable.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/object-result.hxx b/libbutl-odb/odb/object-result.hxx
new file mode 120000
index 0000000..6fc617c
--- /dev/null
+++ b/libbutl-odb/odb/object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/pointer-traits.hxx b/libbutl-odb/odb/pointer-traits.hxx
new file mode 120000
index 0000000..4d7924f
--- /dev/null
+++ b/libbutl-odb/odb/pointer-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/pointer-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-info.hxx b/libbutl-odb/odb/polymorphic-info.hxx
new file mode 120000
index 0000000..a6d2468
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-info.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-info.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.hxx b/libbutl-odb/odb/polymorphic-map.hxx
new file mode 120000
index 0000000..b92e037
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.ixx b/libbutl-odb/odb/polymorphic-map.ixx
new file mode 120000
index 0000000..ad9ad3f
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.txx b/libbutl-odb/odb/polymorphic-map.txx
new file mode 120000
index 0000000..ff264dc
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-object-result.hxx b/libbutl-odb/odb/polymorphic-object-result.hxx
new file mode 120000
index 0000000..5482901
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-object-result.txx b/libbutl-odb/odb/polymorphic-object-result.txx
new file mode 120000
index 0000000..b935bb4
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/post.hxx b/libbutl-odb/odb/post.hxx
new file mode 120000
index 0000000..64aba2c
--- /dev/null
+++ b/libbutl-odb/odb/post.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/post.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/pre.hxx b/libbutl-odb/odb/pre.hxx
new file mode 120000
index 0000000..f1acec8
--- /dev/null
+++ b/libbutl-odb/odb/pre.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/pre.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/prepared-query.cxx b/libbutl-odb/odb/prepared-query.cxx
new file mode 120000
index 0000000..02adc31
--- /dev/null
+++ b/libbutl-odb/odb/prepared-query.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/prepared-query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/prepared-query.hxx b/libbutl-odb/odb/prepared-query.hxx
new file mode 120000
index 0000000..a512cbb
--- /dev/null
+++ b/libbutl-odb/odb/prepared-query.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/prepared-query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.cxx b/libbutl-odb/odb/query-dynamic.cxx
new file mode 120000
index 0000000..9d09183
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.hxx b/libbutl-odb/odb/query-dynamic.hxx
new file mode 120000
index 0000000..742ee6e
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.ixx b/libbutl-odb/odb/query-dynamic.ixx
new file mode 120000
index 0000000..1857aac
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.txx b/libbutl-odb/odb/query-dynamic.txx
new file mode 120000
index 0000000..6f3d196
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/query.hxx b/libbutl-odb/odb/query.hxx
new file mode 120000
index 0000000..1012caa
--- /dev/null
+++ b/libbutl-odb/odb/query.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.cxx b/libbutl-odb/odb/result.cxx
new file mode 120000
index 0000000..1a4accb
--- /dev/null
+++ b/libbutl-odb/odb/result.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.hxx b/libbutl-odb/odb/result.hxx
new file mode 120000
index 0000000..19ecb55
--- /dev/null
+++ b/libbutl-odb/odb/result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.txx b/libbutl-odb/odb/result.txx
new file mode 120000
index 0000000..c19db9b
--- /dev/null
+++ b/libbutl-odb/odb/result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog-impl.hxx b/libbutl-odb/odb/schema-catalog-impl.hxx
new file mode 120000
index 0000000..46b2940
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog.cxx b/libbutl-odb/odb/schema-catalog.cxx
new file mode 120000
index 0000000..6489260
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog.hxx b/libbutl-odb/odb/schema-catalog.hxx
new file mode 120000
index 0000000..3eac326
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-version.hxx b/libbutl-odb/odb/schema-version.hxx
new file mode 120000
index 0000000..e151791
--- /dev/null
+++ b/libbutl-odb/odb/schema-version.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-version.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/section.cxx b/libbutl-odb/odb/section.cxx
new file mode 120000
index 0000000..554e98a
--- /dev/null
+++ b/libbutl-odb/odb/section.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/section.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/section.hxx b/libbutl-odb/odb/section.hxx
new file mode 120000
index 0000000..c56cc2b
--- /dev/null
+++ b/libbutl-odb/odb/section.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/section.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.cxx b/libbutl-odb/odb/session.cxx
new file mode 120000
index 0000000..4fd4e61
--- /dev/null
+++ b/libbutl-odb/odb/session.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.hxx b/libbutl-odb/odb/session.hxx
new file mode 120000
index 0000000..b614bf3
--- /dev/null
+++ b/libbutl-odb/odb/session.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.ixx b/libbutl-odb/odb/session.ixx
new file mode 120000
index 0000000..8301774
--- /dev/null
+++ b/libbutl-odb/odb/session.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.txx b/libbutl-odb/odb/session.txx
new file mode 120000
index 0000000..78525ff
--- /dev/null
+++ b/libbutl-odb/odb/session.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/simple-object-result.hxx b/libbutl-odb/odb/simple-object-result.hxx
new file mode 120000
index 0000000..75ff145
--- /dev/null
+++ b/libbutl-odb/odb/simple-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/simple-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/simple-object-result.txx b/libbutl-odb/odb/simple-object-result.txx
new file mode 120000
index 0000000..24a73c6
--- /dev/null
+++ b/libbutl-odb/odb/simple-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/simple-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/auto-handle.hxx b/libbutl-odb/odb/sqlite/auto-handle.hxx
new file mode 120000
index 0000000..d2beea3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/auto-handle.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/auto-handle.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/binding.hxx b/libbutl-odb/odb/sqlite/binding.hxx
new file mode 120000
index 0000000..368fe4f
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/binding.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/binding.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/blob-stream.hxx b/libbutl-odb/odb/sqlite/blob-stream.hxx
new file mode 120000
index 0000000..a669754
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/blob-stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/blob-stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/blob.hxx b/libbutl-odb/odb/sqlite/blob.hxx
new file mode 120000
index 0000000..39952c3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/blob.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/blob.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection-factory.cxx b/libbutl-odb/odb/sqlite/connection-factory.cxx
new file mode 120000
index 0000000..24bc557
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection-factory.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection-factory.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection-factory.hxx b/libbutl-odb/odb/sqlite/connection-factory.hxx
new file mode 120000
index 0000000..a0628ec
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection-factory.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection-factory.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.cxx b/libbutl-odb/odb/sqlite/connection.cxx
new file mode 120000
index 0000000..ab9dac9
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.hxx b/libbutl-odb/odb/sqlite/connection.hxx
new file mode 120000
index 0000000..b191dcf
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.ixx b/libbutl-odb/odb/sqlite/connection.ixx
new file mode 120000
index 0000000..d46f148
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/container-statements.hxx b/libbutl-odb/odb/sqlite/container-statements.hxx
new file mode 120000
index 0000000..bd7fe17
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/container-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/container-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/container-statements.txx b/libbutl-odb/odb/sqlite/container-statements.txx
new file mode 120000
index 0000000..6fc9bef
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/container-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/container-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.cxx b/libbutl-odb/odb/sqlite/database.cxx
new file mode 120000
index 0000000..d8e8079
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.hxx b/libbutl-odb/odb/sqlite/database.hxx
new file mode 120000
index 0000000..008d1fc
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.ixx b/libbutl-odb/odb/sqlite/database.ixx
new file mode 120000
index 0000000..52a723c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/config.hxx b/libbutl-odb/odb/sqlite/details/config.hxx
new file mode 120000
index 0000000..ba48e30
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/config.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/config.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/conversion.hxx b/libbutl-odb/odb/sqlite/details/conversion.hxx
new file mode 120000
index 0000000..41e31b4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/conversion.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/conversion.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/export.hxx b/libbutl-odb/odb/sqlite/details/export.hxx
new file mode 120000
index 0000000..22a9ea3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/export.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/export.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.cxx b/libbutl-odb/odb/sqlite/details/options.cxx
new file mode 120000
index 0000000..61950de
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.cxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.hxx b/libbutl-odb/odb/sqlite/details/options.hxx
new file mode 120000
index 0000000..7e674dd
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.ixx b/libbutl-odb/odb/sqlite/details/options.ixx
new file mode 120000
index 0000000..f562a57
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.ixx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/error.cxx b/libbutl-odb/odb/sqlite/error.cxx
new file mode 120000
index 0000000..1bfc433
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/error.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/error.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/error.hxx b/libbutl-odb/odb/sqlite/error.hxx
new file mode 120000
index 0000000..c82f49f
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/error.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/error.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/exceptions.cxx b/libbutl-odb/odb/sqlite/exceptions.cxx
new file mode 120000
index 0000000..b49ae98
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/exceptions.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/exceptions.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/exceptions.hxx b/libbutl-odb/odb/sqlite/exceptions.hxx
new file mode 120000
index 0000000..ada5548
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/exceptions.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/exceptions.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/forward.hxx b/libbutl-odb/odb/sqlite/forward.hxx
new file mode 120000
index 0000000..a9b323c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/forward.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/forward.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-result.hxx b/libbutl-odb/odb/sqlite/no-id-object-result.hxx
new file mode 120000
index 0000000..07ff3bd
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-result.txx b/libbutl-odb/odb/sqlite/no-id-object-result.txx
new file mode 120000
index 0000000..c20e86e
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-statements.hxx b/libbutl-odb/odb/sqlite/no-id-object-statements.hxx
new file mode 120000
index 0000000..572080c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-statements.txx b/libbutl-odb/odb/sqlite/no-id-object-statements.txx
new file mode 120000
index 0000000..51bb914
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx b/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx
new file mode 120000
index 0000000..fe429c2
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-result.txx b/libbutl-odb/odb/sqlite/polymorphic-object-result.txx
new file mode 120000
index 0000000..e856368
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx b/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx
new file mode 120000
index 0000000..b3e8263
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx b/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx
new file mode 120000
index 0000000..ef05814
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/prepared-query.cxx b/libbutl-odb/odb/sqlite/prepared-query.cxx
new file mode 120000
index 0000000..3fce056
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/prepared-query.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/prepared-query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/prepared-query.hxx b/libbutl-odb/odb/sqlite/prepared-query.hxx
new file mode 120000
index 0000000..585424d
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/prepared-query.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/prepared-query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-const-expr.cxx b/libbutl-odb/odb/sqlite/query-const-expr.cxx
new file mode 120000
index 0000000..a37dc67
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-const-expr.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-const-expr.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.cxx b/libbutl-odb/odb/sqlite/query-dynamic.cxx
new file mode 120000
index 0000000..0e7b56c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.hxx b/libbutl-odb/odb/sqlite/query-dynamic.hxx
new file mode 120000
index 0000000..11158d4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.ixx b/libbutl-odb/odb/sqlite/query-dynamic.ixx
new file mode 120000
index 0000000..babc299
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.txx b/libbutl-odb/odb/sqlite/query-dynamic.txx
new file mode 120000
index 0000000..6f3cb12
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.cxx b/libbutl-odb/odb/sqlite/query.cxx
new file mode 120000
index 0000000..9237561
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.hxx b/libbutl-odb/odb/sqlite/query.hxx
new file mode 120000
index 0000000..c0cb9b4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.ixx b/libbutl-odb/odb/sqlite/query.ixx
new file mode 120000
index 0000000..9d38832
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.txx b/libbutl-odb/odb/sqlite/query.txx
new file mode 120000
index 0000000..05c6033
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/section-statements.hxx b/libbutl-odb/odb/sqlite/section-statements.hxx
new file mode 120000
index 0000000..6edc0d5
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/section-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/section-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/section-statements.txx b/libbutl-odb/odb/sqlite/section-statements.txx
new file mode 120000
index 0000000..699c6b8
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/section-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/section-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-result.hxx b/libbutl-odb/odb/sqlite/simple-object-result.hxx
new file mode 120000
index 0000000..9bed959
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-result.txx b/libbutl-odb/odb/sqlite/simple-object-result.txx
new file mode 120000
index 0000000..7dbb9d1
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.cxx b/libbutl-odb/odb/sqlite/simple-object-statements.cxx
new file mode 120000
index 0000000..fe37130
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.hxx b/libbutl-odb/odb/sqlite/simple-object-statements.hxx
new file mode 120000
index 0000000..dbf222b
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.ixx b/libbutl-odb/odb/sqlite/simple-object-statements.ixx
new file mode 120000
index 0000000..863b920
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.txx b/libbutl-odb/odb/sqlite/simple-object-statements.txx
new file mode 120000
index 0000000..8a3bcc7
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/sqlite-types.hxx b/libbutl-odb/odb/sqlite/sqlite-types.hxx
new file mode 120000
index 0000000..dda05ff
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/sqlite-types.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/sqlite-types.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement-cache.hxx b/libbutl-odb/odb/sqlite/statement-cache.hxx
new file mode 120000
index 0000000..0ef7a98
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement-cache.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement-cache.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement-cache.txx b/libbutl-odb/odb/sqlite/statement-cache.txx
new file mode 120000
index 0000000..d945fe2
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement-cache.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement-cache.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement.cxx b/libbutl-odb/odb/sqlite/statement.cxx
new file mode 120000
index 0000000..e84cbae
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement.hxx b/libbutl-odb/odb/sqlite/statement.hxx
new file mode 120000
index 0000000..40c7e11
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statements-base.cxx b/libbutl-odb/odb/sqlite/statements-base.cxx
new file mode 120000
index 0000000..5cbbd29
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statements-base.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statements-base.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statements-base.hxx b/libbutl-odb/odb/sqlite/statements-base.hxx
new file mode 120000
index 0000000..022238e
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statements-base.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statements-base.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/stream.cxx b/libbutl-odb/odb/sqlite/stream.cxx
new file mode 120000
index 0000000..43d8e7a
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/stream.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/stream.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/stream.hxx b/libbutl-odb/odb/sqlite/stream.hxx
new file mode 120000
index 0000000..4d8f752
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/text-stream.hxx b/libbutl-odb/odb/sqlite/text-stream.hxx
new file mode 120000
index 0000000..5dfb71b
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/text-stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/text-stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/text.hxx b/libbutl-odb/odb/sqlite/text.hxx
new file mode 120000
index 0000000..d214506
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/text.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/text.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/tracer.cxx b/libbutl-odb/odb/sqlite/tracer.cxx
new file mode 120000
index 0000000..eb1a179
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/tracer.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/tracer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/tracer.hxx b/libbutl-odb/odb/sqlite/tracer.hxx
new file mode 120000
index 0000000..1bf3209
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/tracer.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/tracer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits-calls.hxx b/libbutl-odb/odb/sqlite/traits-calls.hxx
new file mode 120000
index 0000000..d736213
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits-calls.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits-calls.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits.cxx b/libbutl-odb/odb/sqlite/traits.cxx
new file mode 120000
index 0000000..71c2b15
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits.hxx b/libbutl-odb/odb/sqlite/traits.hxx
new file mode 120000
index 0000000..0c06d44
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction-impl.cxx b/libbutl-odb/odb/sqlite/transaction-impl.cxx
new file mode 120000
index 0000000..006fca5
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction-impl.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction-impl.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction-impl.hxx b/libbutl-odb/odb/sqlite/transaction-impl.hxx
new file mode 120000
index 0000000..c6b5f84
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction-impl.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.cxx b/libbutl-odb/odb/sqlite/transaction.cxx
new file mode 120000
index 0000000..72946da
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.hxx b/libbutl-odb/odb/sqlite/transaction.hxx
new file mode 120000
index 0000000..1a1b354
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.ixx b/libbutl-odb/odb/sqlite/transaction.ixx
new file mode 120000
index 0000000..67da3ef
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/version.hxx b/libbutl-odb/odb/sqlite/version.hxx
new file mode 100644
index 0000000..e604c17
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/version.hxx
@@ -0,0 +1,65 @@
+// file : odb/sqlite/version.hxx.in
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef LIBODB_SQLITE_VERSION // Note: using the version macro itself.
+
+// New numeric version format is AAAAABBBBBCCCCCDDDE where:
+//
+// AAAAA - major version number
+// BBBBB - minor version number
+// CCCCC - bugfix version number
+// DDD - alpha / beta (DDD + 500) version number
+// E - final (0) / snapshot (1)
+//
+// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
+//
+// Version AAAAABBBBBCCCCCDDDE
+//
+// 0.1.0 0000000001000000000
+// 0.1.2 0000000001000020000
+// 1.2.3 0000100002000030000
+// 2.2.0-a.1 0000200001999990010
+// 3.0.0-b.2 0000299999999995020
+// 2.2.0-a.1.z 0000200001999990011
+//
+#define LIBODB_SQLITE_VERSION_FULL 200004999995261ULL
+#define LIBODB_SQLITE_VERSION_STR "2.5.0-b.26.20240502090701.7ce5b6d18b67"
+#define LIBODB_SQLITE_VERSION_ID "2.5.0-b.26.7ce5b6d18b67"
+
+#define LIBODB_SQLITE_VERSION_MAJOR 2
+#define LIBODB_SQLITE_VERSION_MINOR 5
+#define LIBODB_SQLITE_VERSION_PATCH 0
+
+#define LIBODB_SQLITE_PRE_RELEASE true
+
+#define LIBODB_SQLITE_SNAPSHOT 20240502090701ULL
+#define LIBODB_SQLITE_SNAPSHOT_ID "7ce5b6d18b67"
+
+#include <odb/version.hxx>
+
+#ifdef LIBODB_VERSION_FULL
+# if !(LIBODB_VERSION_FULL == 200004999995261ULL && LIBODB_SNAPSHOT == 20240502090701ULL)
+# error incompatible libodb version, libodb == 2.5.0-b.26.20240502090701.7ce5b6d18b67 is required
+# endif
+#endif
+
+
+// Old/deprecated numeric version format is AABBCCDD where:
+//
+// AA - major version number
+// BB - minor version number
+// CC - bugfix version number
+// DD - alpha / beta (DD + 50) version number
+//
+// When DD is not 00, 1 is subtracted from AABBCC. For example:
+//
+// Version AABBCCDD
+// 2.0.0 02000000
+// 2.1.0 02010000
+// 2.1.1 02010100
+// 2.2.0.a1 02019901
+// 3.0.0.b2 02999952
+//
+#define LIBODB_SQLITE_VERSION 2049976
+
+#endif // LIBODB_SQLITE_VERSION
diff --git a/libbutl-odb/odb/sqlite/view-result.hxx b/libbutl-odb/odb/sqlite/view-result.hxx
new file mode 120000
index 0000000..bdd35c3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-result.txx b/libbutl-odb/odb/sqlite/view-result.txx
new file mode 120000
index 0000000..c6219bc
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-statements.hxx b/libbutl-odb/odb/sqlite/view-statements.hxx
new file mode 120000
index 0000000..d0c22cb
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-statements.txx b/libbutl-odb/odb/sqlite/view-statements.txx
new file mode 120000
index 0000000..f522d37
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement-processing-common.hxx b/libbutl-odb/odb/statement-processing-common.hxx
new file mode 120000
index 0000000..2a12e3f
--- /dev/null
+++ b/libbutl-odb/odb/statement-processing-common.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement-processing-common.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement-processing.cxx b/libbutl-odb/odb/statement-processing.cxx
new file mode 120000
index 0000000..2a4d084
--- /dev/null
+++ b/libbutl-odb/odb/statement-processing.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement-processing.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement.cxx b/libbutl-odb/odb/statement.cxx
new file mode 120000
index 0000000..057d7cf
--- /dev/null
+++ b/libbutl-odb/odb/statement.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement.hxx b/libbutl-odb/odb/statement.hxx
new file mode 120000
index 0000000..e92cc46
--- /dev/null
+++ b/libbutl-odb/odb/statement.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-array-traits.hxx b/libbutl-odb/odb/std-array-traits.hxx
new file mode 120000
index 0000000..308845c
--- /dev/null
+++ b/libbutl-odb/odb/std-array-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-array-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-deque-traits.hxx b/libbutl-odb/odb/std-deque-traits.hxx
new file mode 120000
index 0000000..7ccb3ec
--- /dev/null
+++ b/libbutl-odb/odb/std-deque-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-deque-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-forward-list-traits.hxx b/libbutl-odb/odb/std-forward-list-traits.hxx
new file mode 120000
index 0000000..67c2b47
--- /dev/null
+++ b/libbutl-odb/odb/std-forward-list-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-forward-list-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-list-traits.hxx b/libbutl-odb/odb/std-list-traits.hxx
new file mode 120000
index 0000000..25e8745
--- /dev/null
+++ b/libbutl-odb/odb/std-list-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-list-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-map-traits.hxx b/libbutl-odb/odb/std-map-traits.hxx
new file mode 120000
index 0000000..a1d18e2
--- /dev/null
+++ b/libbutl-odb/odb/std-map-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-map-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-set-traits.hxx b/libbutl-odb/odb/std-set-traits.hxx
new file mode 120000
index 0000000..7106505
--- /dev/null
+++ b/libbutl-odb/odb/std-set-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-set-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-unordered-map-traits.hxx b/libbutl-odb/odb/std-unordered-map-traits.hxx
new file mode 120000
index 0000000..560c9ff
--- /dev/null
+++ b/libbutl-odb/odb/std-unordered-map-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-unordered-map-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-unordered-set-traits.hxx b/libbutl-odb/odb/std-unordered-set-traits.hxx
new file mode 120000
index 0000000..7738e1a
--- /dev/null
+++ b/libbutl-odb/odb/std-unordered-set-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-unordered-set-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-vector-traits.hxx b/libbutl-odb/odb/std-vector-traits.hxx
new file mode 120000
index 0000000..f837306
--- /dev/null
+++ b/libbutl-odb/odb/std-vector-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-vector-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/tracer.cxx b/libbutl-odb/odb/tracer.cxx
new file mode 120000
index 0000000..403561c
--- /dev/null
+++ b/libbutl-odb/odb/tracer.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/tracer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/tracer.hxx b/libbutl-odb/odb/tracer.hxx
new file mode 120000
index 0000000..c3ea47c
--- /dev/null
+++ b/libbutl-odb/odb/tracer.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/tracer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/traits.hxx b/libbutl-odb/odb/traits.hxx
new file mode 120000
index 0000000..d64b1c3
--- /dev/null
+++ b/libbutl-odb/odb/traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.cxx b/libbutl-odb/odb/transaction.cxx
new file mode 120000
index 0000000..737baca
--- /dev/null
+++ b/libbutl-odb/odb/transaction.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.hxx b/libbutl-odb/odb/transaction.hxx
new file mode 120000
index 0000000..17d71d9
--- /dev/null
+++ b/libbutl-odb/odb/transaction.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.ixx b/libbutl-odb/odb/transaction.ixx
new file mode 120000
index 0000000..a54315d
--- /dev/null
+++ b/libbutl-odb/odb/transaction.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.cxx b/libbutl-odb/odb/vector-impl.cxx
new file mode 120000
index 0000000..666ef11
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.hxx b/libbutl-odb/odb/vector-impl.hxx
new file mode 120000
index 0000000..1a6d128
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.ixx b/libbutl-odb/odb/vector-impl.ixx
new file mode 120000
index 0000000..c432ff8
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-traits.hxx b/libbutl-odb/odb/vector-traits.hxx
new file mode 120000
index 0000000..0b52905
--- /dev/null
+++ b/libbutl-odb/odb/vector-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-traits.txx b/libbutl-odb/odb/vector-traits.txx
new file mode 120000
index 0000000..28991f3
--- /dev/null
+++ b/libbutl-odb/odb/vector-traits.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-traits.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector.hxx b/libbutl-odb/odb/vector.hxx
new file mode 120000
index 0000000..7e0cb3f
--- /dev/null
+++ b/libbutl-odb/odb/vector.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector.ixx b/libbutl-odb/odb/vector.ixx
new file mode 120000
index 0000000..87593d2
--- /dev/null
+++ b/libbutl-odb/odb/vector.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/version.hxx b/libbutl-odb/odb/version.hxx
new file mode 100644
index 0000000..370cda1
--- /dev/null
+++ b/libbutl-odb/odb/version.hxx
@@ -0,0 +1,65 @@
+// file : odb/version.hxx.in
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef LIBODB_VERSION // Note: using the version macro itself.
+
+// New numeric version format is AAAAABBBBBCCCCCDDDE where:
+//
+// AAAAA - major version number
+// BBBBB - minor version number
+// CCCCC - bugfix version number
+// DDD - alpha / beta (DDD + 500) version number
+// E - final (0) / snapshot (1)
+//
+// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
+//
+// Version AAAAABBBBBCCCCCDDDE
+//
+// 0.1.0 0000000001000000000
+// 0.1.2 0000000001000020000
+// 1.2.3 0000100002000030000
+// 2.2.0-a.1 0000200001999990010
+// 3.0.0-b.2 0000299999999995020
+// 2.2.0-a.1.z 0000200001999990011
+//
+#define LIBODB_VERSION_FULL 200004999995261ULL
+#define LIBODB_VERSION_STR "2.5.0-b.26.20240502090701.7ce5b6d18b67"
+#define LIBODB_VERSION_ID "2.5.0-b.26.7ce5b6d18b67"
+
+#define LIBODB_VERSION_MAJOR 2
+#define LIBODB_VERSION_MINOR 5
+#define LIBODB_VERSION_PATCH 0
+
+#define LIBODB_PRE_RELEASE true
+
+#define LIBODB_SNAPSHOT 20240502090701ULL
+#define LIBODB_SNAPSHOT_ID "7ce5b6d18b67"
+
+
+// Old/deprecated numeric version format is AABBCCDD where:
+//
+// AA - major version number
+// BB - minor version number
+// CC - bugfix version number
+// DD - alpha / beta (DD + 50) version number
+//
+// When DD is not 00, 1 is subtracted from AABBCC. For example:
+//
+// Version AABBCCDD
+// 2.0.0 02000000
+// 2.1.0 02010000
+// 2.1.1 02010100
+// 2.2.0.a1 02019901
+// 3.0.0.b2 02999952
+//
+
+// ODB interface version: minor, major, and alpha/beta versions.
+//
+#define ODB_VERSION 20476
+#define ODB_VERSION_STR "2.5-b.26"
+
+// libodb version: interface version plus the bugfix version.
+//
+#define LIBODB_VERSION 2049976
+
+#endif // LIBODB_VERSION
diff --git a/libbutl-odb/odb/view-image.hxx b/libbutl-odb/odb/view-image.hxx
new file mode 120000
index 0000000..8f2aec1
--- /dev/null
+++ b/libbutl-odb/odb/view-image.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-image.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/view-result.hxx b/libbutl-odb/odb/view-result.hxx
new file mode 120000
index 0000000..314e6da
--- /dev/null
+++ b/libbutl-odb/odb/view-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/view-result.txx b/libbutl-odb/odb/view-result.txx
new file mode 120000
index 0000000..9e4a6a3
--- /dev/null
+++ b/libbutl-odb/odb/view-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/wrapper-traits.hxx b/libbutl-odb/odb/wrapper-traits.hxx
new file mode 120000
index 0000000..9641baf
--- /dev/null
+++ b/libbutl-odb/odb/wrapper-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/wrapper-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/sqlite/sqlite3.c b/libbutl-odb/sqlite/sqlite3.c
new file mode 120000
index 0000000..2aaaa1a
--- /dev/null
+++ b/libbutl-odb/sqlite/sqlite3.c
@@ -0,0 +1 @@
+../../upstream/sqlite/libsqlite3/libsqlite3/sqlite3.c \ No newline at end of file
diff --git a/libbutl-odb/sqlite/sqlite3.h b/libbutl-odb/sqlite/sqlite3.h
new file mode 120000
index 0000000..0e9e0c6
--- /dev/null
+++ b/libbutl-odb/sqlite/sqlite3.h
@@ -0,0 +1 @@
+../../upstream/sqlite/libsqlite3/libsqlite3/sqlite3.h \ No newline at end of file
diff --git a/libbutl-pkg-config/README-DEV b/libbutl-pkg-config/README-DEV
new file mode 100644
index 0000000..eba196e
--- /dev/null
+++ b/libbutl-pkg-config/README-DEV
@@ -0,0 +1,30 @@
+Excluded/replaced/relocated upstream files/directories:
+ - libpkg-config/libbpkg-config/{.gitignore, buildfile}
+
+ - libpkg-config/libbpkg-config/version.h.in
+ - libpkg-config/libbpkg-config/version.h -- replace with pre-generated for
+ submodule commit
+
+ - libpkg-config/libbpkg-config/config.h.in
+ - libpkg-config/libbpkg-config/config.h -- replace with pre-generated with
+ empty system/default path (we
+ do/should not use them).
+
+Submodule update procedure (similar to updating to a new version of a
+third-party package):
+
+1. Update submodule:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-submodule
+
+2. Review upstream changes:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-review
+
+ Look for:
+
+ - files to add/remove (see above)
+ - changes to buildfiles that would need to be replicated (including to
+ root.build)
+
+3. Replace verison.h, config.h with pre-generated for this submodule commit.
diff --git a/libbutl-pkg-config/buildfile b/libbutl-pkg-config/buildfile
new file mode 100644
index 0000000..27159b3
--- /dev/null
+++ b/libbutl-pkg-config/buildfile
@@ -0,0 +1,65 @@
+# file : libbutl-pkg-config/buildfile
+# license : MIT; see accompanying LICENSE file
+
+windows = ($c.target.class == 'windows')
+
+msvc_runtime = ($c.target.system == 'win32-msvc')
+
+msvc = ($c.class == 'msvc')
+clang_msvc = ($c.id.type == 'clang' && $msvc_runtime)
+
+lib{butl-pkg-config}: libpkg-config/{h c}{*}
+
+# Build options.
+#
+c.poptions =+ "-I$src_base"
+
+obja{*}: c.poptions += -DLIBPKG_CONFIG_STATIC_BUILD
+objs{*}: c.poptions += -DLIBPKG_CONFIG_SHARED_BUILD
+
+# Disable warnings.
+#
+if $msvc
+ c.coptions += /wd4996 /wd4267
+elif $clang_msvc
+ c.coptions += -Wno-deprecated-declarations -Wno-unused-function
+
+if $windows
+ c.libs += ($msvc_runtime ? advapi32.lib : -ladvapi32)
+
+# Export options.
+#
+lib{butl-pkg-config}: c.export.poptions = "-I$src_base"
+liba{butl-pkg-config}: c.export.poptions += -DLIBPKG_CONFIG_STATIC
+libs{butl-pkg-config}: c.export.poptions += -DLIBPKG_CONFIG_SHARED
+
+# 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-pkg-config}: bin.lib.version = @"-$version.project_id"
+else
+ lib{butl-pkg-config}: bin.lib.version = @"-$version.major.$version.minor"
+
+# Install into the libbutl/pkg-config/ subdirectory of, say, /usr/include
+# recreate subdirectories (so we end up with
+# libbutl/pkg-config/libpkg-config/...>). Arrange via pkg-config to be able to
+# include headers as <libpkg-config/...>.
+#
+# The reason we add an extra pkg-config/ 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.
+#
+h{*}:
+{
+ install = include/libbutl/pkg-config/
+ install.subdirs = true
+}
+
+libpkg-config/
+{
+ h{config}@./ h{stdinc}@./: install = false
+}
+
+lib{butl-pkg-config}: c.pkgconfig.include = include/libbutl/pkg-config/
diff --git a/libbutl-pkg-config/libpkg-config/argvsplit.c b/libbutl-pkg-config/libpkg-config/argvsplit.c
new file mode 120000
index 0000000..59f933e
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/argvsplit.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/argvsplit.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/bsdstubs.c b/libbutl-pkg-config/libpkg-config/bsdstubs.c
new file mode 120000
index 0000000..53c3669
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/bsdstubs.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/bsdstubs.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/cache.c b/libbutl-pkg-config/libpkg-config/cache.c
new file mode 120000
index 0000000..04f55e2
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/cache.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/cache.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/client.c b/libbutl-pkg-config/libpkg-config/client.c
new file mode 120000
index 0000000..d705a55
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/client.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/client.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/config.h b/libbutl-pkg-config/libpkg-config/config.h
new file mode 100644
index 0000000..c1c5e8d
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/config.h
@@ -0,0 +1,41 @@
+/* file : libpkg-config/config.h.in -*- C -*-
+ * license : ISC; see accompanying COPYING file
+ */
+#ifndef LIBPKG_CONFIG_CONFIG_H
+#define LIBPKG_CONFIG_CONFIG_H
+
+#if defined(__linux__)
+# include <features.h> /* __GLIBC__, __GLIBC_MINOR__ */
+#endif
+
+/*
+ * strndup() is not present on Windows while strl*() are only present on
+ * *BSD and MacOS.
+ *
+ */
+#if !defined(_WIN32)
+# define HAVE_STRNDUP 1
+#endif
+
+/*
+ * GNU libc added strlcpy() and strlcat() in version 2.38 (in anticipation
+ * of their addition to POSIX).
+ */
+#if defined(__FreeBSD__) || \
+ defined(__OpenBSD__) || \
+ defined(__NetBSD__) || \
+ defined(__APPLE__) || \
+ (defined(__GLIBC__) && \
+ defined(__GLIBC_MINOR__) && \
+ (__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 38))
+# define HAVE_STRLCPY 1
+# define HAVE_STRLCAT 1
+#endif
+
+#define LIBPKG_CONFIG_PROJECT_URL "https://github.com/build2/libpkg-config"
+
+#define PKG_CONFIG_DEFAULT_PATH ""
+#define SYSTEM_INCLUDEDIR ""
+#define SYSTEM_LIBDIR ""
+
+#endif /* LIBPKG_CONFIG_CONFIG_H */
diff --git a/libbutl-pkg-config/libpkg-config/dependency.c b/libbutl-pkg-config/libpkg-config/dependency.c
new file mode 120000
index 0000000..2e12a02
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/dependency.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/dependency.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/export.h b/libbutl-pkg-config/libpkg-config/export.h
new file mode 120000
index 0000000..d3bf554
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/export.h
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/export.h \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/fileio.c b/libbutl-pkg-config/libpkg-config/fileio.c
new file mode 120000
index 0000000..65935f3
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/fileio.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/fileio.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/fragment.c b/libbutl-pkg-config/libpkg-config/fragment.c
new file mode 120000
index 0000000..826d666
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/fragment.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/fragment.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/list.h b/libbutl-pkg-config/libpkg-config/list.h
new file mode 120000
index 0000000..861f4d3
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/list.h
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/list.h \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/parser.c b/libbutl-pkg-config/libpkg-config/parser.c
new file mode 120000
index 0000000..87c341e
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/parser.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/parser.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/path.c b/libbutl-pkg-config/libpkg-config/path.c
new file mode 120000
index 0000000..b710dec
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/path.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/path.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/pkg-config.h b/libbutl-pkg-config/libpkg-config/pkg-config.h
new file mode 120000
index 0000000..9a41ca6
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/pkg-config.h
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/pkg-config.h \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/pkg.c b/libbutl-pkg-config/libpkg-config/pkg.c
new file mode 120000
index 0000000..74f6be5
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/pkg.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/pkg.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/stdinc.h b/libbutl-pkg-config/libpkg-config/stdinc.h
new file mode 120000
index 0000000..f433ee0
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/stdinc.h
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/stdinc.h \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/tuple.c b/libbutl-pkg-config/libpkg-config/tuple.c
new file mode 120000
index 0000000..7224e23
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/tuple.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/libpkg-config/tuple.c \ No newline at end of file
diff --git a/libbutl-pkg-config/libpkg-config/version.h b/libbutl-pkg-config/libpkg-config/version.h
new file mode 100644
index 0000000..ef000f5
--- /dev/null
+++ b/libbutl-pkg-config/libpkg-config/version.h
@@ -0,0 +1,37 @@
+#ifndef LIBPKG_CONFIG_VERSION_H
+#define LIBPKG_CONFIG_VERSION_H
+
+/* The numeric version format is AAAAABBBBBCCCCCDDDE where:
+ *
+ * AAAAA - major version number
+ * BBBBB - minor version number
+ * CCCCC - bugfix version number
+ * DDD - alpha / beta (DDD + 500) version number
+ * E - final (0) / snapshot (1)
+ *
+ * When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
+ *
+ * Version AAAAABBBBBCCCCCDDDE
+ *
+ * 0.1.0 0000000001000000000
+ * 0.1.2 0000000001000020000
+ * 1.2.3 0000100002000030000
+ * 2.2.0-a.1 0000200001999990010
+ * 3.0.0-b.2 0000299999999995020
+ * 2.2.0-a.1.z 0000200001999990011
+ */
+#define LIBPKG_CONFIG_VERSION 1000010001ULL
+#define LIBPKG_CONFIG_VERSION_STR "0.1.2-a.0.20230830042926.81bc60b38195"
+#define LIBPKG_CONFIG_VERSION_ID "0.1.2-a.0.81bc60b38195"
+#define LIBPKG_CONFIG_VERSION_FULL "0.1.2-a.0.20230830042926.81bc60b38195"
+
+#define LIBPKG_CONFIG_VERSION_MAJOR 0
+#define LIBPKG_CONFIG_VERSION_MINOR 1
+#define LIBPKG_CONFIG_VERSION_PATCH 2
+
+#define LIBPKG_CONFIG_PRE_RELEASE true
+
+#define LIBPKG_CONFIG_SNAPSHOT_SN 20230830042926ULL
+#define LIBPKG_CONFIG_SNAPSHOT_ID "81bc60b38195"
+
+#endif /* LIBPKG_CONFIG_VERSION_H */
diff --git a/libbutl/utility.hxx b/libbutl/utility.hxx
index a129276..779a0aa 100644
--- a/libbutl/utility.hxx
+++ b/libbutl/utility.hxx
@@ -190,6 +190,24 @@ namespace butl
//
// The second version examines up to the n'th character in the string.
//
+ // The third version, instead of skipping consecutive delimiters, treats
+ // them as separating empty words. The additional m variable contains an
+ // unspecified internal state and should be initialized to 0. Note that in
+ // this case you should use the (b == n) condition to detect the end. Note
+ // also that a leading delimiter is considered as separating an empty word
+ // from the rest and the trailing delimiter is considered as separating the
+ // rest from an empty word. For example, this is how to parse lines while
+ // observing blanks:
+ //
+ // for (size_t b (0), e (0), m (0), n (s.size ());
+ // next_word (s, n, b, e, m, '\n', '\r'), b != n; )
+ // {
+ // string l (s, b, e - b);
+ // }
+ //
+ // For string "\na\n" this code will observe the {"", "a", ""} words. And
+ // for just "\n" it will observe the {"", ""} words.
+ //
std::size_t
next_word (const std::string&, std::size_t& b, std::size_t& e,
char d1 = ' ', char d2 = '\0');
@@ -198,6 +216,11 @@ namespace butl
next_word (const std::string&, std::size_t n, std::size_t& b, std::size_t& e,
char d1 = ' ', char d2 = '\0');
+ std::size_t
+ next_word (const std::string&, std::size_t n,
+ std::size_t& b, std::size_t& e, std::size_t& m,
+ char d1 = ' ', char d2 = '\0');
+
// Sanitize a string to only contain characters valid in an identifier
// (ASCII alphanumeric plus `_`) replacing all others with `_`.
//
diff --git a/libbutl/utility.ixx b/libbutl/utility.ixx
index 0ce33a7..fda1ce5 100644
--- a/libbutl/utility.ixx
+++ b/libbutl/utility.ixx
@@ -210,6 +210,66 @@ namespace butl
return e - b;
}
+ inline std::size_t
+ next_word (const std::string& s,
+ std::size_t n, std::size_t& b, std::size_t& e, std::size_t& m,
+ char d1, char d2)
+ {
+ // An empty word will necessarily be represented as b and e being the
+ // position of a delimiter. Consider these corner cases (in all three we
+ // should produce two words):
+ //
+ // \n
+ // a\n
+ // \na
+ //
+ // It feels sensible to represent an empty word as the position of the
+ // trailing delimiter except if it is the last character (the first two
+ // cases). Thus the additional m state, which, if 0 or 1 indicates the
+ // number of delimiters to skip before parsing the next word and 2 if
+ // this is a trailing delimiter for which we need to fake an empty word
+ // with the leading delimiter.
+
+ if (b != e)
+ b = e;
+
+ if (m > 1)
+ {
+ --m;
+ return 0;
+ }
+
+ // Skip the leading delimiter, if any.
+ //
+ b += m;
+
+ if (b == n)
+ {
+ e = n;
+ return 0;
+ }
+
+ // Find first trailing delimiter.
+ //
+ m = 0;
+ for (e = b; e != n; ++e)
+ {
+ if (s[e] == d1 || s[e] == d2)
+ {
+ m = 1;
+
+ // Handle the special delimiter as the last character case.
+ //
+ if (e + 1 == n)
+ ++m;
+
+ break;
+ }
+ }
+
+ return e - b;
+ }
+
inline std::string&
sanitize_identifier (std::string& s)
{
diff --git a/manifest b/manifest
index 7ac415a..7bd2d3d 100644
--- a/manifest
+++ b/manifest
@@ -3,7 +3,7 @@ name: libbutl
version: 0.17.0-a.0.z
project: build2
summary: build2 utility library
-license: MIT AND BSD-3-Clause AND BSD-2-Clause ; MIT except for files from the FreeBSD, LZ4, and mingw-std-threads projects.
+license: MIT AND BSD-3-Clause AND BSD-2-Clause AND ISC AND blessing; MIT except for files from other projects (all permissively licensed).
topics: build toolchain
description-file: README
changes-file: NEWS
diff --git a/tests/build/root.build b/tests/build/root.build
index 515e1c9..5ce7156 100644
--- a/tests/build/root.build
+++ b/tests/build/root.build
@@ -4,15 +4,16 @@
cxx.std = latest
using cxx
+using c
hxx{*}: extension = hxx
cxx{*}: extension = cxx
if ($cxx.target.system == 'win32-msvc')
- cxx.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
+ cc.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
if ($cxx.class == 'msvc')
- cxx.coptions += /wd4251 /wd4275 /wd4800
+ cc.coptions += /wd4251 /wd4275 /wd4800
elif ($cxx.id == 'gcc')
{
cxx.coptions += -Wno-maybe-uninitialized -Wno-free-nonheap-object \
diff --git a/tests/next-word/buildfile b/tests/next-word/buildfile
new file mode 100644
index 0000000..e06cd88
--- /dev/null
+++ b/tests/next-word/buildfile
@@ -0,0 +1,6 @@
+# file : tests/next-word/buildfile
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl}
+
+exe{driver}: {hxx cxx}{*} $libs
diff --git a/tests/next-word/driver.cxx b/tests/next-word/driver.cxx
new file mode 100644
index 0000000..4ebe1a5
--- /dev/null
+++ b/tests/next-word/driver.cxx
@@ -0,0 +1,46 @@
+// file : tests/next-word/driver.cxx -*- C++ -*-
+// license : MIT; see accompanying LICENSE file
+
+#include <vector>
+#include <string>
+//#include <iostream>
+
+#include <libbutl/utility.hxx>
+
+#undef NDEBUG
+#include <cassert>
+
+using namespace std;
+using namespace butl;
+
+using strings = vector<string>;
+
+static strings
+parse_lines (const string& s)
+{
+ strings r;
+ for (size_t b (0), e (0), m (0), n (s.size ());
+ next_word (s, n, b, e, m, '\n', '\r'), b != n; )
+ {
+ //cerr << "'" << string (s, b, e - b) << "'" << endl;
+ r.push_back (string (s, b, e - b));
+ }
+ return r;
+}
+
+int
+main ()
+{
+ assert ((parse_lines("") == strings {}));
+ assert ((parse_lines("a") == strings {"a"}));
+ assert ((parse_lines("\n") == strings {"", ""}));
+ assert ((parse_lines("\n\n") == strings {"", "", ""}));
+ assert ((parse_lines("\n\n\n") == strings {"", "", "", ""}));
+ assert ((parse_lines("\na") == strings {"", "a"}));
+ assert ((parse_lines("\n\na") == strings {"", "", "a"}));
+ assert ((parse_lines("a\n") == strings {"a", ""}));
+ assert ((parse_lines("a\n\n") == strings {"a", "", ""}));
+ assert ((parse_lines("a\nb") == strings {"a", "b"}));
+ assert ((parse_lines("a\n\nb") == strings {"a", "", "b"}));
+ assert ((parse_lines("\na\nb\n") == strings {"", "a", "b", ""}));
+}
diff --git a/tests/odb/buildfile b/tests/odb/buildfile
new file mode 100644
index 0000000..c59ab0f
--- /dev/null
+++ b/tests/odb/buildfile
@@ -0,0 +1,6 @@
+# file : tests/odb/buildfile
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl-odb}
+
+exe{driver}: {hxx cxx}{*} $libs
diff --git a/tests/odb/driver.cxx b/tests/odb/driver.cxx
new file mode 120000
index 0000000..d880fda
--- /dev/null
+++ b/tests/odb/driver.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb-sqlite/tests/basics/driver.cxx \ No newline at end of file
diff --git a/tests/pkg-config/buildfile b/tests/pkg-config/buildfile
new file mode 100644
index 0000000..896b916
--- /dev/null
+++ b/tests/pkg-config/buildfile
@@ -0,0 +1,6 @@
+# file : tests/pkg-config/buildfile
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl-pkg-config}
+
+exe{driver}: {h c}{*} $libs testscript
diff --git a/tests/pkg-config/driver.c b/tests/pkg-config/driver.c
new file mode 120000
index 0000000..2e6f14a
--- /dev/null
+++ b/tests/pkg-config/driver.c
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/tests/basic/driver.c \ No newline at end of file
diff --git a/tests/pkg-config/testscript b/tests/pkg-config/testscript
new file mode 120000
index 0000000..628bd41
--- /dev/null
+++ b/tests/pkg-config/testscript
@@ -0,0 +1 @@
+../../upstream/libpkg-config/libpkg-config/tests/basic/testscript \ No newline at end of file
diff --git a/upstream/libpkg-config b/upstream/libpkg-config
new file mode 160000
+Subproject 81bc60b381959b99cdef93d9326f3dd9522c307
diff --git a/upstream/odb b/upstream/odb
new file mode 160000
+Subproject 7ce5b6d18b6753717df9cbbbf1e51a7c8012431
diff --git a/upstream/sqlite b/upstream/sqlite
new file mode 160000
+Subproject 5b013b5507eb14bf51e565ec844d1fc462302f6