Skip to content

Commit

Permalink
chore(configure): be more defensive about SpiderMonkey location (#4407)
Browse files Browse the repository at this point in the history
The `configure` script does not check whether SpiderMonkey
actually exists at the presumed location.  This may go wrong when
the user has a version different from the default one.  The
mistake is spotted only in build time, indirectly, via missing
header files.  That is too late and it may not be evident for the
user what the problem is.

Add a user-friendly safeguard to prevent this from happening.
  • Loading branch information
pgj committed Jan 27, 2023
1 parent f3baedc commit d42531b
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 3 deletions.
28 changes: 25 additions & 3 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,15 @@ WITH_DOCS=1
ERLANG_MD5="false"
SKIP_DEPS=0

run_erlang() {
erl -noshell -eval "$1" -eval "halt()."
}

COUCHDB_USER="$(whoami 2>/dev/null || echo couchdb)"
SM_VSN=${SM_VSN:-"1.8.5"}
ARCH="$(uname -m)"
ERLANG_VER="$(erl -eval 'io:put_chars(erlang:system_info(otp_release)), halt().' -noshell)"
ERLANG_VER="$(run_erlang 'io:put_chars(erlang:system_info(otp_release)).')"
ERLANG_OS="$(run_erlang 'case os:type() of {OS, _} -> io:format("~s~n", [OS]) end.')"

. ${rootdir}/version.mk
COUCHDB_VERSION=${vsn_major}.${vsn_minor}.${vsn_patch}
Expand Down Expand Up @@ -224,12 +229,29 @@ parse_opts() {

parse_opts $@

if [ "${ARCH}" = "aarch64" ] && [ "${SM_VSN}" = "60" ]
then
if [ "${ARCH}" = "aarch64" ] && [ "${SM_VSN}" = "60" ]; then
echo "ERROR: SpiderMonkey 60 is known broken on ARM 64 (aarch64). Use another version instead."
exit 1
fi

if [ "${ERLANG_OS}" = "unix" ]; then
case "${SM_VSN}" in
1.8.5)
SM_HEADERS="js"
;;
*) SM_HEADERS="mozjs-${SM_VSN}"
;;
esac

# This list is taken from src/couch/rebar.config.script, please keep them in sync.
if [ ! -d "/usr/include/${SM_HEADERS}" ] && \
[ ! -d "/usr/local/include/${SM_HEADERS}" ] && \
[ ! -d "/opt/homebrew/include/${SM_HEADERS}" ]; then
echo "ERROR: SpiderMonkey ${SM_VSN} is not found. Please specify with --spidermonkey-version."
exit 1
fi
fi

echo "==> configuring couchdb in rel/couchdb.config"
cat > rel/couchdb.config << EOF
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
Expand Down
16 changes: 16 additions & 0 deletions configure.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,22 @@ If ($Test) {
exit 0
}

# Use the MSVC linker to determine if the respective SpiderMonkey library
# is available on the linker path. This heuristic is taken from
# src/couch/rebar.config.script, please keep them in sync.
If ($SpiderMonkeyVersion -eq "1.8.5") {
$SpiderMonkeyLib = "mozjs185-1.0.lib"
}
else {
$SpiderMonkeyLib = "mozjs-$SpiderMonkeyVersion.lib"
}

&link $SpiderMonkeyLib /SUBSYSTEM:CONSOLE /NOENTRY /DLL /OUT:NUL *> $null
If ($LASTEXITCODE -ne 0) {
Write-Output "ERROR: SpiderMonkey $SpiderMonkeyVersion is not found. Please specify with -SpiderMonkeyVersion."
exit 1
}

# Translate ./configure variables to CouchDB variables
$PackageAuthorName="The Apache Software Foundation"
$InstallDir="$LibDir\couchdb"
Expand Down
3 changes: 3 additions & 0 deletions src/couch/rebar.config.script
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ ProperConfig = case code:lib_dir(proper) of
_ -> [{d, 'WITH_PROPER'}]
end.

% The include directories (parameters for the `-I` C compiler flag) are
% considered in the `configure` script as a pre-check for their existence.
% Please keep them in sync.
{JS_CFLAGS, JS_LDFLAGS} = case os:type() of
{win32, _} when SMVsn == "1.8.5" ->
{
Expand Down

0 comments on commit d42531b

Please sign in to comment.