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