#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # next steps: # try running this, figure out what to do with the vars in the generated files # in the bottom # cd into this script’s directory rootdir="$(cd "${0%/*}" 2>/dev/null; echo "$PWD")" basename=`basename $0` PACKAGE_AUTHOR_NAME="The Apache Software Foundation" REBAR3_BRANCH="3.21.0" # TEST=0 WITH_PROPER="true" WITH_FAUXTON=1 WITH_DOCS=1 WITH_NOUVEAU=0 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:-"91"} ARCH="$(uname -m)" 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} display_help () { cat << EOF Usage: $basename [OPTION] The $basename command is responsible for generating the build system for Apache CouchDB. Options: -h | --help display a short help message and exit -u | --user USER set the username to run as (defaults to $COUCHDB_USER) --disable-fauxton do not build Fauxton --disable-docs do not build any documentation or manpages --enable-nouveau enable the new experimental search module --erlang-md5 use erlang for md5 hash operations --dev alias for --disable-docs --disable-fauxton --spidermonkey-version VSN specify the version of SpiderMonkey to use (defaults to $SM_VSN) --skip-deps do not update erlang dependencies --rebar=PATH use rebar by specified path (version >=2.6.0 && <3.0 required) --generate-tls-dev-cert generate a cert for TLS distribution (To enable TLS, change the vm.args file.) --rebar3=PATH use rebar3 by specified path --erlfmt=PATH use erlfmt by specified path EOF } # This is just an example to generate a certfile for TLS distribution. # This is not an endorsement of specific expiration limits, key sizes, or algorithms. generate_tls_dev_cert() { if [ ! -e "${rootdir}/dev/erlserver.pem" ]; then openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem cat key.pem cert.pem > dev/erlserver.pem && rm key.pem cert.pem fi if [ ! -e "${rootdir}/dev/couch_ssl_dist.conf" ]; then cat > "${rootdir}/dev/couch_ssl_dist.conf" << EOF [{server, [{certfile, "${rootdir}/dev/erlserver.pem"}, {secure_renegotiate, true}]}, {client, [{secure_renegotiate, true}]}]. EOF fi } parse_opts() { while :; do case $1 in -h|--help) display_help exit ;; --without-proper) WITH_PROPER="false" shift continue ;; --disable-fauxton) WITH_FAUXTON=0 shift continue ;; --disable-docs) WITH_DOCS=0 shift continue ;; --enable-nouveau) WITH_NOUVEAU=1 shift continue ;; --erlang-md5) ERLANG_MD5="true" shift continue ;; --dev) WITH_DOCS=0 WITH_FAUXTON=0 shift continue ;; --dev-with-nouveau) WITH_DOCS=0 WITH_FAUXTON=0 WITH_NOUVEAU=1 shift continue ;; --skip-deps) SKIP_DEPS=1 shift continue ;; --rebar) if [ -x "$2" ]; then version=`$2 --version 2> /dev/null | grep -o "2\.[6-9]\.[0-9]"` if [ $? -ne 0 ]; then printf 'Rebar >=2.6.0 and <3.0.0 required' >&2 exit 1 fi eval REBAR=$2 shift 2 continue else printf 'ERROR: "--rebar" requires valid path to executable.\n' >&2 exit 1 fi ;; --rebar3) if [ -x "$2" ]; then eval REBAR3=$2 shift 2 continue else printf 'ERROR: "--rebar3" requires valid path to executable.\n' >&2 exit 1 fi ;; --erlfmt) if [ -x "$2" ]; then eval ERLFMT=$2 shift 2 continue else printf 'ERROR: "--erlfmt" requires valid path to executable.\n' >&2 exit 1 fi ;; --user|-u) if [ -n "$2" ]; then eval COUCHDB_USER=$2 shift 2 continue else printf 'ERROR: "--user" requires a non-empty argument.\n' >&2 exit 1 fi ;; --user=?*) eval COUCHDB_USER=${1#*=} ;; --user=) printf 'ERROR: "--user" requires a non-empty argument.\n' >&2 exit 1 ;; --spidermonkey-version) if [ -n "$2" ]; then eval SM_VSN=$2 shift 2 continue else printf 'ERROR: "--spidermonkey-version" requires a non-empty argument.\n' >&2 exit 1 fi ;; --spidermonkey-version=?*) eval SM_VSN=${1#*=} ;; --spidermonkey-version=) printf 'ERROR: "--spidermonkey-version" requires a non-empty argument.\n' >&2 exit 1 ;; --generate-tls-dev-cert) echo "WARNING: To enable TLS distribution, don't forget to customize vm.args file." generate_tls_dev_cert shift continue ;; --) # End of options shift break ;; -?*) echo "WARNING: Unknown option '$1', ignoring" >&2 shift ;; *) # Done break esac shift done } parse_opts $@ 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 % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % % The contents of this file are auto-generated by configure % {package_author_name, "$PACKAGE_AUTHOR_NAME"}. {prefix, "."}. {data_dir, "./data"}. {view_index_dir, "./data"}. {state_dir, "./data"}. {log_file, "$LOG_FILE"}. {fauxton_root, "./share/www"}. {user, "$COUCHDB_USER"}. {spidermonkey_version, "$SM_VSN"}. {node_name, "-name couchdb@127.0.0.1"}. {cluster_port, 5984}. {backend_port, 5986}. {prometheus_port, 17986}. EOF cat > install.mk << EOF # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # # The contents of this file are auto-generated by configure # package_author_name = $PACKAGE_AUTHOR_NAME with_fauxton = $WITH_FAUXTON with_docs = $WITH_DOCS with_nouveau = $WITH_NOUVEAU user = $COUCHDB_USER spidermonkey_version = $SM_VSN EOF cat > $rootdir/config.erl << EOF {with_proper, $WITH_PROPER}. {erlang_md5, $ERLANG_MD5}. {spidermonkey_version, "$SM_VSN"}. EOF install_local_rebar() { if [ ! -x "${rootdir}/bin/rebar" ]; then if [ ! -d "${rootdir}/src/rebar" ]; then git clone --depth 1 https://github.com/apache/couchdb-rebar.git ${rootdir}/src/rebar fi make -C ${rootdir}/src/rebar mv ${rootdir}/src/rebar/rebar ${rootdir}/bin/rebar make -C ${rootdir}/src/rebar clean fi } install_local_rebar3() { if [ ! -x "${rootdir}/bin/rebar3" ]; then if [ ! -d "${rootdir}/src/rebar3" ]; then git clone --depth 1 --branch ${REBAR3_BRANCH} https://github.com/erlang/rebar3.git ${rootdir}/src/rebar3 fi cd src/rebar3 ./bootstrap mv ${rootdir}/src/rebar3/rebar3 ${rootdir}/bin/rebar3 cd ../.. fi } install_local_erlfmt() { if [ ! -x "${rootdir}/bin/erlfmt" ]; then if [ ! -d "${rootdir}/src/erlfmt" ]; then git clone --depth 1 https://github.com/WhatsApp/erlfmt.git ${rootdir}/src/erlfmt fi cd "${rootdir}"/src/erlfmt ${REBAR3} as release escriptize mv ${rootdir}/src/erlfmt/_build/release/bin/erlfmt ${rootdir}/bin/erlfmt ${REBAR3} clean cd ../.. fi } if [ -z "${REBAR}" ]; then install_local_rebar REBAR=${rootdir}/bin/rebar fi if [ -z "${REBAR3}" ]; then install_local_rebar3 REBAR3=${rootdir}/bin/rebar3 fi if [ -z "${ERLFMT}" ]; then install_local_erlfmt ERLFMT=${rootdir}/bin/erlfmt fi # only update dependencies, when we are not in a release tarball if [ -d .git -a $SKIP_DEPS -ne 1 ]; then echo "==> updating dependencies" ${REBAR} get-deps update-deps fi # External repos frequently become integrated with the primary repo, # resulting in obsolete .git directories, and possible confusion. # It is usually a good idea to delete these .git directories. for path in $(find src -name .git -type d); do git ls-files --error-unmatch $(dirname $path) > /dev/null 2>&1 && \ echo "WARNING unexpected .git directory $path" done echo "You have configured Apache CouchDB, time to relax. Relax."