This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
For Perl, assume C89 prototypes exist
[metaconfig.git] / U / modified / Protochk.U
1 ?RCS: $Id: Protochk.U,v $
2 ?RCS:
3 ?RCS: Copyright (c) 1998 Andy Dougherty
4 ?RCS:
5 ?RCS: You may distribute under the terms of either the GNU General Public
6 ?RCS: License or the Artistic License, as specified in the README file.
7 ?RCS:
8 ?X:     This unit generates a ./protochk script that is used internally
9 ?X:     by Configure to check if this system will accept a particular
10 ?X:     prototype.
11 ?X:
12 ?X:     To use it, say something like:
13 ?X:     hdrs="$define sys/types.h
14 ?X:             $i_systime sys/time.h
15 ?X:             $i_sysselct sys/select.h
16 ?X:             $d_socket sys/socket.h"
17 ?X:     $xxx='fd_set *'
18 ?X:     try='extern int select _((int, $xxx, $xxx, $xxx, struct timeval *'));'
19 ?X:     if ./protochk "$try" $hdrs; then
20 ?X:             echo "Your system accepts $xxx for the arguments to select."
21 ?X:     fi
22 ?X:  (Of course select is harder, since the first arg can be int,
23 ?X:     size_t, or unsigned long, and the last arg may or may not have a
24 ?X:     'const' before the 'struct timeval' :-(.  Also SunOS 4.1.3 doesn't
25 ?X:     provide a select prototype so the compiler accepts anything :-).
26 ?X:
27 ?X:     The C compiler on QNX warns about invalid pointer types, but
28 ?X:     still exits with a 0 exit status, so it's not much help here.
29 ?X:     (It does correctly detect incorrect non-pointer arguments).
30 ?X:     Still, since QNX is a POSIX-ish system, just make your first
31 ?X:     a POSIX-ish one, and QNX will probably accept it.
32 ?X:
33 ?X:     For determining argument types, your compiler must support
34 ?X:     prototypes, and the header files must use them.  Determining
35 ?X:     return types, however, is easier.  Just give an ridiculous
36 ?X:     return type, something like
37 ?X:     ./protochk 'extern int atof _((void));' $i_stdlib stdlib.h
38 ?X:     that should surely fail if atof() is defined in <stdlib.h>
39 ?X:
40 ?X:     There is also an 'escape' hatch built in.  If you have a pair
41 ?X:     of args   'literal 'stuff' then 'stuff' gets included literally
42 ?X:     into the test program.  This could be useful for doing something
43 ?X:     like
44 ?X:     hdrs="$define stdio.h
45 ?X:             $define sys/types.h"
46 ?X:     ./protochk 'extern int fsetpos(FILE *, Fpos_t);' $args \
47 ?X:                     'literal' '#define Fpos_t long long'
48 ?X:     but you have to be really careful about the spaces in "literal".
49 ?X:
50 ?X:             Andy Dougherty   Feb. 1998
51 ?MAKE:Protochk: cat rm_try startsh eunicefix +cc +optimize +ccflags \
52         i_pthread usethreads
53 ?MAKE:  -pick add $@ %<
54 ?F:./protochk
55 ?X: Comfort metalint.  All these are actually used in the protochk script.
56 ?T:foo status pthread_h_done
57 ?LINT: change cc optimize ccflags define rm_try
58 ?LINT: extern pthread_h_first
59 ?LINT: change pthread_h_first
60 ?LINT: change usethreads
61 ?LINT: change i_pthread
62 : define a function to check prototypes
63 $cat > protochk <<EOSH
64 $startsh
65 cc="$cc"
66 optimize="$optimize"
67 ccflags="$ccflags"
68 define="$define"
69 rm_try="$rm_try"
70 usethreads=$usethreads
71 i_pthread=$i_pthread
72 pthread_h_first=$pthread_h_first
73 EOSH
74
75 $cat >> protochk <<'EOSH'
76
77 $rm_try
78 foo="$1"
79 shift
80 while test $# -ge 2; do
81         case "$1" in
82                 $define) echo "#include <$2>" >> try.c ;;
83                 literal) echo "$2" >> try.c ;;
84         esac
85     # Extra magic for the benefit of systems that need pthread.h
86     # to be included early to correctly detect threadsafe functions.
87     # Such functions must guarantee themselves, though, that the usethreads
88     # and i_pthread have been defined, before calling protochk.
89     if test "$usethreads" = "$define" -a "$i_pthread" = "$define" -a "$pthread_h_first" = "$define" -a "$pthread_h_done" = ""; then
90         echo "#include <pthread.h>" >> try.c
91         pthread_h_done=yes
92     fi
93     shift 2
94 done
95 cat >> try.c <<'EOCP'
96 #define _(args) args
97 EOCP
98 echo "$foo" >> try.c
99 ?X: Just so we have something to compile.
100 echo 'int no_real_function_has_this_name _((void)) { return 0; }' >> try.c
101 $cc $optimize $ccflags -c try.c > /dev/null 2>&1
102 status=$?
103 $rm_try
104 exit $status
105 EOSH
106 chmod +x protochk
107 $eunicefix protochk
108