summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Shombert <shombert@google.com>2024-03-14 14:16:21 -0700
committerLee Shombert <shombert@google.com>2024-03-15 14:00:25 -0700
commit83b3ba2542f1ae242315a2c28e8d2e7c5deef7b9 (patch)
tree2ae8ac923bc7db74ebee4f84650b50c671445754
parent3ab942d94e3cc8535fc0892d38e35b1f3384f5d2 (diff)
downloadsqlite-83b3ba2542f1ae242315a2c28e8d2e7c5deef7b9.tar.gz
Allow multiple releases of sqlite
This change allows the build system to hold multiple versions of the sqlite library. This change only allows the multiple versions to be stored concurrently. It does not change the build process. A sqlite version is stored in the directory dist/<year>/<tarball-name> under external/sqlite. This naming corresponds to how tarballs are saved on sqlite.org. Note that the year of the release is important. To create a new sqlite version for 3.42.0 (created in 2023): cd external/sqlite ./UPDATE-SOURCE.bash 2023 3.42.0 The update process downloads the sqlite source and applies the Android.patch file. If the patch is not clean, fix the sqlite files by hand, regenerate the patch file, and rerun the update-source command: ./REBUILD-ANDROID-PATCH.bash 2023 3.44.2 ./UPDATE-SOURCE.bash 2023 3.42.0 The patch should apply cleanly. Test: manual inspection Bug: 323176655 Change-Id: If3274df1039413b4aca7e78fe50b6dfe6c7a9481
-rw-r--r--README-upgrade.md9
-rwxr-xr-xREBUILD-ANDROID-PATCH.bash44
-rwxr-xr-xUPDATE-SOURCE.bash118
3 files changed, 135 insertions, 36 deletions
diff --git a/README-upgrade.md b/README-upgrade.md
index fc93cf5..951bb37 100644
--- a/README-upgrade.md
+++ b/README-upgrade.md
@@ -13,19 +13,20 @@ external/sqlite
The upgrade steps are:
-* Select a version for the upgrade.
+* Select a version for the upgrade. Note the year it was released by sqlite.org.
* Find the autoconf amalgamation tarball. For release 3.42.0, the URL is
[sqlite-autoconf-3420000.tar.gz](https://sqlite.org/2023/sqlite-autoconf-3420000.tar.gz).
* Change to the directory `external/sqlite` in the workspace.
* Run the script `UPDATE-SOURCE.bash`. This script is executable. The
- arguments are the tarball URL and the version. Invoke the script without
+ arguments are the sqlite release year and the version. Invoke the script without
arguments for an example.
`UPDATE-SOURCE.bash` may fail if the Android patch cannot be applied cleanly. If
this happens, correct the patch failures by hand and rebuild the Android patch
file. Use the script `REBUILD-ANDROID-PATCH.bash` to rebuild the patch file.
-Then rerun `UPDATE-SOURCE.bash`. It is important that `UPDATE-SOURCE.bash` run
-without errors.
+This script takes the same arguments as `UPDATE-SOURCE.bash`. Then rerun
+`UPDATE-SOURCE.bash`. It is important that `UPDATE-SOURCE.bash` run without
+errors.
## LICENSE
diff --git a/REBUILD-ANDROID-PATCH.bash b/REBUILD-ANDROID-PATCH.bash
index 734e296..53d0990 100755
--- a/REBUILD-ANDROID-PATCH.bash
+++ b/REBUILD-ANDROID-PATCH.bash
@@ -16,7 +16,7 @@
# This script updates SQLite source files with a SQLite tarball.
#
-# Usage: REBUILD-ANDROID_PATCH.bash
+# Usage: REBUILD-ANDROID_PATCH.bash <release>
#
# This script must be executed in $ANDROID_BUILD_TOP/external/sqlite/
#
@@ -24,9 +24,7 @@
set -e
script_name="$(basename "$0")"
-
-source_tgz="$1"
-source_ext_dir="$1.extracted"
+script_dir=$(dirname $(realpath ${BASH_SOURCE[0]}))
die() {
echo "$script_name: $*"
@@ -38,20 +36,38 @@ echo_and_exec() {
"$@"
}
-# Make sure the source tgz file exists.
-pwd="$(pwd)"
-if [[ ! "$pwd" =~ .*/external/sqlite/? ]] ; then
- die 'Execute this script in $ANDROID_BUILD_TOP/external/sqlite/'
-fi
+# This function converts a release string like "3.42.0" to the canonical 7-digit
+# format used by sqlite.org for downloads: "3420000". A hypothetical release
+# number of 3.45.6 is converted to "3450600". A hypothetical release number of
+# 3.45.17 is converted to "3451700". The last two digits are assumed to be
+# "00" for now, as there are no known counter-examples.
+function normalize_release {
+ local version=$1
+ local -a fields
+ fields=($(echo "$version" | sed 's/\./ /g'))
+ if [[ ${#fields[*]} -lt 2 || ${#fields[*]} -gt 3 ]]; then
+ echo "cannot parse version: $version"
+ return 1
+ elif [[ ${#fields[*]} -eq 2 ]]; then
+ fields+=(0)
+ fi
+ printf "%d%02d%02d00" ${fields[*]}
+ return 0
+}
-# No parameters are permitted
-if [[ ! $# -eq 0 ]]; then
- die "Unexpected arguments on the command line"
+if [[ $# -lt 1 ]]; then
+ die "missing required arguments"
+elif [[ $# -gt 1 ]]; then
+ die "extra arguments on command line"
fi
+sqlite_release=$(normalize_release "$1") || die "invalid release"
+sqlite_base="sqlite-autoconf-${sqlite_release}"
+export patch_dir=${script_dir}/dist
echo
echo "# Regenerating Android.patch ..."
(
- cd dist
+ cd dist/$sqlite_base || die "release directory not found"
echo_and_exec bash -c '(for x in orig/*; do diff -u -d $x ${x#orig/}; done) > Android.patch'
-)
+ echo_and_exec cp Android.patch ${patch_dir}/
+)
diff --git a/UPDATE-SOURCE.bash b/UPDATE-SOURCE.bash
index fdd9093..24e3a1a 100755
--- a/UPDATE-SOURCE.bash
+++ b/UPDATE-SOURCE.bash
@@ -14,23 +14,32 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# This script updates SQLite source files with a SQLite tarball.
+# This script updates SQLite source files with a SQLite tarball. The tarball is
+# downloaded from the sqlite website.
#
-# Usage: UPDATE-SOURCE.bash SQLITE-SOURCE.tgz
+# Usage: UPDATE-SOURCE.bash [-nF] <year> <sqlite-release>
#
-# This script must be executed in $ANDROID_BUILD_TOP/external/sqlite/
+# This script must be executed in $ANDROID_BUILD_TOP/external/sqlite/. However,
+# for testing it can run anywhere: use the -F switch.
#
set -e
script_name="$(basename "$0")"
-
-if [ $# -eq 0 ]; then
- echo "Usage: ${script_name} [src_tarball_url] [sqlite_version]"
+script_dir=$(dirname $(realpath ${BASH_SOURCE[0]}))
+
+usage() {
+ if [[ $# -gt 0 ]]; then echo "$*" >&2; fi
+ echo "Usage: ${script_name} -nF <year> <version>"
+ echo " year the 4-digit year the sqlite version was released"
+ echo " version the sqlite version as <major>.<minor>[.<patch>]"
+ echo " the patch level defaults to 0"
+ echo " -n dry-run: evaluate arguments but d not change anything"
+ echo " -F force execution even if not in external/sqlite"
+ echo
echo "Example:"
- echo "${script_name} https://sqlite.org/2023/sqlite-autoconf-3420000.tar.gz 3.42.0"
- exit 1
-fi
+ echo "${script_name} 2023 3.42"
+}
die() {
echo "$script_name: $*"
@@ -42,20 +51,89 @@ echo_and_exec() {
"$@"
}
+validate_year() {
+ local year=$1
+ if [[ "$year" =~ ^2[0-9][0-9][0-9]$ ]]; then
+ return 0;
+ else
+ return 1;
+ fi
+}
+
+# This function converts a release string like "3.42.0" to the canonical 7-digit
+# format used by sqlite.org for downloads: "3420000". A hypothetical release
+# number of 3.45.6 is converted to "3450600". A hypothetical release number of
+# 3.45.17 is converted to "3451700". The last two digits are assumed to be
+# "00" for now, as there are no known counter-examples.
+function normalize_release {
+ local version=$1
+ local -a fields
+ fields=($(echo "$version" | sed 's/\./ /g'))
+ if [[ ${#fields[*]} -lt 2 || ${#fields[*]} -gt 3 ]]; then
+ echo "cannot parse version: $version"
+ return 1
+ elif [[ ${#fields[*]} -eq 2 ]]; then
+ fields+=(0)
+ fi
+ printf "%d%02d%02d00" ${fields[*]}
+ return 0
+}
+
+function prettify_release {
+ local version=$1
+ local patch=$((version % 100))
+ version=$((version / 100))
+ local minor=$((version % 100))
+ version=$((version / 100))
+ local major=$((version % 100))
+ version=$((version / 100))
+ # version now contains the generation number.
+ printf "%d.%d.%d" $version $major $minor
+}
+
+dry_run=
+force=
+while getopts "hnF" option; do
+ case $option in
+ h) usage; exit 0;;
+ n) dry_run=y;;
+ F) force=y;;
+ *) usage "unknown switch"; exit 1;;
+ esac
+done
+shift $((OPTIND- 1))
+
+if [[ $# -lt 2 ]]; then
+ usage; die "missing required arguments"
+elif [[ $# -gt 2 ]]; then
+ die "extra arguments on command line"
+fi
+year=$1
+validate_year "$year" || die "invalid year"
+sqlite_release=$(normalize_release "$2") || die "invalid release"
+
+sqlite_base="sqlite-autoconf-${sqlite_release}"
+sqlite_file="${sqlite_base}.tar.gz"
+src_tarball_url="https://www.sqlite.org/$year/${sqlite_file}"
+
+if [[ -n $dry_run ]]; then
+ echo "fetching $src_tarball_url"
+ echo "installing in dist/$sqlite_base"
+ exit 0
+fi
+
pwd="$(pwd)"
-if [[ ! "$pwd" =~ .*/external/sqlite/? ]] ; then
+if [[ -z $force && ! "$pwd" =~ .*/external/sqlite/? ]] ; then
die 'Execute this script in $ANDROID_BUILD_TOP/external/sqlite/'
fi
-src_tarball_url="$1"
-sqlite_version="$2"
-
-source_tgz=$(mktemp /tmp/sqlite-${sqlite_version}.zip.XXXXXX)
+source_tgz=$(mktemp /tmp/sqlite-${sqlite_release}.zip.XXXXXX)
+source_ext_dir="${source_tgz}.extracted"
+trap "rm -r ${source_tgz} ${source_ext_dir}" EXIT
wget ${src_tarball_url} -O ${source_tgz}
echo
echo "# Extracting the source tgz..."
-source_ext_dir="${source_tgz}.extracted"
echo_and_exec rm -fr "$source_ext_dir"
echo_and_exec mkdir -p "$source_ext_dir"
echo_and_exec tar xvf "$source_tgz" -C "$source_ext_dir" --strip-components=1
@@ -68,20 +146,23 @@ echo "# Making file sqlite3.c in $source_ext_dir ..."
echo_and_exec make -j 4 sqlite3.c
)
-dist_dir="dist-${sqlite_version}"
+export dist_dir="dist/${sqlite_base}"
echo
echo "# Copying the source files ..."
+echo_and_exec rm -rf ${dist_dir}
echo_and_exec mkdir -p "${dist_dir}"
echo_and_exec mkdir -p "${dist_dir}/orig"
for to in ${dist_dir}/orig/ ${dist_dir}/ ; do
echo_and_exec cp "$source_ext_dir/"{shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h} "$to"
done
+export patch_dir=${script_dir}/dist
echo
echo "# Applying Android.patch ..."
(
cd ${dist_dir}
- echo_and_exec patch -i ../Android.patch
+ echo "PATCHING IN $dist_dir" >&2
+ echo_and_exec patch -i ${patch_dir}/Android.patch
)
echo
@@ -89,13 +170,14 @@ echo "# Regenerating Android.patch ..."
(
cd ${dist_dir}
echo_and_exec bash -c '(for x in orig/*; do diff -u -d $x ${x#orig/}; done) > Android.patch'
+ echo_and_exec cp Android.patch ${patch_dir}/
)
echo
echo "# Generating metadata ..."
(
export SQLITE_URL=${src_tarball_url}
- export SQLITE_VERSION=${sqlite_version}
+ export SQLITE_VERSION=$(prettify_release ${sqlite_release})
export YEAR=$(date +%Y)
export MONTH=$(date +%M)
export DAY=$(date +%D)