summaryrefslogtreecommitdiff
path: root/scripts/mkc_check_decl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/mkc_check_decl')
-rwxr-xr-xscripts/mkc_check_decl236
1 files changed, 236 insertions, 0 deletions
diff --git a/scripts/mkc_check_decl b/scripts/mkc_check_decl
new file mode 100755
index 0000000..e0cb8ea
--- /dev/null
+++ b/scripts/mkc_check_decl
@@ -0,0 +1,236 @@
+#!/bin/sh
+
+############################################################
+# Copyright (c) 2009-2010 by Aleksey Cheusov
+#
+# See LICENSE file in the distribution.
+############################################################
+
+set -e
+
+LC_ALL=C
+export LC_ALL
+
+if test -d /usr/xpg4/bin; then
+ # We cannot work with Solaris' default usercrap
+ PATH=/usr/xpg4/bin:$PATH
+ export PATH
+fi
+
+##################################################
+# options
+usage (){
+ cat <<EOF
+mkc_check_decl detects presense of define, variable, function or type
+in system header files by compiling a test program.
+
+Usage:
+ mkc_check_decl [OPTIONS] <CHECKTYPE> <what> [includes...]
+where CHECKTYPE is either of the following: "define", "variable",
+"func[0-9]", "type" or "member"
+
+OPTIONS:
+ -h display this help
+ -d delete cache files
+
+Examples:
+ mkc_check_decl define __GNUC__
+ mkc_check_decl define RTLD_LAZY dlfcn.h
+ mkc_check_decl variable sys_errlist errno.h
+ mkc_check_decl variable __malloc_hook malloc.h
+ mkc_check_decl func3 poll poll.h
+ mkc_check_decl func2 fgetln stdio.h
+ mkc_check_decl type mbstate_t wchar.h
+ mkc_check_decl type long-long
+ mkc_check_decl member tm.tm_isdst time.h
+ mkc_check_decl member ifreq.ifr_addr.sa_len net/if.h
+EOF
+}
+
+if test $# -eq 0; then
+ usage
+ exit 1
+fi
+if test "_$1" = '_-h'; then
+ usage
+ exit 0
+fi
+if test "_$1" = '_-d'; then
+ delcache=1
+ shift
+fi
+
+##################################################
+# initializing
+
+decltype=`echo $1 | sed -e 's/[0-9]//g'`
+argscnt=`echo $1 | sed 's/[^0-9]//g'`
+shift
+
+declwhat=`echo $1 | sed 's/-/ /'`
+shift
+
+if test "$decltype" = type; then
+ pathpart=`echo ${decltype}_${declwhat}_$* | tr '/. ' '__~'`
+else
+ pathpart=`echo $decltype$argscnt $declwhat $* | tr '/. ' '___'`
+fi
+
+. mkc_check_common.sh
+
+##################################################
+# functions
+
+get_includes (){
+ for i in $MKC_COMMON_HEADERS "$@"; do
+ echo "#include <$i>"
+ done
+}
+
+##############################
+compile (){
+ if $CC -c -o "$tmpo" $CPPFLAGS $CFLAGS "$tmpc" 2>"$tmperr"
+ then
+ return 0
+ else
+ return 1
+ fi
+}
+
+##############################
+is_define (){
+ get_includes "$@" > "$tmpc"
+
+ cat >> "$tmpc" <<EOF
+#if defined($declwhat)
+int main ()
+{
+ return 0;
+}
+#else
+.error "$declwhat is not a define"
+#endif
+EOF
+
+ #
+ compile
+}
+
+##############################
+is_variable (){
+ get_includes "$@" > "$tmpc"
+
+ cat >> "$tmpc" <<EOF
+int main ()
+{
+ return sizeof (($declwhat)) && (&$declwhat != 0);
+}
+EOF
+ #
+ compile
+}
+
+##############################
+has_size (){
+ get_includes "$@" > "$tmpc"
+
+ cat >> "$tmpc" <<EOF
+int main ()
+{
+ return sizeof ($declwhat);
+}
+EOF
+
+ #
+ compile
+}
+
+is_type (){
+ has_size "$@" || return 1
+ is_variable "$@" && return 1
+ return 0
+}
+
+##############################
+is_func (){
+ get_includes "$@" > "$tmpc"
+
+ cat >> "$tmpc" <<EOF
+void func (void)
+{
+ if (${declwhat}) return;
+ ${declwhat} (
+EOF
+
+ awk -v N="$argscnt" '
+BEGIN {
+ for (i=0; i < N; ++i){
+ if (i)
+ printf ","
+ printf "0"
+ }
+}
+' >> "$tmpc"
+
+ printf ');\n}\n' >> "$tmpc"
+
+ #
+ compile
+}
+
+##############################
+is_member (){
+ get_includes "$@" > "$tmpc"
+
+ type_t=`echo $declwhat | sed 's/[.].*$//'`
+ member=`echo $declwhat | sed 's/^[^.]*[.]//'`
+
+ cat >> "$tmpc" <<EOF
+int main ()
+{
+ $type_t var;
+ return sizeof (var.$member);
+}
+EOF
+
+ #
+ compile
+}
+
+##################################################
+# test
+
+for i in "$@"; do
+ incs_msg="$incs_msg $i"
+done
+
+if test -n "$incs_msg"; then
+ incs_msg=" ($incs_msg )"
+fi
+
+check_itself (){
+ if is_${decltype} "$@"
+ then
+ echo 1
+ else
+ echo 0
+ fi
+}
+
+check_and_cache "checking for $decltype ${declwhat}${incs_msg}" "$cache" "$@"
+
+##################################################
+# clean-ups
+
+cleanup
+
+##################################################
+# finishing
+
+if test "$ret" -eq 1; then
+ printme 'yes\n' 1>&2
+else
+ printme 'no\n' 1>&2
+fi
+
+echo $ret