2
0
MasterPassword/platform-independent/cli-c/build

206 lines
5.5 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# USAGE
# [targets='...'] [mpw_feature=0|1 ...] [CFLAGS='...'] [LDFLAGS='...'] ./build [cc arguments ...]
#
# By default, you should only need to run ./build
#
# You can customize the targets that are built using targets='...'. Use targets='all' to build all targets.
# By default, we only build the 'mpw' target.
# See targets_all for all possible targets as well as the features they support and require.
#
# Several features can be enabled or disabled using feature flags.
# See the Features section for an overview of the features, their default setting, their meaning and their dependencies.
# You will need to have each of the feature's dependencies installed for the build to succeed with that feature enabled.
#
# Finally, the C compiler can be tuned using CFLAGS, LDFLAGS and compiler arguments passed to the script.
#
# BUGS
# masterpassword@lyndir.com
#
# AUTHOR
# Maarten Billemont
#
cd "${BASH_SOURCE%/*}"
shopt -s extglob
set -e
### CONFIGURATION
# Targets to build.
targets_all=(
mpw # C CLI version of Master Password (needs: mpw_sodium, optional: mpw_color, mpw_json).
mpw-bench # C CLI Master Password benchmark utility (needs: mpw_sodium).
mpw-tests # C Master Password algorithm test suite (needs: mpw_sodium, mpw_xml).
)
targets_default='mpw' # Override with: targets='...' ./build
# Features.
mpw_sodium=${mpw_sodium:-1} # Implement crypto functions with sodium (depends on libsodium).
mpw_json=${mpw_json:-1} # Support JSON-based user configuration format (depends on libjson-c).
mpw_color=${mpw_color:-1} # Colorized identicon (depends on libncurses).
mpw_xml=${mpw_xml:-1} # XML parsing (depends on libxml2).
# Default build flags.
cflags=( -O3 $CFLAGS )
ldflags=( $LDFLAGS )
# Version.
if { mpw_version=$(git describe --match '*-cli*' --long --dirty --broken) || mpw_version=$(<VERSION); } 2>/dev/null; then
cflags+=( -D"MP_VERSION=$mpw_version" )
fi
echo 2>&1 "Current mpw source version ${mpw_version:-<unknown>}..."
### TARGET: MPW
mpw() {
# dependencies
use_mpw_sodium
use_mpw_color
use_mpw_json
# target
cflags=(
"${cflags[@]}"
# library paths
-I"lib/include"
# mpw paths
-I"core" -I"cli"
)
local ldflags=(
"${ldflags[@]}"
)
# build
cc "${cflags[@]}" "$@" "core/base64.c" "core/mpw-algorithm.c" "core/mpw-types.c" "core/mpw-util.c" "core/mpw-marshall-util.c" "core/mpw-marshall.c" "cli/mpw-cli-util.c" \
"${ldflags[@]}" "cli/mpw-cli.c" -o "mpw"
echo "done! You can now run ./mpw-cli-tests, ./install or use ./$_"
}
### TARGET: MPW-BENCH
mpw-bench() {
# dependencies
use_mpw_sodium
# target
cflags=(
"${cflags[@]}"
# library paths
-I"lib/include"
# mpw paths
-I"core" -I"cli"
)
local ldflags=(
"${ldflags[@]}"
)
# build
cc "${cflags[@]}" "$@" "core/base64.c" "core/mpw-algorithm.c" "core/mpw-types.c" "core/mpw-util.c" \
"${ldflags[@]}" "cli/mpw-bench.c" -o "mpw-bench"
echo "done! You can now use ./$_"
}
### TARGET: MPW-TESTS
mpw-tests() {
# dependencies
use_mpw_xml
use_mpw_sodium
# target
cflags=(
"${cflags[@]}"
# library paths
-I"lib/include"
# mpw paths
-I"core" -I"cli"
)
local ldflags=(
"${ldflags[@]}"
)
# build
cc "${cflags[@]}" "$@" "core/base64.c" "core/mpw-algorithm.c" "core/mpw-types.c" "core/mpw-util.c" "cli/mpw-tests-util.c" \
"${ldflags[@]}" "cli/mpw-tests.c" -o "mpw-tests"
echo "done! You can now use ./$_"
}
### TOOLS
haslib() {
cc -l"$1" -x c -o /dev/null - <<< 'int main() { return 0; }'
}
cc() {
if hash llvm-gcc 2>/dev/null; then
llvm-gcc "$@"
elif hash gcc 2>/dev/null; then
gcc -std=gnu99 "$@"
elif hash clang 2>/dev/null; then
clang "$@"
else
echo >&2 "Need a compiler. Please install GCC or LLVM."
exit 1
fi
}
### DEPENDENCIES
use_mpw_sodium() {
! (( mpw_sodium )) && return
if ! haslib sodium; then
echo >&2 "WARNING: mpw_sodium enabled but missing sodium library, will disable mpw_sodium."
else
echo >&2 "Enabled mpw_sodium (libsodium)."
cflags+=( -D"MPW_SODIUM=1" ) ldflags+=( -l"sodium" )
fi
}
use_mpw_color() {
! (( mpw_color )) && return
if ! haslib curses; then
echo >&2 "WARNING: mpw_color enabled but missing curses library, will disable mpw_color."
else
echo >&2 "Enabled mpw_color (libcurses)."
cflags+=( -D"MPW_COLOR=1" ) ldflags+=( -l"curses" )
fi
}
use_mpw_json() {
! (( mpw_json )) && return
if ! haslib json-c; then
echo >&2 "WARNING: mpw_json enabled but missing json-c library, will disable mpw_json."
else
echo >&2 "Enabled mpw_json (libjson-c)."
cflags+=( -D"MPW_JSON=1" ) ldflags+=( -l"json-c" )
fi
}
use_mpw_xml() {
! (( mpw_xml )) && return
if ! haslib xml2; then
echo >&2 "WARNING: mpw_xml enabled but missing xml2 library, will disable mpw_xml."
else
echo >&2 "Enabled mpw_xml (libxml2)."
cflags+=( -D"MPW_XML=1" -I"/usr/include/libxml2" -I"/usr/local/include/libxml2" ) ldflags+=( -l"xml2" )
fi
}
### BUILD TARGETS
for target in "${targets_all[@]}"; do
if [[ ${targets:-$targets_default} == 'all' || " $target " = *" ${targets:-$targets_default} "* ]]; then
echo
echo "Building target: $target..."
( "$target" "$@" )
fi
done