| #!/usr/bin/env bash |
| # |
| |
| BASHVER=$(expr ${BASH_VERSINFO[0]} \* 1000 + ${BASH_VERSINFO[1]}) |
| |
| if [ "$BASHVER" -lt 3002 ]; then |
| echo "ERROR: mklove requires bash version 3.2 or later but you are using $BASH_VERSION ($BASHVER)" |
| echo " See https://github.com/edenhill/mklove/issues/15" |
| exit 1 |
| fi |
| |
| MKL_CONFIGURE_ARGS="$0 $*" |
| |
| # Load base module |
| source mklove/modules/configure.base |
| |
| # Read some special command line options right away that must be known prior to |
| # sourcing modules. |
| mkl_in_list "$*" "--no-download" && MKL_NO_DOWNLOAD=1 |
| # Disable downloads when --help is used to avoid blocking calls. |
| mkl_in_list "$*" "--help" && MKL_NO_DOWNLOAD=1 |
| mkl_in_list "$*" "--debug" && MKL_DEBUG=1 |
| |
| # This is the earliest possible time to check for color support in |
| # terminal because mkl_check_terminal_color_support uses mkl_dbg which |
| # needs to know if MKL_DEBUG is set |
| mkl_check_terminal_color_support |
| |
| # Delete temporary Makefile and header files on exit. |
| trap "{ rm -f $MKL_OUTMK $MKL_OUTH; }" EXIT |
| |
| |
| |
| ## |
| ## Load builtin modules |
| ## |
| |
| # Builtin options, etc. |
| mkl_require builtin |
| |
| # Host/target support |
| mkl_require host |
| |
| # Compiler detection |
| mkl_require cc |
| |
| |
| # Load application provided modules (in current directory), if any. |
| for fname in configure.* ; do |
| if [[ $fname = 'configure.*' ]]; then |
| continue |
| fi |
| |
| # Skip temporary files |
| if [[ $fname = *~ ]]; then |
| continue |
| fi |
| |
| mkl_require $fname |
| done |
| |
| |
| |
| |
| ## |
| ## Argument parsing (options) |
| ## |
| ## |
| |
| _SAVE_ARGS="$*" |
| |
| # Parse arguments |
| while [[ ! -z $@ ]]; do |
| if [[ $1 != --* ]]; then |
| mkl_err "Unknown non-option argument: $1" |
| mkl_usage |
| exit 1 |
| fi |
| |
| opt=${1#--} |
| shift |
| |
| if [[ $opt = *=* ]]; then |
| name="${opt%=*}" |
| arg="${opt#*=}" |
| eqarg=1 |
| else |
| name="$opt" |
| arg="" |
| eqarg=0 |
| fi |
| |
| safeopt="$(mkl_env_esc $name)" |
| |
| if ! mkl_func_exists opt_$safeopt ; then |
| mkl_err "Unknown option $opt" |
| mkl_usage |
| exit 1 |
| fi |
| |
| # Check if this option needs an argument. |
| reqarg=$(mkl_meta_get "MKL_OPT_ARGS" "$(mkl_env_esc $name)") |
| if [[ ! -z $reqarg ]]; then |
| if [[ $eqarg == 0 && -z $arg ]]; then |
| arg=$1 |
| shift |
| |
| if [[ -z $arg ]]; then |
| mkl_err "Missing argument to option --$name $reqarg" |
| exit 1 |
| fi |
| fi |
| else |
| if [[ ! -z $arg ]]; then |
| mkl_err "Option --$name expects no argument" |
| exit 1 |
| fi |
| arg=y |
| fi |
| |
| case $name in |
| re|reconfigure) |
| oldcmd=$(head -1 config.log | grep '^# configure exec: ' | \ |
| sed -e 's/^\# configure exec: [^ ]*configure//') |
| echo "Reconfiguring: $0 $oldcmd" |
| exec $0 $oldcmd |
| ;; |
| |
| list-modules) |
| echo "Modules loaded:" |
| for mod in $MKL_MODULES ; do |
| echo " $mod" |
| done |
| exit 0 |
| ;; |
| |
| list-checks) |
| echo "Check functions in calling order:" |
| for mf in $MKL_CHECKS ; do |
| mod=${mf%:*} |
| func=${mf#*:} |
| echo -e "${MKL_GREEN}From module $mod:$MKL_CLR_RESET" |
| declare -f $func |
| echo "" |
| done |
| exit 0 |
| ;; |
| |
| update-modules) |
| fails=0 |
| echo "Updating modules" |
| for mod in $MKL_MODULES ; do |
| echo -n "Updating $mod..." |
| if mkl_module_download "$mod" > /dev/null ; then |
| echo -e "${MKL_GREEN}ok${MKL_CLR_RESET}" |
| else |
| echo -e "${MKL_RED}failed${MKL_CLR_RESET}" |
| fails=$(expr $fails + 1) |
| fi |
| done |
| exit $fails |
| ;; |
| |
| help) |
| mkl_usage |
| exit 0 |
| ;; |
| |
| *) |
| opt_$safeopt $arg || exit 1 |
| mkl_var_append MKL_OPTS_SET "$safeopt" |
| ;; |
| esac |
| done |
| |
| if [[ ! -z $MKL_CLEAN ]]; then |
| mkl_clean |
| exit 0 |
| fi |
| |
| # Move away previous log file |
| [[ -f $MKL_OUTDBG ]] && mv $MKL_OUTDBG ${MKL_OUTDBG}.old |
| |
| |
| # Create output files |
| echo "# configure exec: $0 $_SAVE_ARGS" >> $MKL_OUTDBG |
| echo "# On $(date)" >> $MKL_OUTDBG |
| |
| rm -f $MKL_OUTMK $MKL_OUTH |
| |
| |
| # Load cache file |
| mkl_cache_read |
| |
| # Run checks |
| mkl_checks_run |
| |
| # Check accumulated failures, will not return on failure. |
| mkl_check_fails |
| |
| # Generate outputs |
| mkl_generate |
| |
| # Summarize what happened |
| mkl_summary |
| |
| # Write cache file |
| mkl_cache_write |
| |
| |
| echo "" |
| echo "Now type 'make' to build" |
| trap - EXIT |
| exit 0 |