cflags.SH: rework the gcc warnings selection
[p5sagit/p5-mst-13.2.git] / cflags.SH
1 case $PERL_CONFIG_SH in
2 '')
3         if test -f config.sh; then TOP=.;
4         elif test -f ../config.sh; then TOP=..;
5         elif test -f ../../config.sh; then TOP=../..;
6         elif test -f ../../../config.sh; then TOP=../../..;
7         elif test -f ../../../../config.sh; then TOP=../../../..;
8         else
9                 echo "Can't find config.sh."; exit 1
10         fi
11         . $TOP/config.sh
12         ;;
13 esac
14 : This forces SH files to create target in same directory as SH file.
15 : This is so that make depend always knows where to find SH derivatives.
16 case "$0" in
17 */*) cd `expr X$0 : 'X\(.*\)/'` ;;
18 esac
19 echo "Extracting cflags (with variable substitutions)"
20 : This section of the file will have variable substitutions done on it.
21 : Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
22 : Protect any dollar signs and backticks that you do not want interpreted
23 : by putting a backslash in front.  You may delete these comments.
24 rm -f cflags
25 $spitshell >cflags <<!GROK!THIS!
26 $startsh
27 !GROK!THIS!
28
29 : In the following dollars and backticks do not need the extra backslash.
30 $spitshell >>cflags <<'!NO!SUBS!'
31 case $PERL_CONFIG_SH in
32 '')
33         if test -f config.sh; then TOP=.;
34         elif test -f ../config.sh; then TOP=..;
35         elif test -f ../../config.sh; then TOP=../..;
36         elif test -f ../../../config.sh; then TOP=../../..;
37         elif test -f ../../../../config.sh; then TOP=../../../..;
38         else
39                 echo "Can't find config.sh."; exit 1
40         fi
41         . $TOP/config.sh
42         ;;
43 esac
44
45 : syntax: cflags [optimize=XXX] [file[.suffix]]
46 : displays the compiler command line for file
47
48 case "X$1" in
49 Xoptimize=*|X"optimize=*")
50         eval "$1"
51         shift
52         ;;
53 esac
54
55 also=': '
56 case $# in
57 1) also='echo 1>&2 "      CCCMD = "'
58 esac
59
60 case $# in
61 0) set *.c; echo "The current C flags are:" ;;
62 esac
63
64 set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g' -e "s/\\$obj_ext / /g"`
65
66 for file do
67
68     case "$#" in
69     1) ;;
70     *) echo $n "    $file.c     $c" ;;
71     esac
72
73     : allow variables like toke_cflags to be evaluated
74
75     if echo $file | grep -v / >/dev/null
76     then
77       eval 'eval ${'"${file}_cflags"'-""}'
78     fi
79
80     : or customize here
81
82     case "$file" in
83     DB_File) ;;
84     GDBM_File) ;;
85     NDBM_File) ;;
86     ODBM_File) ;;
87     POSIX) ;;
88     SDBM_File) ;;
89     av) ;;
90     byterun) ;;
91     deb) ;;
92     dl) ;;
93     doio) ;;
94     doop) ;;
95     dump) ;;
96     gv) ;;
97     hv) ;;
98     locale) ;;
99     main) ;;
100     malloc) ;;
101     mg) ;;
102     miniperlmain) ;;
103     numeric) ;;
104     op) ;;
105     perl) ;;
106     perlapi) ;;
107     perlmain) ;;
108     perly) ;;
109     pp) ;;
110     pp_ctl) ;;
111     pp_hot) ;;
112     pp_pack) ;;
113     pp_sys) ;;
114     regcomp) ;;
115     regexec) ;;
116     run) ;;
117     scope) ;;
118     sv) ;;
119     taint) ;;
120     toke) ;;
121     usersub) ;;
122     util) ;;
123     *) ;;
124     esac
125
126 warn=''
127
128 # Add -Wall for the core modules iff gcc and not already -Wall
129 case "$gccversion" in
130 '') ;;
131 Intel*) ;; # The Intel C++ plays gcc on TV but is not really it.
132 *)  case "$ccflags" in
133     *-Wall*) ;;
134     *) warn="$warn -Wall" ;;
135     esac
136     ;;
137 esac
138
139 # The gcc -ansi -pedantic require their own dance, too.
140 case "$gccversion" in
141 '') ;;
142 Intel*) ;;
143 *)  case "$gccansipedantic" in
144     define)
145         case "$gccversion" in
146         [12]*) ;; # gcc versions 1 (gasp!) and 2 are not good for this.
147         *)  case "$osname" in
148             # Add -ansi -pedantic only for known platforms.
149             aix|dec_osf|freebsd|hpux|irix|linux)
150                 ansipedantic="-ansi -pedantic" ;;
151             solaris)
152 # Can't add -ansi for Solaris.
153 # Off_t/off_t is a struct in Solaris with largefiles, and with -ansi
154 # that struct cannot be compared with a flat integer, such as a STRLEN.
155 # The -ansi will also cause a lot of noise in Solaris because of:
156 # /usr/include/sys/resource.h:148: warning: `struct rlimit64' declared inside parameter list
157                 ansipedantic="-pedantic" ;;
158             esac
159             for i in $ansipedantic
160             do
161                 case "$ccflags" in
162                 *$i*) ;;
163                 *) warn="$warn $i" ;;
164                 esac
165             done
166             case "$warn$ccflags" in
167             *-pedantic*) warn="$warn -DPERL_GCC_PEDANTIC" ;;
168             esac
169             ;;
170         esac
171         ;;
172     esac
173     ;;
174 esac
175
176 # Further gcc warning options.
177 case "$gccversion" in
178 '') ;;
179 Intel*) ;;
180 *)  for opt in '' extra declaration-after-statement endif-labels
181     do
182        case " $ccflags " in
183        *"-W$opt "*) ;;
184        *) case "`echo | $cc -W$opt -E - 2>&1`" in
185           *"unrecognized"*) ;;
186           *) warn="$warn -W$opt" ;;
187           esac
188           ;;
189        esac
190     done
191     ;;
192 esac
193
194 if test -f .patch; then
195   ccflags="-DPERL_PATCHNUM=`cat .patch` $ccflags"
196 fi
197
198     : Can we perhaps use $ansi2knr here
199     echo "$cc -c -DPERL_CORE $ccflags $optimize $warn"
200     eval "$also "'"$cc -DPERL_CORE -c $ccflags $optimize $warn"'
201
202     . $TOP/config.sh
203
204 done
205 !NO!SUBS!
206 chmod 755 cflags
207 $eunicefix cflags