2018-09-19 02:47:27 +03:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
set -euvx
|
|
|
|
|
2018-12-11 23:20:48 +03:00
|
|
|
if [ "$#" -lt 1 -o "$#" -gt 2 ]
|
2018-09-19 02:47:27 +03:00
|
|
|
then
|
|
|
|
echo "Usage:"
|
2018-11-07 02:10:55 +03:00
|
|
|
echo "./build-sqlcipher-desktop.sh <SQLCIPHER_SRC_PATH> [CROSS_COMPILE_TARGET]"
|
2018-09-19 02:47:27 +03:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
SQLCIPHER_SRC_PATH=$1
|
2018-11-07 02:10:55 +03:00
|
|
|
# Whether to cross compile from Linux to a different target. Really
|
|
|
|
# only intended for automation.
|
|
|
|
CROSS_COMPILE_TARGET=${2-}
|
2018-11-02 06:40:29 +03:00
|
|
|
|
2018-11-07 02:10:55 +03:00
|
|
|
if [ -n "$CROSS_COMPILE_TARGET" -a $(uname -s) != "Linux" ]; then
|
|
|
|
echo "Can only cross compile from 'Linux'; 'uname -s' is $(uname -s)"
|
2018-11-02 06:40:29 +03:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2018-11-07 02:10:55 +03:00
|
|
|
if [[ "$CROSS_COMPILE_TARGET" =~ "win32-x86-64" ]]; then
|
|
|
|
SQLCIPHER_DIR=$(abspath "desktop/win32-x86-64/sqlcipher")
|
|
|
|
OPENSSL_DIR=$(abspath "desktop/win32-x86-64/openssl")
|
|
|
|
elif [[ "$CROSS_COMPILE_TARGET" =~ "darwin" ]]; then
|
2018-11-02 06:40:29 +03:00
|
|
|
SQLCIPHER_DIR=$(abspath "desktop/darwin/sqlcipher")
|
|
|
|
OPENSSL_DIR=$(abspath "desktop/darwin/openssl")
|
2018-11-07 02:10:55 +03:00
|
|
|
elif [ -n "$CROSS_COMPILE_TARGET" ]; then
|
|
|
|
echo "Cannot build SQLCipher for unrecognized target OS $CROSS_COMPILE_TARGET"
|
|
|
|
exit 1
|
2018-11-02 06:40:29 +03:00
|
|
|
elif [ $(uname -s) == "Darwin" ]; then
|
|
|
|
SQLCIPHER_DIR=$(abspath "desktop/darwin/sqlcipher")
|
|
|
|
OPENSSL_DIR=$(abspath "desktop/darwin/openssl")
|
|
|
|
elif [ $(uname -s) == "Linux" ]; then
|
|
|
|
# This is a JNA weirdness: "x86-64" rather than "x86_64".
|
|
|
|
SQLCIPHER_DIR=$(abspath "desktop/linux-x86-64/sqlcipher")
|
|
|
|
OPENSSL_DIR=$(abspath "desktop/linux-x86-64/openssl")
|
|
|
|
else
|
|
|
|
echo "Cannot build SQLcipher on unrecognized host OS $(uname -s)"
|
|
|
|
exit 1
|
|
|
|
fi
|
2018-09-19 02:47:27 +03:00
|
|
|
|
|
|
|
if [ -d "$SQLCIPHER_DIR" ]; then
|
|
|
|
echo "$SQLCIPHER_DIR folder already exists. Skipping build."
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "# Building sqlcipher"
|
|
|
|
|
2018-10-15 23:45:22 +03:00
|
|
|
# Keep in sync with SQLCIPHER_CFLAGS in `build-sqlcipher-desktop.sh` for now (it probably makes
|
|
|
|
# sense to try to avoid this duplication in the future).
|
|
|
|
# TODO: We could probably prune some of these, and it would be nice to allow debug builds (which
|
|
|
|
# should set `SQLITE_DEBUG` and `SQLITE_ENABLE_API_ARMOR` and not `NDEBUG`).
|
2018-09-19 02:47:27 +03:00
|
|
|
SQLCIPHER_CFLAGS=" \
|
|
|
|
-DSQLITE_HAS_CODEC \
|
|
|
|
-DSQLITE_SOUNDEX \
|
|
|
|
-DHAVE_USLEEP=1 \
|
|
|
|
-DSQLITE_MAX_VARIABLE_NUMBER=99999 \
|
|
|
|
-DSQLITE_THREADSAFE=1 \
|
|
|
|
-DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
|
|
|
|
-DNDEBUG=1 \
|
|
|
|
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 \
|
|
|
|
-DSQLITE_ENABLE_LOAD_EXTENSION \
|
|
|
|
-DSQLITE_ENABLE_COLUMN_METADATA \
|
|
|
|
-DSQLITE_ENABLE_UNLOCK_NOTIFY \
|
|
|
|
-DSQLITE_ENABLE_RTREE \
|
|
|
|
-DSQLITE_ENABLE_STAT3 \
|
|
|
|
-DSQLITE_ENABLE_STAT4 \
|
|
|
|
-DSQLITE_ENABLE_JSON1 \
|
|
|
|
-DSQLITE_ENABLE_FTS3_PARENTHESIS \
|
|
|
|
-DSQLITE_ENABLE_FTS4 \
|
|
|
|
-DSQLITE_ENABLE_FTS5 \
|
|
|
|
-DSQLCIPHER_CRYPTO_OPENSSL \
|
2018-10-15 23:45:22 +03:00
|
|
|
-DSQLITE_ENABLE_DBSTAT_VTAB \
|
|
|
|
-DSQLITE_SECURE_DELETE=1 \
|
|
|
|
-DSQLITE_DEFAULT_PAGE_SIZE=32768 \
|
|
|
|
-DSQLITE_MAX_DEFAULT_PAGE_SIZE=32768 \
|
2018-09-19 02:47:27 +03:00
|
|
|
"
|
|
|
|
|
|
|
|
rm -rf "$SQLCIPHER_SRC_PATH/build-desktop"
|
|
|
|
mkdir -p "$SQLCIPHER_SRC_PATH/build-desktop/install-prefix"
|
|
|
|
pushd "$SQLCIPHER_SRC_PATH/build-desktop"
|
|
|
|
|
2018-10-31 01:46:36 +03:00
|
|
|
make clean || true
|
2018-09-19 02:47:27 +03:00
|
|
|
|
2018-11-02 06:40:29 +03:00
|
|
|
# Why `--with-pic --enable-shared`? We're doing unusual things. By
|
|
|
|
# default, libtool builds a static library (.a) with a non-PIC .o, and
|
|
|
|
# a shared library (.so, say) with a PIC .o. We want to compile PIC
|
|
|
|
# .o files for use in subsequent compilations and wrap them in a .a.
|
|
|
|
# We achieve that by forcing PIC (even for the .a) and disabling the
|
|
|
|
# shared library (.so) entirely.
|
|
|
|
|
2018-11-07 02:10:55 +03:00
|
|
|
if [[ "$CROSS_COMPILE_TARGET" =~ "darwin" ]]; then
|
2018-11-02 06:40:29 +03:00
|
|
|
export CC=/tmp/clang/bin/clang
|
|
|
|
|
|
|
|
export AR=/tmp/cctools/bin/x86_64-apple-darwin11-ar
|
|
|
|
export RANLIB=/tmp/cctools/bin/x86_64-apple-darwin11-ranlib
|
|
|
|
export STRIP=/tmp/cctools/bin/x86_64-apple-darwin11-strip
|
|
|
|
export LIBTOOL=/tmp/cctools/bin/x86_64-apple-darwin11-libtool
|
|
|
|
export NM=/tmp/cctools/bin/x86_64-apple-darwin11-nm
|
|
|
|
export LD=/tmp/cctools/bin/x86_64-apple-darwin11-ld
|
|
|
|
|
|
|
|
export CFLAGS='-B /tmp/cctools/bin -target x86_64-apple-darwin11 -mlinker-version=137 -isysroot /tmp/MacOSX10.11.sdk -I/tmp/MacOSX10.11.sdk/usr/include -iframework /tmp/MacOSX10.11.sdk/System/Library/Frameworks'
|
|
|
|
export LDFLAGS='-B /tmp/cctools/bin -Wl,-syslibroot,/tmp/MacOSX10.11.sdk -Wl,-dead_strip'
|
|
|
|
# This is crucial. Without this, libtool drops the `-target ...`
|
|
|
|
# flags from the clang compiler linker driver invocation, resulting
|
|
|
|
# in clang choosing a random system `ld` rather than the macOS
|
|
|
|
# linker from the cctools port.
|
|
|
|
export LTLINK_EXTRAS='-XCClinker -target -XCClinker x86_64-apple-darwin11 -XCClinker -B -XCClinker /tmp/cctools/bin'
|
|
|
|
|
|
|
|
# See https://searchfox.org/mozilla-central/rev/8848b9741fc4ee4e9bc3ae83ea0fc048da39979f/build/macosx/cross-mozconfig.common#12-13.
|
|
|
|
export LD_LIBRARY_PATH=/tmp/clang/lib
|
|
|
|
|
|
|
|
../configure --prefix="$PWD/install-prefix" \
|
|
|
|
--with-pic \
|
|
|
|
--disable-shared \
|
|
|
|
--host=x86_64-apple-darwin \
|
|
|
|
--with-crypto-lib=none \
|
|
|
|
--disable-tcl \
|
|
|
|
--enable-tempstore=yes \
|
|
|
|
CFLAGS="${CFLAGS} ${SQLCIPHER_CFLAGS} -I${OPENSSL_DIR}/include -L${OPENSSL_DIR}/lib" \
|
|
|
|
LDFLAGS="${LDFLAGS} -L${OPENSSL_DIR}/lib" \
|
|
|
|
LIBS="-lcrypto"
|
2018-11-07 02:10:55 +03:00
|
|
|
elif [[ "$CROSS_COMPILE_TARGET" =~ "win32-x86-64" ]]; then
|
|
|
|
|
|
|
|
pushd ..
|
|
|
|
|
|
|
|
# From https://github.com/qTox/qTox/blob/9525505bff8719c84b6193174ea5e7ec097c54b8/windows/cross-compile/build.sh#L390-L446.
|
|
|
|
sed -i s/'if test "$TARGET_EXEEXT" = ".exe"'/'if test ".exe" = ".exe"'/g configure
|
|
|
|
|
2018-12-05 19:34:43 +03:00
|
|
|
# Can't quite figure out what to tell ./configure so that it gets the picture
|
|
|
|
# here (it doesn't seem to handle host/build/target args correctly)... Oh well,
|
|
|
|
# this is a bit of a sledgehammer but does the job.
|
|
|
|
sed -i s/'BEXE = @BUILD_EXEEXT@'/'BEXE = ""'/g Makefile.in
|
|
|
|
|
2018-11-07 02:10:55 +03:00
|
|
|
> Makefile.in-patch cat << "EOF"
|
|
|
|
--- Makefile.in 2017-12-21 19:31:28.000000000 +0000
|
|
|
|
+++ Makefile.in 2018-11-06 23:58:45.576548000 +0000
|
|
|
|
@@ -1092,9 +1092,9 @@
|
|
|
|
$(TOP)/ext/fts5/fts5_unicode2.c \
|
|
|
|
$(TOP)/ext/fts5/fts5_varint.c \
|
|
|
|
$(TOP)/ext/fts5/fts5_vocab.c \
|
|
|
|
|
|
|
|
-fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon
|
|
|
|
+fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon$(BEXE)
|
|
|
|
cp $(TOP)/ext/fts5/fts5parse.y .
|
|
|
|
rm -f fts5parse.h
|
|
|
|
./lemon$(BEXE) $(OPTS) fts5parse.y
|
|
|
|
EOF
|
|
|
|
|
|
|
|
patch --forward --ignore-whitespace < Makefile.in-patch
|
|
|
|
popd
|
|
|
|
|
|
|
|
../configure --prefix="$PWD/install-prefix" \
|
|
|
|
--with-pic \
|
|
|
|
--disable-shared \
|
2018-12-05 19:34:43 +03:00
|
|
|
--build=x86_64 \
|
2018-11-07 02:10:55 +03:00
|
|
|
--host=x86_64-w64-mingw32 \
|
2018-12-05 19:34:43 +03:00
|
|
|
--target=x86_64-w64-mingw32 \
|
2018-11-07 02:10:55 +03:00
|
|
|
--enable-tempstore=yes \
|
|
|
|
--with-crypto-lib=none \
|
|
|
|
--disable-tcl \
|
|
|
|
CFLAGS="${SQLCIPHER_CFLAGS} -I${OPENSSL_DIR}/include -L${OPENSSL_DIR}/lib" \
|
|
|
|
LDFLAGS="-L${OPENSSL_DIR}/lib" \
|
2018-12-14 21:19:11 +03:00
|
|
|
LIBS="-llibcrypto -lgdi32 -lws2_32"
|
2018-11-02 06:40:29 +03:00
|
|
|
elif [ $(uname -s) == "Darwin" ]; then
|
2018-10-31 01:46:36 +03:00
|
|
|
../configure --prefix="$PWD/install-prefix" \
|
2018-11-02 06:40:29 +03:00
|
|
|
--with-pic \
|
|
|
|
--disable-shared \
|
2018-10-31 01:46:36 +03:00
|
|
|
--enable-tempstore=yes \
|
2018-11-02 06:40:29 +03:00
|
|
|
--with-crypto-lib=none \
|
|
|
|
--disable-tcl \
|
2018-10-31 01:46:36 +03:00
|
|
|
CFLAGS="${SQLCIPHER_CFLAGS} -I${OPENSSL_DIR}/include -L${OPENSSL_DIR}/lib" \
|
2018-11-02 06:40:29 +03:00
|
|
|
LDFLAGS="-L${OPENSSL_DIR}/lib" \
|
|
|
|
LIBS="-lcrypto"
|
2018-10-31 01:46:36 +03:00
|
|
|
elif [ $(uname -s) == "Linux" ]; then
|
|
|
|
../configure --prefix="$PWD/install-prefix" \
|
2018-11-02 06:40:29 +03:00
|
|
|
--with-pic \
|
|
|
|
--disable-shared \
|
2018-10-31 01:46:36 +03:00
|
|
|
--enable-tempstore=yes \
|
2018-11-02 06:40:29 +03:00
|
|
|
--with-crypto-lib=none \
|
|
|
|
--disable-tcl \
|
2018-10-31 01:46:36 +03:00
|
|
|
CFLAGS="${SQLCIPHER_CFLAGS} -I${OPENSSL_DIR}/include -L${OPENSSL_DIR}/lib" \
|
2018-11-02 06:40:29 +03:00
|
|
|
LDFLAGS="-L${OPENSSL_DIR}/lib" \
|
2018-12-14 21:19:11 +03:00
|
|
|
LIBS="-lcrypto -ldl -lm -lpthread"
|
2018-10-31 01:46:36 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
make -j6
|
|
|
|
make install
|
2018-09-19 02:47:27 +03:00
|
|
|
|
|
|
|
mkdir -p "$SQLCIPHER_DIR/lib"
|
|
|
|
cp -r "install-prefix/include" "$SQLCIPHER_DIR"
|
|
|
|
cp -p "install-prefix/lib/libsqlcipher.a" "$SQLCIPHER_DIR/lib/libsqlcipher.a"
|
|
|
|
|
|
|
|
chmod +w "$SQLCIPHER_DIR/lib/libsqlcipher.a"
|
|
|
|
|
2018-11-07 02:10:55 +03:00
|
|
|
if [[ "$CROSS_COMPILE_TARGET" =~ "win32-x86-64" ]]; then
|
|
|
|
mv "$SQLCIPHER_DIR/lib/libsqlcipher.a" "$SQLCIPHER_DIR/lib/sqlcipher.lib"
|
|
|
|
fi
|
|
|
|
|
2018-09-19 02:47:27 +03:00
|
|
|
popd
|