# in projects where [ $mb_use_custom_cfgdefs = yes ],
# cfgdefs.sh is invoked from within ./configure via
# . $mb_project_dir/project/cfgdefs.sh
# a successful return from cfgdefs.sh will be followed
# by a second invocation of the config_copy() function,
# reflecting any changes to common config variables
# made by cfgdefs.sh.
# finally, cfgdefs.sh may update the contents of the
# config-time generated cfgdefs.mk.
# sofort's config test framework
. "$mb_project_dir/sofort/cfgtest/cfgtest.sh"
for arg ; do
case "$arg" in
--with-default-sys-path=*)
cfgdefs_default_sys_path=${arg##*=}
;;
*)
error_msg ${arg#}: "unsupported config argument."
exit 2
esac
case "${cfgdefs_default_sys_path:-empty}" in
/*)
;;
empty)
error_msg "$mb_script: --with-default-sys-path: empty paths are not allowed."
exit 2
;;
*)
error_msg "$mb_script: --with-default-sys-path: relative paths are not allowed."
exit 2
esac
done
cfgdefs_bootstrap()
{
cfgdefs_bootstrap_done=${cfgdefs_bootstrap_done:-}
if [ _$cfgdefs_bootstrap_done = _yes ]; then
return 0
fi
cfgdefs_objs=
cfgdefs_utilsrc='main.c'
cfgdefs_sources="arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c"
cfgdefs_sources="$cfgdefs_sources lst.c make.c make_malloc.c meta.c metachar.c parse.c"
cfgdefs_sources="$cfgdefs_sources str.c suff.c targ.c trace.c util.c var.c"
cfgdefs_cflags=
cfgdefs_cflags="$cfgdefs_cflags -I${mb_source_dir}/src/internal"
cfgdefs_cflags="$cfgdefs_cflags -D_PATH_DEFSYSPATH=\"${mb_source_dir}/mk\""
cfgdefs_cflags="$cfgdefs_cflags $cfgdefs_added_defs"
cfgdefs_cflags="$cfgdefs_cflags -D_XOPEN_SOURCE=700"
cfgtest_native_section
if cfgtest_compiler_switch -std=c99; then
cfgdefs_cflags="$cfgdefs_cflags -std=c99"
fi
cfgdefs_make="$mb_pwd/bootstrap/make"
mkdir -p "$mb_pwd/bootstrap"
output_section_break
output_script_status 'bootstrapping' './bootstrap/make'
for src in $cfgdefs_utilsrc; do
obj=${src%%.c}.o
cfgdefs_objs="$cfgdefs_objs $mb_pwd/bootstrap/${obj}"
output_step_prolog 'compiling' "./bootstrap/${obj}"
printf '\n$ %s %s\n' "$mb_native_cc $mb_native_cflags" '\' >&3
printf '\n$ %s\n' "$cfgdefs_cflags" '\' >&3
printf '\t-c %s %s\n' "$mb_source_dir/src/${src}" '\' >&3
printf '\t-o %s %s\n\n\n' "$mb_pwd/bootstrap/${obj}" >&3
"$mb_native_cc" $mb_native_cflags $cfgdefs_cflags \
-c "$mb_source_dir/src/${src}" \
-o "$mb_pwd/bootstrap/${obj}" \
2>&3
output_step_epilog
done
for src in $cfgdefs_sources; do
obj=${src%%.c}.o
cfgdefs_objs="$cfgdefs_objs $mb_pwd/bootstrap/${obj}"
output_step_prolog 'compiling' "./bootstrap/${obj}"
printf '\n$ %s %s\n' "$mb_native_cc $mb_native_cflags" '\' >&3
printf '\n$ %s\n' "$cfgdefs_cflags" '\' >&3
printf '\t-c %s %s\n' "$mb_source_dir/src/logic/${src}" '\' >&3
printf '\t-o %s %s\n\n\n' "$mb_pwd/bootstrap/${obj}" >&3
"$mb_native_cc" $mb_native_cflags $cfgdefs_cflags \
-c "$mb_source_dir/src/logic/${src}" \
-o "$mb_pwd/bootstrap/${obj}" \
2>&3
output_step_epilog
done
output_step_prolog 'linking' './bootstrap/make'
printf '\n$ %s %s\n' "$mb_native_cc $cfgdefs_cflags" '\' >&3
printf '\t %s %s\n' "$mb_native_ldflags" '\' >&3
printf '\t %s %s\n' "$cfgdefs_objs" '\' >&3
printf '\t-o %s %s\n\n\n' "$cfgdefs_make" >&3
"$mb_native_cc" $mb_native_cflags $cfgdefs_cflags \
$mb_native_ldflags $cfgdefs_objs \
-o "$cfgdefs_make" \
2>&3
output_step_epilog
mb_make="$cfgdefs_make"
cfgdefs_bootstrap_done='yes'
output_section_break
}
cfgdefs_output_custom_defs()
{
cfgdefs_default_sys_path="${cfgdefs_default_sys_path:-/usr/share/mk}"
sed \
-e 's#@cfgdefs_default_sys_path@#'"$cfgdefs_default_sys_path"'#g' \
"$mb_project_dir/project/config/cfgdefs.in" \
> cfgdefs.mk
}
cfgdefs_perform_common_tests()
{
# bootstrap
cfgdefs_added_defs=
# interfaces
mb_cfgtest_headers='stdio.h'
cfgtest_interface_presence 'vsnprintf'
if [ $? = '0' ]; then
cfgdefs_added_defs="$cfgdefs_added_defs -DHAVE_VSNPRINTF"
fi
mb_cfgtest_headers='string.h'
cfgtest_interface_presence 'strerror'
if [ $? = '0' ]; then
cfgdefs_added_defs="$cfgdefs_added_defs -DHAVE_STRERROR"
fi
mb_cfgtest_headers='sys/types.h unistd.h'
cfgtest_interface_presence 'setpgid'
if [ $? = '0' ]; then
cfgdefs_added_defs="$cfgdefs_added_defs -DHAVE_SETPGID"
fi
mb_cfgtest_headers='sys/time.h sys/resource.h'
cfgtest_interface_presence 'setrlimit'
if [ $? = '0' ]; then
cfgdefs_added_defs="$cfgdefs_added_defs -DHAVE_SETRLIMIT"
fi
mb_cfgtest_headers='stdlib.h'
cfgtest_interface_presence 'setenv'
if [ $? = '0' ]; then
cfgdefs_added_defs="$cfgdefs_added_defs -DHAVE_SETENV"
fi
cfgtest_newline
}
cfgdefs_perform_native_tests()
{
# init
cfgtest_newline
cfgtest_native_section
# common tests
cfgdefs_perform_common_tests
# pretty cfgdefs.mk
cfgtest_newline
}
cfgdefs_perform_target_tests()
{
# init
cfgtest_newline
cfgtest_host_section
# common tests
cfgdefs_perform_common_tests
# pretty cfgdefs.mk
cfgtest_newline
}
# cfgdefs.in --> cfgdefs.mk
cfgdefs_output_custom_defs
# strict: some tests might fail
set +e
# bootstrapping cflags
cfgdefs_perform_native_tests
# strict: restore mode
set -e
# bootstrap
cfgdefs_bootstrap
# strict: some tests might fail
set +e
# target-specific tests
cfgdefs_perform_target_tests
# strict: restore mode
set -e
# all done
return 0