summaryrefslogtreecommitdiffstats
path: root/configure
diff options
context:
space:
mode:
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure202
1 files changed, 151 insertions, 51 deletions
diff --git a/configure b/configure
index d42dec3..7f0bd04 100755
--- a/configure
+++ b/configure
@@ -7,24 +7,16 @@
set -eu
-# Default to `make`
-MAKE="${MAKE:-make}"
-
-# Pass -j$(nproc) unless MAKEFLAGS is set
-if [ "${MAKEFLAGS+y}" ]; then
- j=""
-else
- j="-j$({ nproc || sysctl -n hw.ncpu || getconf _NPROCESSORS_ONLN || echo 1; } 2>/dev/null)"
-fi
+# Get the relative path to the source tree based on how the script was run
+DIR=$(dirname -- "$0")
-for arg; do
- case "$arg" in
- -h|--help)
- cat <<EOF
+# Print the help message
+help() {
+ cat <<EOF
Usage:
- \$ $0 [--enable-*|--disable-*] [CC=...] [CFLAGS=...] [...]
- \$ $MAKE $j
+ \$ $0 [--enable-*|--disable-*] [--with-*|--without-*] [CC=...] [...]
+ \$ $MAKE -j$(_nproc)
Variables set in the environment or on the command line will be picked up:
@@ -53,85 +45,193 @@ The default flags result in a plain debug build. Other build profiles include:
--enable-gcov
Enable code coverage instrumentation
-External dependencies are auto-detected by default, but you can --enable or
---disable them manually:
+External dependencies are auto-detected by default, but you can build --with or
+--without them explicitly:
- --enable-libacl --disable-libacl
- --enable-libcap --disable-libcap
- --enable-libselinux --disable-libselinux
- --enable-liburing --disable-liburing
- --enable-oniguruma --disable-oniguruma
+ --with-libacl --without-libacl
+ --with-libcap --without-libcap
+ --with-libselinux --without-libselinux
+ --with-liburing --without-liburing
+ --with-oniguruma --without-oniguruma
Packaging:
--prefix=/path
Set the installation prefix (default: /usr)
+ --mandir=/path
+ Set the man page directory (default: \$PREFIX/share/man)
+ --version=X.Y.Z
+ Set the version string (default: $("$DIR/build/version.sh"))
This script is a thin wrapper around a makefile-based configuration system.
Any other arguments will be passed directly to the $MAKE invocation, e.g.
- \$ $0 $j V=1
+ \$ $0 -j$(_nproc) V=1
EOF
- exit 0
+}
+
+# Report a warning
+warn() {
+ fmt="$1"
+ shift
+ printf "%s: warning: $fmt\\n" "$0" "$@" >&2
+}
+
+# Report an argument parsing error
+invalid() {
+ printf '%s: error: Unrecognized option "%s"\n\n' "$0" "$1" >&2
+ printf 'Run %s --help for more information.\n' "$0" >&2
+ exit 1
+}
+
+# Get the number of cores to use
+_nproc() {
+ {
+ nproc \
+ || sysctl -n hw.ncpu \
+ || getconf _NPROCESSORS_ONLN \
+ || echo 1
+ } 2>/dev/null
+}
+
+# Save the ./configure command line for bfs --version
+export CONFFLAGS=""
+
+# Default to `make`
+MAKE="${MAKE-make}"
+
+# Parse the command-line arguments
+for arg; do
+ shift
+
+ # Only add --options to CONFFLAGS, so we don't print FLAG=values twice in bfs --version
+ case "$arg" in
+ -*)
+ CONFFLAGS="${CONFFLAGS}${CONFFLAGS:+ }${arg}"
;;
+ esac
- --enable-*|--disable-*)
+ # --[(enable|disable|with|without)-]$name[=$value]
+ value="${arg#*=}"
+ name="${arg%%=*}"
+ name="${name#--}"
+ case "$arg" in
+ --enable-*|--disable-*|--with-*|--without-*)
+ name="${name#*-}"
+ ;;
+ esac
+ NAME=$(printf '%s' "$name" | tr 'a-z-' 'A-Z_')
+
+ # y/n modality
+ case "$arg" in
+ --enable-*|--with-*)
+ case "$arg" in
+ *=y|*=yes) yn=y ;;
+ *=n|*=no) yn=n ;;
+ *=*) invalid "$arg" ;;
+ *) yn=y ;;
+ esac
+ ;;
+ --disable-*|--without-*)
case "$arg" in
- --enable-*) yn=y ;;
- --disable-*) yn=n ;;
+ *=*) invalid "arg" ;;
+ *) yn=n ;;
esac
+ ;;
+ esac
- name="${arg#--*able-}"
- NAME=$(printf '%s' "$name" | tr 'a-z-' 'A-Z_')
+ # Fix up --enable-lib* to --with-lib*
+ case "$arg" in
+ --enable-*|--disable-*)
case "$name" in
libacl|libcap|libselinux|liburing|oniguruma)
- shift
- set -- "$@" "USE_$NAME=$yn"
+ old="$arg"
+ case "$arg" in
+ --enable-*) arg="--with-${arg#--*-}" ;;
+ --disable-*) arg="--without-${arg#--*-}" ;;
+ esac
+ warn 'Treating "%s" like "%s"' "$old" "$arg"
;;
- release|asan|lsan|msan|tsan|ubsan|lint|gcov)
- shift
+ esac
+ ;;
+ esac
+
+ case "$arg" in
+ -h|--help)
+ help
+ exit 0
+ ;;
+
+ --enable-*|--disable-*)
+ case "$name" in
+ release|lto|asan|lsan|msan|tsan|ubsan|lint|gcov)
set -- "$@" "$NAME=$yn"
;;
*)
- printf 'error: Unrecognized option "%s"\n\n' "$arg" >&2
- printf 'Run %s --help for more information.\n' "$0" >&2
- exit 1
+ invalid "$arg"
;;
esac
;;
- --prefix=*)
- shift
- set -- "$@" "PREFIX=${arg#*=}"
+ --with-*|--without-*)
+ case "$name" in
+ libacl|libcap|libselinux|liburing|oniguruma)
+ set -- "$@" "WITH_$NAME=$yn"
+ ;;
+ *)
+ invalid "$arg"
+ ;;
+ esac
+ ;;
+
+ --prefix=*|--mandir=*|--version=*)
+ set -- "$@" "$NAME=$value"
+ ;;
+
+ --infodir=*|--build=*|--host=*|--target=*)
+ warn 'Ignoring option "%s"' "$arg"
;;
MAKE=*)
- MAKE="${arg#*=}"
- shift
+ MAKE="$value"
+ ;;
+
+ # Warn about MAKE variables that have documented configure flags
+ RELEASE=*|LTO=*|ASAN=*|LSAN=*|MSAN=*|TSAN=*|UBSAN=*|LINT=*|GCOV=*)
+ name=$(printf '%s' "$NAME" | tr 'A-Z_' 'a-z-')
+ warn '"%s" is deprecated; use --enable-%s' "$arg" "$name"
+ set -- "$@" "$arg"
+ ;;
+
+ PREFIX=*|MANDIR=*|VERSION=*)
+ name=$(printf '%s' "$NAME" | tr 'A-Z_' 'a-z-')
+ warn '"%s" is deprecated; use --%s=%s' "$arg" "$name" "$value"
+ set -- "$@" "$arg"
+ ;;
+
+ WITH_*=*)
+ name=$(printf '%s' "$NAME" | tr 'A-Z_' 'a-z-')
+ warn '"%s" is deprecated; use --%s' "$arg" "$name"
+ set -- "$@" "$arg"
;;
# make flag (-j2) or variable (CC=clang)
-*|*=*)
- continue
+ set -- "$@" "$arg"
;;
*)
- printf 'error: Unrecognized option "%s"\n\n' "$arg" >&2
- printf 'Run %s --help for more information.\n' "$0" >&2
- exit 1
+ invalid "$arg"
;;
esac
done
-# Get the relative path to the source tree based on how the script was run
-DIR=$(dirname -- "$0")
-
# Set up symbolic links for out-of-tree builds
-for f in Makefile build completions docs src tests; do
+for f in Makefile bench build completions docs src tests; do
test -e "$f" || ln -s "$DIR/$f" "$f"
done
-# Set MAKEFLAGS to -j$(nproc) if it's unset
-export MAKEFLAGS="${MAKEFLAGS-$j}"
+# Set MAKEFLAGS to -j$(_nproc) if it's unset
+export MAKEFLAGS="${MAKEFLAGS--j$(_nproc)}"
$MAKE -rf build/config.mk "$@"