summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE2
-rwxr-xr-xbuild2/download334
-rw-r--r--build2/release.txt82
-rwxr-xr-xbuild2/version.sh137
4 files changed, 554 insertions, 1 deletions
diff --git a/LICENSE b/LICENSE
index 9d92da1..fa23045 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009-2024 Code Synthesis Tools CC.
+Copyright (c) 2009-2025 Code Synthesis.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
diff --git a/build2/download b/build2/download
new file mode 100755
index 0000000..8851c12
--- /dev/null
+++ b/build2/download
@@ -0,0 +1,334 @@
+#! /usr/bin/env bash
+
+# Download and arrange source and binary packages.
+#
+# Run from the root of the destination download directory. Note that the
+# destination files are expected not to exist.
+
+repo="https://queue.stage.build2.org"
+#mingw="https://download.build2.org/0.17.0/build2-mingw-0.17.0-x86_64-windows.tar.xz"
+mingw="https://stage.build2.org/0/0.18.0-a.0/build2-mingw-0.18.0-a.0-x86_64-windows.tar.xz"
+
+bin_repo="$repo/0/bindist"
+src_repo="$repo/1"
+
+declare -A vers
+declare -A srcs
+declare -A bins
+
+# Project to version map.
+#
+# Key is project name, value is space-separated list of the
+# '[<src-repo-url>/]<repo-section>/<version>' entries. For entries with the
+# omitted '<src-repo-url>/' prefix the "$src_repo/" prefix is assumed. For
+# example:
+#
+# alpha/3.3.1-a.0.20241206125527.c3e2855e0a52 https://pkg.cppget.org/1/stable/1.1.1+21
+#
+# Note that for the binary distribution packages only the first version is
+# used.
+#
+# Note that currently we download two versions of openssl libraries since
+# libmysqlclient 8.0.15+18 constrains the libcrypto and libssl dependency
+# versions with ^1.1.1.
+#
+vers["odb"]="testing/2.5.0"
+vers["mysql"]="https://pkg.cppget.org/1/stable/8.0.15+18"
+vers["sqlite"]="https://pkg.cppget.org/1/stable/3.45.3+1"
+vers["postgresql"]="https://pkg.cppget.org/1/stable/14.1.0+6"
+vers["libcutl"]="https://pkg.cppget.org/1/stable/1.11.0"
+vers["libstudxml"]="https://pkg.cppget.org/1/testing/1.1.0"
+vers["zlib"]="https://pkg.cppget.org/1/stable/1.2.1200+5"
+vers["zstd"]="https://pkg.cppget.org/1/stable/1.5.5+1"
+vers["openssl"]="https://pkg.cppget.org/1/stable/3.3.1 https://pkg.cppget.org/1/stable/1.1.1+21"
+vers["isocline"]="https://pkg.cppget.org/1/stable/1.0.9+1"
+
+# Package to project map.
+#
+# Key is package name, value is project name (for all specified versions).
+#
+# Note that we don't download the Boost and Qt source packages, which may
+# potentially be required for building odb-tests and odb-examples, since there
+# are too large.
+#
+srcs["libodb"]="odb"
+srcs["libodb-mysql"]="odb"
+srcs["libodb-sqlite"]="odb"
+srcs["libodb-pgsql"]="odb"
+srcs["libodb-oracle"]="odb"
+srcs["libodb-mssql"]="odb"
+srcs["libodb-boost"]="odb"
+srcs["libodb-qt"]="odb"
+srcs["odb"]="odb"
+srcs["odb-tests"]="odb"
+srcs["odb-examples"]="odb"
+srcs["libmysqlclient"]="mysql"
+srcs["mysql-client"]="mysql"
+srcs["libsqlite3"]="sqlite"
+srcs["sqlite3"]="sqlite"
+srcs["libpq"]="postgresql"
+srcs["psql"]="postgresql"
+srcs["libcutl"]="libcutl"
+srcs["libstudxml"]="libstudxml"
+srcs["libz"]="zlib"
+srcs["libzstd"]="zstd"
+srcs["libcrypto"]="openssl"
+srcs["libssl"]="openssl"
+srcs["libisocline"]="isocline"
+
+# Binary source to destination path map.
+#
+# The key is the "<dist>/<os>/<proj>/<pkg>/<cfg>" bindist artifact path. The
+# value is the destination subdirectory.
+#
+# Note that <cfg> is a sanitized package configuration name prefixed with an
+# architecture (see brep's upload-bindist handler for details).
+#
+bins["debian/debian11/odb/libodb/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/libodb-mysql/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/libodb-sqlite/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/libodb-pgsql/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/libodb-boost/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/libodb-qt/x86_64"]="debian/debian11/x86_64"
+bins["debian/debian11/odb/odb/x86_64"]="debian/debian11/x86_64"
+
+bins["debian/debian12/odb/libodb/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/libodb-mysql/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/libodb-sqlite/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/libodb-pgsql/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/libodb-boost/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/libodb-qt/x86_64"]="debian/debian12/x86_64"
+bins["debian/debian12/odb/odb/x86_64"]="debian/debian12/x86_64"
+
+bins["debian/ubuntu22.04/odb/libodb/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/libodb-mysql/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/libodb-sqlite/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/libodb-pgsql/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/libodb-boost/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/libodb-qt/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+bins["debian/ubuntu22.04/odb/odb/x86_64"]="ubuntu/ubuntu22.04/x86_64"
+
+bins["debian/ubuntu24.04/odb/libodb/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/libodb-mysql/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/libodb-sqlite/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/libodb-pgsql/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/libodb-boost/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/libodb-qt/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+bins["debian/ubuntu24.04/odb/odb/x86_64"]="ubuntu/ubuntu24.04/x86_64"
+
+bins["fedora/fedora40/odb/libodb/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/libodb-mysql/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/libodb-sqlite/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/libodb-pgsql/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/libodb-boost/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/libodb-qt/x86_64"]="fedora/fedora40/x86_64"
+bins["fedora/fedora40/odb/odb/x86_64"]="fedora/fedora40/x86_64"
+
+bins["fedora/fedora41/odb/libodb/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/libodb-mysql/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/libodb-sqlite/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/libodb-pgsql/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/libodb-boost/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/libodb-qt/x86_64"]="fedora/fedora41/x86_64"
+bins["fedora/fedora41/odb/odb/x86_64"]="fedora/fedora41/x86_64"
+
+bins["fedora/rhel9.2/odb/libodb/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/libodb-mysql/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/libodb-sqlite/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/libodb-pgsql/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/libodb-boost/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/libodb-qt/x86_64"]="rhel/rhel9.2/x86_64"
+bins["fedora/rhel9.2/odb/odb/x86_64"]="rhel/rhel9.2/x86_64"
+
+bins["archive/windows10/odb/libodb/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-mysql/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-mysql/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-sqlite/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-sqlite/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-pgsql/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-pgsql/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-boost/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-boost/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-qt/x86_64-release"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/libodb-qt/x86_64-debug"]="windows/windows10/x86_64"
+bins["archive/windows10/odb/odb/x86_64"]="windows/windows10/x86_64"
+
+owd=`pwd`
+trap "{ cd $owd; exit 1; }" ERR
+set -o errtrace # Trap in functions.
+set -o pipefail # Fail if any pipeline command fails.
+shopt -s lastpipe # Execute last pipeline command in current shell.
+
+function info () { echo "$*" 1>&2; }
+function error () { info "$*"; exit 1; }
+
+declare -A dirs # Package directories to generate packages.sha256 in.
+
+# Download and arrange sources.
+#
+if true; then
+for pkg in "${!srcs[@]}"; do
+ prj="${srcs[$pkg]}"
+
+ for v in ${vers["$prj"]}; do
+
+ ver="$(sed -rn -e 's#^.+/([^/]+)$#\1#p' <<<"$v")"
+ sec="$(sed -rn -e 's#^(.+/)?([^/]+)/[^/]+$#\2#p' <<<"$v")"
+ rep="$(sed -rn -e 's#^((.+)/)?[^/]+/[^/]+$#\2#p' <<<"$v")"
+
+ if [ -z "$rep" ]; then
+ rep="$src_repo"
+ fi
+
+ pkgf="$pkg-$ver.tar.gz"
+ url="$rep/$sec/$prj/$pkgf"
+
+ info "fetching $url"
+ curl -sSf -o "$pkgf" "$url"
+
+ # Make .zip archive for examples.
+ #
+ if [ -n "$(sed -rn -e 's/^.+-examples$/true/p' <<<"$pkg")" ]; then
+ pkgd="$pkg-$ver"
+
+ if [ -d "$pkgd" ]; then
+ error "package directory $pkgd already exist"
+ fi
+
+ info "repacking $pkgf"
+ tar -xf "$pkgf"
+ zip -9 -rq "$pkg-$ver.zip" "$pkgd"
+ rm -rf "$pkgd"
+ fi
+ done
+done
+dirs["."]=true
+fi
+
+# Download and arrange binaries.
+#
+# Also overlay MinGW distribution over the ODB compiler archive for Windows.
+#
+if true; then
+for bk in "${!bins[@]}"; do
+ bv="${bins[$bk]}"
+
+ # Get the distribution type we are dealing with.
+ #
+ dist="$(sed -rn -e 's#^(.+)/.+/.+/.+/.+$#\1#p' <<<"$bk")"
+
+ # Get the project we are dealing with and its version. Pick the first
+ # version from potentially multiple ones specified for the project.
+ #
+ prj="$(sed -rn -e 's#^.+/.+/(.+)/.+/.+$#\1#p' <<<"$bk")"
+
+ v="$(sed -rn -e 's#^([^ ]+).*$#\1#p' <<<"${vers[$prj]}")"
+ ver="$(sed -rn -e 's#^.+/([^/]+)$#\1#p' <<<"$v")"
+
+ url="$bin_repo/"
+ url+="$(sed -rn -e "s#^(.+/.+/.+/.+)/(.+)\$#\\1/$ver/\\2#p" <<<"$bk")"
+
+ # Get the list of packages (keys) and their checksums (values) at this URL
+ # by loading its packages.sha256.
+ #
+ unset pkgs # Clear.
+ declare -A pkgs
+
+ info "fetching $url/packages.sha256"
+ curl -sSf "$url/packages.sha256" | while read l; do
+
+ pkg="$(sed -rn -e 's#^([^ ]+) \*(.+)$#\2#p' <<<"$l")"
+
+ # Get the extension and omit certain distribution-specific file types.
+ #
+ e="$(sed -rn -e 's#^.+\.([^.]+)$#\1#p' <<<"$pkg")"
+
+ case "$dist" in
+ "debian")
+ if [ "$e" = "buildinfo" -o "$e" = "changes" ]; then
+ continue
+ fi
+ ;;
+
+ "fedora")
+ ;;
+ esac
+
+ csm="$(sed -rn -e 's#^([^ ]+) \*(.+)$#\1#p' <<<"$l")"
+ pkgs["$pkg"]="$csm"
+ done
+
+ mkdir -p "$bv"
+
+ # Download each package and verify checksum.
+ #
+ for pkg in "${!pkgs[@]}"; do
+
+ pkgf="$bv/$pkg"
+
+ if [ -f "$pkgf" ]; then
+ error "destination package $pkgf from $bk already exist"
+ fi
+
+ info "fetching $url/$pkg"
+ curl -sSf -o "$pkgf" "$url/$pkg"
+
+ csm="$(sha256sum -b "$pkgf" | sed -rn -e 's#^([^ ]+) \*(.+)$#\1#p')"
+
+ if [ "$csm" != "${pkgs[$pkg]}" ]; then
+ error "checksum mismatch for package $pkgf from $bk"
+ fi
+
+ # Overlay the odb windows archive with the contents of the MinGW GCC
+ # distribution archive (see odb/manifest for details).
+ #
+ odb_dir="$(sed -rn -e 's/^(odb-.+-x86_64-windows.+)\.zip$/\1/p' <<<"$pkg")"
+
+ if [ -n "$odb_dir" ]; then
+
+ if [ -d "$odb_dir" ]; then
+ error "package directory $odb_dir already exist"
+ fi
+
+ mingw_file="$(sed -rn -e 's#^.+/([^/]+)$#\1#p' <<<"$mingw")"
+ mingw_dir="$(sed -rn -e 's/^(.+)\.[^.]+\.[^.]+$/\1/p' <<<"$mingw_file")"
+
+ if [ -d "$mingw_dir" ]; then
+ error "MinGW GCC distribution directory $mingw_dir already exist"
+ fi
+
+ info "fetching $mingw"
+ curl -sSf -o "$mingw_file" "$mingw"
+
+ info "overlaying $pkgf with $mingw_file"
+
+ unzip -q "$pkgf"
+ rm "$pkgf"
+
+ tar -xf "$mingw_file"
+ rm "$mingw_file"
+
+ mv "$mingw_dir" "$odb_dir/mingw"
+ cp "$odb_dir/mingw/bin/libgcc_s_seh-"*.dll "$odb_dir/bin"
+ cp "$odb_dir/mingw/bin/libstdc++-"*.dll "$odb_dir/bin"
+ cp "$odb_dir/mingw/bin/libwinpthread-"*.dll "$odb_dir/bin"
+
+ zip -9 -rq "$pkgf" "$odb_dir"
+ rm -r "$odb_dir"
+ fi
+ done
+
+ dirs["$bv"]=true
+done
+fi
+
+# Generate packages.sha256
+#
+for d in "${!dirs[@]}"; do
+ cd "$d"
+ rm -f "packages.sha256"
+ l="$(find . -maxdepth 1 -type f -printf '%P\n' | sort)" # Array-like.
+ sha256sum -b $l >"packages.sha256"
+ cd "$owd"
+done
diff --git a/build2/release.txt b/build2/release.txt
new file mode 100644
index 0000000..51c9c3c
--- /dev/null
+++ b/build2/release.txt
@@ -0,0 +1,82 @@
+1. Finalize odb and release all dependencies (.
+
+ * Release libcutl, libstudxml (note: cli is develop-only).
+
+ * Review @@ (at least @@ TMP).
+ * Update NEWS files.
+ * Update bindist configs if necessary (e.g., generic linux config).
+ * CI and make sure all good.
+ * Publish to queue.stage.build2.org and make sure all good.
+ * Push everything.
+
+2. Release and publish to queue.stage.build2.org to build binary packages.
+
+ * Release BUT DON'T PUSH:
+
+ - Update version.sh script per comments in the script.
+ - Run version.sh and review changes.
+ - Make sure pre-generated documentation is up to date.
+ - Build and test locally (bdep test -a).
+ - Commit and tag (but don't push) per comments in the script.
+
+ * Publish to queue.stage.build2.org.
+
+ - Make sure Fedora bindist machines have up-to-date GCC.
+
+ * Confirm all good and all binaries are built.
+
+ * Update and run `download` script to download and arrange source and
+ binary packages.
+
+ - Smoke-test Windows ODB compiler binary (overlayed with MinGW).
+
+ * Copy packages over to download directory, make sure there is enough
+ disk space on host to publish.
+
+ * Copy over (or add new) README.cli and update.
+
+3. Update web pages
+
+ * Update "Compilers & Platforms" page.
+
+ * Update "Download" page.
+
+ * Update install-build2 page.
+
+ * Look over other pages for any changes (new C++ contructs, new feature,
+ etc).
+
+ * Copy over updated documentation to products/odb/doc/. Review
+ with gitk for any unexpected differences.
+
+3. Publish and announce
+
+ * bdep-publish all the packages and make sure queued builds are good.
+
+ NO: copy from queue.stage.build2.org for archive stability (we've
+ already copied them to download/).
+
+ * Migrate packages from queue to public/stable. Cleanup any old betas.
+
+ * Publish binaries and updated web pages (regenerate .cli files).
+
+ - Add release on GitHub (add links to packages, NEWS entries; use
+ previous release as template).
+
+ * Write release announcements and send to odb-{users, announcements}.
+
+ * Announce on #build2.
+
+ * Add news entries to web pages/RSS (landing page and product).
+
+ * Announce on r/cpp/, lobste.rs
+
+4. Finish
+
+ * Commit web pages.
+
+ * Commit odb-etc.
+
+ * Update in build2?
+
+ * Update Homebrew formula.
diff --git a/build2/version.sh b/build2/version.sh
new file mode 100755
index 0000000..6d3673b
--- /dev/null
+++ b/build2/version.sh
@@ -0,0 +1,137 @@
+#!/bin/bash
+
+# Usage: run from the ODB repository root.
+#
+# Recommended procedure:
+#
+# ./version.sh
+# git diff # review (compare to previous release for any discrepancies)
+# git ci -a -m "Release version X.Y.Z"
+# git tag -a "vX.Y.Z" -m "Tag version X.Y.Z"
+#
+
+# @@ Fix libcutl and libstudxml version upon release if betas for LTS
+# and restore when re-opening for development. Otherwise, update
+# constraints to latest released.
+# @@ CLI dependency is managed manually.
+# @@ MySQL, PostgreSQL client dependencies are managed manually (tests, examples)
+# @@ Version/date/copyright in odb/doc/{*-prologuie,manual.xhtml,manual.html2ps} -
+# grep for 2.5, [cC]opyright.
+
+# Currently we use even beta numbers for snapshot version meaning
+# after the release b.1 becomes b.2.z, not b.1.z and at release b.2.z
+# becomes b.3.
+#
+#interface_num=20479
+interface_num=20500
+
+#interface_str=2.5-b.29
+interface_str=2.5
+
+#num=2049979
+num=2050000
+
+#str=2.5.0-b.29
+str=2.5.0
+
+#man_str=2.5.0-b.29
+#man_str=2.5.0-b.30.z
+#man_str=2.5.0-b.29+1
+man_str=2.5.0
+
+#profile_num=2047900
+profile_num=2050000
+
+#profile_str=2.5.0-b.29
+profile_str=2.5.0
+
+# No max, always >=.
+#
+# We should try to stay at least one version behind not to cause unnecessary
+# inconvenience.
+#
+build2=0.17.0
+bpkg=0.17.0
+
+#---------------------------------------------------------------------------
+
+mj="$(echo "$man_str" | sed -re 's/([^.]+)\..*/\1/')"
+mn="$(echo "$man_str" | sed -re 's/[^.]+\.([^.]+)\..*/\1/')"
+pt="$(echo "$man_str" | sed -re 's/[^.]+\.[^.]+\.([^.-]+).*/\1/')"
+ab="$(echo "$man_str" | sed -n -re 's/[^.]+\.[^.]+\.[^.-]+-([ab]).*/\1/p')"
+pr="$(echo "$man_str" | sed -n -re 's/[^.]+\.[^.]+\.[^.-]+-[ab]\.([^.+]+).*/\1/p')"
+
+# In manifests for alpha/beta we use an exact match. For snapshots -- snapshot
+# range. Otherwise an X.Y.* range.
+#
+if [ -n "$ab" ]; then
+ if [[ $man_str == *.z ]]; then
+ man="[$mj.$mn.$pt-$ab.$pr.1 $mj.$mn.$pt-$ab.$(($pr+1)))"
+ else
+ man="== $man_str"
+ fi
+else
+ man="[$mj.$mn.0 $mj.$(($mn+1)).0-); $mj.$mn.X"
+fi
+
+cd libodb
+
+sed -i -e "s/^\(#define ODB_VERSION \).*/\1$interface_num/" odb/version.hxx.in
+sed -i -e "s/^\(#define ODB_VERSION_STR \).*/\1\"$interface_str\"/" odb/version.hxx.in
+sed -i -e "s/^\(#define LIBODB_VERSION \).*/\1$num/" odb/version.hxx.in
+
+sed -i -e "s/^\(version:\).*/\1 $man_str/" manifest
+sed -i -e "s/^\(depends: \* build2\) .*/\1 >= $build2/" manifest
+sed -i -e "s/^\(depends: \* bpkg\) .*/\1 >= $bpkg/" manifest
+cd ..
+
+for db in mysql sqlite pgsql oracle mssql; do
+ DB=`echo $db | sed -e 's/\(.*\)/\U\1/'`
+ cd libodb-$db
+
+ sed -i -e "s/^\(#define LIBODB_${DB}_VERSION \).*/\1$num/" odb/$db/version.hxx.in
+
+ cd ..
+done
+
+for pr in boost qt; do
+ PR=`echo $pr | sed -e 's/\(.*\)/\U\1/'`
+ cd libodb-$pr
+
+ sed -i -e "s/^\(#define ODB_${PR}_VERSION \).*/\1$profile_num/" odb/$pr/version.hxx.in
+ sed -i -e "s/^\(#define ODB_${PR}_VERSION_STR \).*/\1\"$profile_str\"/" odb/$pr/version.hxx.in
+ sed -i -e "s/^\(#define LIBODB_${PR}_VERSION \).*/\1$num/" odb/$pr/version.hxx.in
+
+ sed -i -e "s/^\(--hxx-prologue '#if ODB_${PR}_VERSION != \).*/\1$profile_num \/\/ $profile_str'/" odb/$pr/version.options
+
+ cd ..
+done
+
+for l in sqlite pgsql mysql oracle mssql boost qt; do
+ cd libodb-$l
+
+ sed -i -e "s/^\(version:\).*/\1 $man_str/" manifest
+ sed -i -e "s/^\(depends: \* build2\) .*/\1 >= $build2/" manifest
+ sed -i -e "s/^\(depends: \* bpkg\) .*/\1 >= $bpkg/" manifest
+
+ cd ..
+done
+
+for t in tests examples; do
+ cd odb-$t
+
+ sed -i -e "s/^\(version:\).*/\1 $man_str/" manifest
+ sed -i -e "s/^\(depends: \* build2\) .*/\1 >= $build2/" manifest
+ sed -i -e "s/^\(depends: \* bpkg\) .*/\1 >= $bpkg/" manifest
+
+ cd ..
+done
+
+cd odb
+sed -i -e "s/^\(#define ODB_VERSION \).*/\1$interface_num/" odb/version.hxx.in
+sed -i -e "s/^\(#define ODB_COMPILER_VERSION_OLD \).*/\1$num/" odb/version.hxx.in
+
+sed -i -e "s/^\(version:\).*/\1 $man_str/" manifest
+sed -i -e "s/^\(depends: \* build2\) .*/\1 >= $build2/" manifest
+sed -i -e "s/^\(depends: \* bpkg\) .*/\1 >= $bpkg/" manifest
+cd ..