Commit | Line | Data |
---|---|---|
1f00b0d6 S |
1 | #!/bin/sh |
2 | ||
cb9238a7 DM |
3 | # Generate the cflags script, which is used to determine what cflags |
4 | # to pass to the compiler. | |
5 | # We create a temporary test c program and repeatedly compile it with | |
6 | # various candidate flags, and from the compiler output, determine what | |
7 | # flags are supported. | |
8 | # From this we initialise the following variables in the cflags script: | |
9 | # | |
10 | # $warn | |
11 | # $stdflags | |
12 | # $extra | |
13 | # $_exe | |
14 | ||
a02608de | 15 | case $PERL_CONFIG_SH in |
1c3d792e | 16 | '') |
a0d0e21e LW |
17 | if test -f config.sh; then TOP=.; |
18 | elif test -f ../config.sh; then TOP=..; | |
19 | elif test -f ../../config.sh; then TOP=../..; | |
20 | elif test -f ../../../config.sh; then TOP=../../..; | |
21 | elif test -f ../../../../config.sh; then TOP=../../../..; | |
22 | else | |
23 | echo "Can't find config.sh."; exit 1 | |
24 | fi | |
25 | . $TOP/config.sh | |
26 | ;; | |
1c3d792e | 27 | esac |
44213caa DM |
28 | # This forces SH files to create target in same directory as SH file. |
29 | # This is so that make depend always knows where to find SH derivatives. | |
1c3d792e LW |
30 | case "$0" in |
31 | */*) cd `expr X$0 : 'X\(.*\)/'` ;; | |
32 | esac | |
bc730b18 | 33 | |
37723ebb | 34 | if test -f config_h.SH -a ! -f config.h; then |
6ef8aa7c | 35 | . ./config_h.SH |
11e2f395 | 36 | CONFIG_H=already-done |
6ef8aa7c RGS |
37 | fi |
38 | ||
bc730b18 JH |
39 | warn='' |
40 | ||
41 | # Add -Wall for the core modules iff gcc and not already -Wall | |
42 | case "$gccversion" in | |
43 | '') ;; | |
44 | Intel*) ;; # The Intel C++ plays gcc on TV but is not really it. | |
45 | *) case "$ccflags" in | |
46 | *-Wall*) ;; | |
47 | *) warn="$warn -Wall" ;; | |
48 | esac | |
49 | ;; | |
50 | esac | |
51 | ||
a07cd53d JH |
52 | # Create a test source file for testing what options can be fed to |
53 | # gcc in this system; include a selection of most common and commonly | |
54 | # hairy include files. | |
55 | ||
56 | cat >_cflags.c <<__EOT__ | |
57 | #include "EXTERN.h" | |
58 | #include "perl.h" | |
59 | /* The stdio.h, errno.h, and setjmp.h should be there in any ANSI C89. */ | |
60 | #include <stdio.h> | |
61 | #include <errno.h> | |
62 | #include <setjmp.h> | |
63 | /* Just in case the inclusion of perl.h did not | |
64 | * pull in enough system headers, let's try again. */ | |
65 | #ifdef I_STDLIB | |
66 | #include <stdlib.h> | |
67 | #endif | |
68 | #ifdef I_STDDEF | |
69 | #include <stddef.h> | |
70 | #endif | |
71 | #ifdef I_STDARG | |
72 | #include <stdarg.h> | |
73 | #endif | |
74 | #ifdef I_LIMITS | |
75 | #include <limits.h> | |
76 | #endif | |
77 | #ifdef I_DIRENT | |
78 | #include <dirent.h> | |
79 | #endif | |
80 | #ifdef I_UNISTD | |
81 | #include <unistd.h> | |
82 | #endif | |
463bdbaf | 83 | #ifdef I_SYS_TYPES |
a07cd53d JH |
84 | #include <sys/types.h> |
85 | #endif | |
463bdbaf | 86 | #ifdef I_SYS_PARAM |
a07cd53d JH |
87 | #include <sys/param.h> |
88 | #endif | |
463bdbaf | 89 | #ifdef I_SYS_RESOURCE |
a07cd53d JH |
90 | #include <sys/resource.h> |
91 | #endif | |
463bdbaf | 92 | #ifdef I_SYS_SELECT |
a07cd53d JH |
93 | #include <sys/select.h> |
94 | #endif | |
95 | #if defined(HAS_SOCKET) && !defined(VMS) && !defined(WIN32) /* See perl.h. */ | |
96 | #include <sys/socket.h> | |
97 | #endif | |
463bdbaf | 98 | #ifdef I_SYS_STAT |
a07cd53d JH |
99 | #include <sys/stat.h> |
100 | #endif | |
463bdbaf | 101 | #ifdef I_SYS_TIME |
a07cd53d JH |
102 | #include <sys/time.h> |
103 | #endif | |
463bdbaf | 104 | #ifdef I_SYS_TIMES |
a07cd53d JH |
105 | #include <sys/times.h> |
106 | #endif | |
463bdbaf | 107 | #ifdef I_SYS_WAIT |
a07cd53d JH |
108 | #include <sys/wait.h> |
109 | #endif | |
110 | /* The gcc -ansi can cause a lot of noise in Solaris because of: | |
111 | /usr/include/sys/resource.h:148: warning: 'struct rlimit64' declared inside parameter list | |
112 | */ | |
113 | int main(int argc, char *argv[]) { | |
114 | ||
115 | /* Add here test code found to be problematic in some gcc platform. */ | |
116 | ||
117 | /* Off_t/off_t is a struct in Solaris with largefiles, and with gcc -ansi | |
118 | * that struct cannot be compared in some gcc releases with a flat | |
119 | * integer, such as a STRLEN. */ | |
120 | ||
215ed6ce | 121 | IV iv; |
a07cd53d JH |
122 | Off_t t0a = 2; |
123 | STRLEN t0b = 3; | |
124 | int t0c = t0a == t0b; | |
125 | ||
215ed6ce AD |
126 | /* In FreeBSD 6.2 (and probably other releases too), with -Duse64bitint, |
127 | perl will use atoll(3). However, that declaration is hidden in <stdlib.h> | |
128 | if we force the compiler to use -std=c89 mode. | |
129 | */ | |
130 | iv = Atol("42"); | |
131 | ||
132 | return (!t0c && (iv == 42)) ? 0 : -1; /* Try to avoid 'unused' warnings. */ | |
a07cd53d JH |
133 | } |
134 | __EOT__ | |
135 | ||
136 | stdflags='' | |
bc730b18 | 137 | |
215ed6ce AD |
138 | # Further gcc warning options. Build up a list of options that work. |
139 | # Note that some problems may only show up with combinations of options, | |
140 | # e.g. a warning might show up only with -Wall -ansi, not with either | |
141 | # one individually. | |
142 | # TODO: Ponder whether to migrate this back to Configure so hints files can | |
143 | # tweak it. Also, be paranoid about whether results we've deduced in Configure | |
144 | # (especially about things like long long, which are not in C89) will still be | |
145 | # valid if we now add flags like -std=c89. | |
146 | ||
bc730b18 JH |
147 | case "$gccversion" in |
148 | '') ;; | |
a07cd53d JH |
149 | [12]*) ;; # gcc versions 1 (gasp!) and 2 are not good for this. |
150 | Intel*) ;; # # Is that you, Intel C++? | |
db7198b5 RB |
151 | *) for opt in -ansi -std=c89 -W -Wextra -Wdeclaration-after-statement \ |
152 | -Wendif-labels -Wc++-compat -Wwrite-strings | |
bc730b18 JH |
153 | do |
154 | case " $ccflags " in | |
a07cd53d JH |
155 | *" $opt "*) ;; # Skip if already there. |
156 | *) rm -f _cflags$_exe | |
4b76cb9d | 157 | case "`$cc -DPERL_NO_INLINE_FUNCTIONS $ccflags $warn $stdflags $opt _cflags.c -o _cflags$_exe 2>&1`" in |
bc730b18 | 158 | *"unrecognized"*) ;; |
215ed6ce | 159 | *"implicit declaration"*) ;; # Was something useful hidden? |
bc730b18 | 160 | *"Invalid"*) ;; |
9ac4c107 | 161 | *"is valid for C"*) ;; |
a07cd53d JH |
162 | *) if test -x _cflags$_exe |
163 | then | |
164 | case "$opt" in | |
165 | -std*) stdflags="$stdflags $opt" ;; | |
166 | *) warn="$warn $opt" ;; | |
167 | esac | |
168 | fi | |
169 | ;; | |
bc730b18 JH |
170 | esac |
171 | ;; | |
172 | esac | |
bc730b18 JH |
173 | done |
174 | ;; | |
175 | esac | |
a07cd53d | 176 | rm -f _cflags.c _cflags$_exe |
bc730b18 | 177 | |
9ac4c107 JH |
178 | case "$gccversion" in |
179 | '') ;; | |
180 | *) | |
3e8416a3 RGS |
181 | if [ "$gccansipedantic" = "" ]; then |
182 | # If we have -Duse64bitint (or equivalent) in effect and the quadtype | |
183 | # has become 'long long', gcc -pedantic becomes unbearable (moreso | |
184 | # when combined with -Wall) because long long and LL and %lld|%Ld | |
185 | # become warn-worthy. So let's drop the -pedantic in that case. | |
186 | case "$quadtype:$sPRId64" in | |
187 | "long long"*|*lld*|*Ld*) | |
188 | ccflags="`echo $ccflags|sed 's/-pedantic/ /'`" | |
189 | warn="`echo $warn|sed 's/-pedantic/ /'`" | |
190 | ;; | |
191 | esac | |
215ed6ce AD |
192 | # Similarly, since 'long long' isn't part of C89, FreeBSD 6.2 headers |
193 | # don't declare atoll() under -std=c89, but we need it. In general, | |
194 | # insisting on -std=c89 is inconsistent with insisting on using | |
195 | # 'long long'. So drop -std=c89 and -ansi as well if we're using | |
196 | # 'long long' as our main integral type. | |
197 | case "$ivtype" in | |
198 | "long long") | |
199 | ccflags=`echo $ccflags|sed -e 's/-pedantic/ /' -e 's/-std=c89/ /' -e 's/-ansi/ /'` | |
200 | warn=`echo $warn|sed -e 's/-pedantic/ /' -e 's/-ansi/ /'` | |
a5105380 | 201 | stdflags=`echo $stdflags|sed -e 's/-std=c89/ /'` |
215ed6ce AD |
202 | ;; |
203 | esac | |
3e8416a3 | 204 | fi |
5cf489d6 RGS |
205 | # Using certain features (like the gcc statement expressions) |
206 | # requires knowing whether -pedantic has been specified. | |
9ac4c107 JH |
207 | case "$warn$ccflags" in |
208 | *-pedantic*) warn="$warn -DPERL_GCC_PEDANTIC" ;; | |
209 | esac | |
a07cd53d JH |
210 | ;; |
211 | esac | |
b1e55cab | 212 | |
10edeb5d | 213 | # Code to set any extra flags here. |
a07cd53d | 214 | extra='' |
11fcce85 | 215 | |
2b317908 | 216 | echo "Extracting cflags (with variable substitutions)" |
44213caa DM |
217 | # This section of the file will have variable substitutions done on it. |
218 | # Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!. | |
219 | # Protect any dollar signs and backticks that you do not want interpreted | |
220 | # by putting a backslash in front. You may delete these comments. | |
165b7424 | 221 | rm -f cflags |
2b317908 | 222 | $spitshell >cflags <<!GROK!THIS! |
ecfc5424 | 223 | $startsh |
bc730b18 | 224 | |
cb9238a7 DM |
225 | # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! |
226 | ||
227 | # This file is generated by cflags.SH | |
228 | ||
229 | ||
11fcce85 | 230 | # Extra warnings, used e.g. for gcc. |
bc730b18 | 231 | warn="$warn" |
11fcce85 JH |
232 | # Extra standardness. |
233 | stdflags="$stdflags" | |
b1e55cab JH |
234 | # Extra extra. |
235 | extra="$extra" | |
dcff826f YO |
236 | # what do executables look like? |
237 | _exe="$_exe" | |
bc730b18 | 238 | |
2b317908 LW |
239 | !GROK!THIS! |
240 | ||
44213caa | 241 | # In the following dollars and backticks do not need the extra backslash. |
2b317908 | 242 | $spitshell >>cflags <<'!NO!SUBS!' |
a02608de | 243 | case $PERL_CONFIG_SH in |
2b317908 | 244 | '') |
a0d0e21e LW |
245 | if test -f config.sh; then TOP=.; |
246 | elif test -f ../config.sh; then TOP=..; | |
247 | elif test -f ../../config.sh; then TOP=../..; | |
248 | elif test -f ../../../config.sh; then TOP=../../..; | |
249 | elif test -f ../../../../config.sh; then TOP=../../../..; | |
250 | else | |
251 | echo "Can't find config.sh."; exit 1 | |
252 | fi | |
253 | . $TOP/config.sh | |
254 | ;; | |
255 | esac | |
256 | ||
ba0f5503 DM |
257 | # syntax: cflags [optimize=XXX] [file[.suffix]] ... |
258 | # displays the proposed compiler command line for each 'file' | |
259 | # | |
260 | # with no file, dispalys it for all *.c files. | |
261 | # The optimise=XXX arg (if present) is evalled, setting the default | |
262 | # value of the $optimise variable, which is output on the command line | |
263 | # (but which may be overridden for specific files below) | |
75550b4e | 264 | |
1167a30e | 265 | case "X$1" in |
26102cc7 | 266 | Xoptimize=*|X"optimize=*") |
1167a30e IZ |
267 | eval "$1" |
268 | shift | |
269 | ;; | |
270 | esac | |
271 | ||
1c3d792e LW |
272 | case $# in |
273 | 0) set *.c; echo "The current C flags are:" ;; | |
1c3d792e | 274 | esac |
2b317908 | 275 | |
578789a7 | 276 | set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g' -e "s/\\$obj_ext / /g"` |
2b317908 | 277 | |
1c3d792e LW |
278 | for file do |
279 | ||
280 | case "$#" in | |
281 | 1) ;; | |
2b317908 | 282 | *) echo $n " $file.c $c" ;; |
1c3d792e LW |
283 | esac |
284 | ||
44213caa | 285 | # allow variables like toke_cflags to be evaluated |
2b317908 | 286 | |
8736538c AS |
287 | if echo $file | grep -v / >/dev/null |
288 | then | |
289 | eval 'eval ${'"${file}_cflags"'-""}' | |
290 | fi | |
2b317908 | 291 | |
44213caa | 292 | # or customize here |
2b317908 | 293 | |
1c3d792e | 294 | case "$file" in |
1c3d792e | 295 | *) ;; |
5729ffdd | 296 | |
44213caa | 297 | # Customization examples follow: |
5729ffdd NC |
298 | av) ccflags=`echo $ccflags | sed -e s/-pipe//` ;; |
299 | deb) ccflags="$ccflags -fno-jump-tables" ;; | |
300 | hv) warn=`echo $warn | sed -e s/-Wextra//` ;; | |
301 | toke) optimize=-O0 ;; | |
1c3d792e LW |
302 | esac |
303 | ||
44213caa DM |
304 | # The examples are intentionally unreachable as the '*)' case always |
305 | # matches. To use them, move before the '*)' and edit as appropriate. | |
306 | # It is not a good idea to set ccflags to an absolute value here, as it | |
307 | # often contains general -D defines which are needed for correct | |
308 | # compilation. It is better to edit ccflags as shown, using interpolation | |
309 | # to add flags, or sed to remove flags. | |
5729ffdd NC |
310 | |
311 | ||
a7d59441 YO |
312 | case "$cc" in |
313 | *g++*) | |
314 | # Extra paranoia in case people have bad canned ccflags: | |
315 | # bad in the sense that the flags are accepted by g++, | |
316 | # but then whined about. | |
317 | for f in -Wdeclaration-after-statement -std=c89 | |
318 | do | |
319 | ccflags=`echo $ccflags|sed 's/$f/ /'` | |
320 | done | |
321 | ;; | |
322 | esac | |
323 | cppflags=`echo $cppflags|sed 's/-Wdeclaration-after-statement/ /'` | |
324 | ||
325 | case "$cc" in | |
eb387cb8 | 326 | *clang*) |
d5db65c0 RU |
327 | # clang complains a lot about -Wunused-value which are not fixable |
328 | warn="$warn -Wno-unused-value" | |
329 | ;; | |
a7d59441 YO |
330 | *g++*) |
331 | # Without -Wno-unused-variable g++ 4.x compiles are rather unwatchable | |
332 | # because of all the warnings about Perl___notused, and g++ doesn't do | |
333 | # __attribute__((unused)) (and even if at some stage it may, people do | |
334 | # have older gcc installations), and ((void)x) isn't enough to silence | |
335 | # the noises about XS functions not using their cv parameter, so we need | |
336 | # the -Wno-unused-parameter too. | |
337 | # Yes, we lose some valid warnings, but hopefully other compilers | |
338 | # (like gcc) will still pick up those warnings. | |
339 | for o in -Wno-unused-variable -Wno-unused-parameter | |
340 | do | |
341 | case "$warn" in | |
342 | *$o*) ;; | |
343 | *) warn="$warn $o" ;; | |
344 | esac | |
345 | done | |
346 | ;; | |
7a5b1e22 FC |
347 | *) |
348 | # clang may not be called clang | |
349 | case "`$cc -v 2>&1`" in | |
350 | *clang*) | |
351 | case "$warn" in | |
352 | *-Wno-unused-value) ;; | |
353 | *) warn="$warn -Wno-unused-value" | |
354 | esac | |
355 | esac | |
7e827271 | 356 | esac |
666ea192 | 357 | |
69c7f294 | 358 | |
44213caa | 359 | # Can we perhaps use $ansi2knr here |
b1e55cab | 360 | echo "$cc -c -DPERL_CORE $ccflags $stdflags $optimize $warn $extra" |
2b317908 | 361 | |
a0d0e21e | 362 | . $TOP/config.sh |
2b317908 | 363 | |
a7d59441 | 364 | # end per file behaviour |
1c3d792e | 365 | done |
2b317908 | 366 | !NO!SUBS! |
a0d0e21e | 367 | chmod 755 cflags |
2b317908 | 368 | $eunicefix cflags |