summaryrefslogtreecommitdiff
path: root/sofort/cfgtest.sh
diff options
context:
space:
mode:
Diffstat (limited to 'sofort/cfgtest.sh')
-rw-r--r--sofort/cfgtest.sh164
1 files changed, 164 insertions, 0 deletions
diff --git a/sofort/cfgtest.sh b/sofort/cfgtest.sh
new file mode 100644
index 0000000..cb1e069
--- /dev/null
+++ b/sofort/cfgtest.sh
@@ -0,0 +1,164 @@
+# cfgtest.sh: sofort's config test framework,
+# for use from within a project's custom cfgdefs.sh.
+
+# in the common scenario, target-specific tests are preceded
+# by a single invocation of cfgtest_target_section, whereas
+# native (build) system tests are preceded by the invocation
+# of cfgtest_native_section.
+
+# cfgdefs fraework variables:
+# mb_cfgtest_cc: the compiler used for the current test
+# mb_cfgtest_cflags: the compiler flags used for the current test
+# mb_cfgtest_cfgtype: the type of the current test (target/native)
+# mb_cfgtest_makevar: the make variable affected by the current test
+# mb_cfgtest_headers: headers for ad-hoc inclusion with the current test
+
+
+cfgtest_newline()
+{
+ printf '\n' >> $mb_pwd/cfgdefs.mk
+}
+
+
+cfgtest_comment()
+{
+ mb_internal_str='#'
+
+ for mb_internal_arg ; do
+ mb_internal_str="$mb_internal_str $mb_internal_arg"
+ done
+
+ printf '%s\n' "$mb_internal_str" >> $mb_pwd/cfgdefs.mk
+}
+
+
+cfgtest_target_section()
+{
+ mb_cfgtest_cc=$(make -s -f "$mb_pwd/Makefile.tmp" .display-cc)
+ mb_cfgtest_cflags=$(make -s -f "$mb_pwd/Makefile.tmp" .display-cflags)
+ mb_cfgtest_cfgtype='target'
+
+ cfgtest_comment 'target-specific tests'
+}
+
+
+cfgtest_native_section()
+{
+ mb_cfgtest_cc="$mb_native_cc"
+ mb_cfgtest_cflags="$mb_native_cc_cflags"
+ mb_cfgtest_cfgtype='native'
+
+ cfgtest_comment 'native system tests'
+}
+
+
+cfgtest_makevar_append()
+{
+ mb_internal_str='+='
+
+ for mb_internal_arg ; do
+ mb_internal_str="$mb_internal_str $mb_internal_arg"
+ done
+
+ printf '%-24s%s\n' "$mb_cfgtest_makevar" "$mb_internal_str" \
+ >> $mb_pwd/cfgdefs.mk
+}
+
+
+cfgtest_cflags_append()
+{
+ if [ $mb_cfgtest_cfgtype = 'target' ]; then
+ mb_internal_makevar='CFLAGS_CONFIG'
+ else
+ mb_internal_makevar='NATIVE_CC_CFLAGS'
+ fi
+
+ mb_cfgtest_makevar_saved=$mb_cfgtest_makevar
+ mb_cfgtest_makevar=$mb_internal_makevar
+
+ cfgtest_makevar_append "$@"
+ mb_cfgtest_makevar=$mb_cfgtest_makevar_saved
+}
+
+
+cfgtest_ldflags_append()
+{
+ if [ $mb_cfgtest_cfgtype = 'target' ]; then
+ mb_internal_makevar='LDFLAGS_CONFIG'
+ else
+ mb_internal_makevar='NATIVE_CC_LDFLAGS'
+ fi
+
+ mb_cfgtest_makevar_saved=$mb_cfgtest_makevar
+ mb_cfgtest_makevar=$mb_internal_makevar
+
+ cfgtest_makevar_append "$@"
+ mb_cfgtest_makevar=$mb_cfgtest_makevar_saved
+}
+
+
+cfgtest_header_presence()
+{
+ $mb_cfgtest_cc -E -xc - \
+ $mb_cfgtest_cflags \
+ --include="$@" \
+ < /dev/null \
+ > /dev/null 2>/dev/null \
+ || return
+
+ mb_internal_str=$(printf '%s%s' '-DHAVE_' "$@" \
+ | sed -e 's/\./_/g' \
+ | tr "[:lower:]" "[:upper:]")
+
+ cfgtest_cflags_append "$mb_internal_str"
+}
+
+
+cfgtest_header_absence()
+{
+ $mb_cfgtest_cc -E -xc - \
+ $mb_cfgtest_cflags \
+ --include="$@" \
+ < /dev/null \
+ > /dev/null 2>/dev/null \
+ && return
+
+ mb_internal_str=$(printf '%s%s' '-DHAVE_NO_' "$@" \
+ | sed -e 's/\./_/g' \
+ | tr "[:lower:]" "[:upper:]")
+
+ cfgtest_cflags_append "$mb_internal_str"
+}
+
+
+cfgtest_interface_presence()
+{
+ mb_internal_cflags=''
+
+ for mb_header in $mb_cfgtest_headers; do
+ mb_internal_cflags="$mb_internal_cflags --include=$mb_header"
+ done
+
+ printf 'void * addr = &%s;' "$@" \
+ | $mb_cfgtest_cc -S -xc - -o - \
+ $mb_cfgtest_cflags \
+ $mb_internal_cflags \
+ > /dev/null 2>/dev/null \
+ || return 1
+
+ return 0
+}
+
+cfgtest_library_presence()
+{
+ printf 'int main(void){return 0;}' \
+ | $mb_cfgtest_cc -o a.out -xc - \
+ $mb_cfgtest_cflags \
+ $@ \
+ > /dev/null 2>/dev/null \
+ || return 1
+
+ rm -f a.out
+
+ return 0
+}