summaryrefslogtreecommitdiffstats
path: root/configure
diff options
context:
space:
mode:
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure209
1 files changed, 124 insertions, 85 deletions
diff --git a/configure b/configure
index 60d7a92..7f0bd04 100755
--- a/configure
+++ b/configure
@@ -7,29 +7,110 @@
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
-
-# Convert kebab-case to UPPER_CASE
-toupper() {
- printf '%s' "$1" | tr 'a-z-' 'A-Z_'
+# Get the relative path to the source tree based on how the script was run
+DIR=$(dirname -- "$0")
+
+# Print the help message
+help() {
+ cat <<EOF
+Usage:
+
+ \$ $0 [--enable-*|--disable-*] [--with-*|--without-*] [CC=...] [...]
+ \$ $MAKE -j$(_nproc)
+
+Variables set in the environment or on the command line will be picked up:
+
+ MAKE
+ The make implementation to use
+ CC
+ The C compiler to use
+
+ CPPFLAGS="-I... -D..."
+ CFLAGS="-W... -f..."
+ LDFLAGS="-L... -Wl,..."
+ Preprocessor/compiler/linker flags
+
+ LDLIBS="-l... -l..."
+ Dynamic libraries to link
+
+ EXTRA_{CPPFLAGS,CFLAGS,LDFLAGS,LDLIBS}
+ Adds to the default flags, instead of replacing them
+
+The default flags result in a plain debug build. Other build profiles include:
+
+ --enable-release
+ Enable optimizations, disable assertions
+ --enable-{asan,lsan,msan,tsan,ubsan}
+ Enable sanitizers
+ --enable-gcov
+ Enable code coverage instrumentation
+
+External dependencies are auto-detected by default, but you can build --with or
+--without them explicitly:
+
+ --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$(_nproc) V=1
+EOF
+}
+
+# Report a warning
+warn() {
+ fmt="$1"
+ shift
+ printf "%s: warning: $fmt\\n" "$0" "$@" >&2
}
# Report an argument parsing error
invalid() {
- printf 'error: Unrecognized option "%s"\n\n' "$1" >&2
+ 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|with|without)-]$name[=$value]
value="${arg#*=}"
name="${arg%%=*}"
@@ -69,75 +150,21 @@ for arg; do
--enable-*) arg="--with-${arg#--*-}" ;;
--disable-*) arg="--without-${arg#--*-}" ;;
esac
- printf 'warning: Treating "%s" like "%s"\n' "$old" "$arg" >&2
+ warn 'Treating "%s" like "%s"' "$old" "$arg"
;;
esac
- ;;
+ ;;
esac
case "$arg" in
-h|--help)
- cat <<EOF
-Usage:
-
- \$ $0 [--enable-*|--disable-*] [--with-*|--without-*] [CC=...] [...]
- \$ $MAKE $j
-
-Variables set in the environment or on the command line will be picked up:
-
- MAKE
- The make implementation to use
- CC
- The C compiler to use
-
- CPPFLAGS="-I... -D..."
- CFLAGS="-W... -f..."
- LDFLAGS="-L... -Wl,..."
- Preprocessor/compiler/linker flags
-
- LDLIBS="-l... -l..."
- Dynamic libraries to link
-
- EXTRA_{CPPFLAGS,CFLAGS,LDFLAGS,LDLIBS}
- Adds to the default flags, instead of replacing them
-
-The default flags result in a plain debug build. Other build profiles include:
-
- --enable-release
- Enable optimizations, disable assertions
- --enable-{asan,lsan,msan,tsan,ubsan}
- Enable sanitizers
- --enable-gcov
- Enable code coverage instrumentation
-
-External dependencies are auto-detected by default, but you can build --with or
---without them explicitly:
-
- --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)
-
-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
-EOF
+ help
exit 0
;;
--enable-*|--disable-*)
case "$name" in
- release|asan|lsan|msan|tsan|ubsan|lint|gcov)
- shift
+ release|lto|asan|lsan|msan|tsan|ubsan|lint|gcov)
set -- "$@" "$NAME=$yn"
;;
*)
@@ -149,7 +176,6 @@ EOF
--with-*|--without-*)
case "$name" in
libacl|libcap|libselinux|liburing|oniguruma)
- shift
set -- "$@" "WITH_$NAME=$yn"
;;
*)
@@ -158,24 +184,40 @@ EOF
esac
;;
- --prefix=*|--mandir=*)
- shift
+ --prefix=*|--mandir=*|--version=*)
set -- "$@" "$NAME=$value"
;;
--infodir=*|--build=*|--host=*|--target=*)
- shift
- printf 'warning: Ignoring option "%s"\n' "$arg" >&2
+ warn 'Ignoring option "%s"' "$arg"
;;
MAKE=*)
- 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"
;;
*)
@@ -184,15 +226,12 @@ EOF
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 "$@"