This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
164f16d48734e4e1e40689cdb03e82fddd6f9df6
[metaconfig.git] / U / compline / ccflags.U
1 ?RCS: $Id: ccflags.U,v 3.0.1.9 1997/02/28 15:27:07 ram Exp $
2 ?RCS:
3 ?RCS: Copyright (c) 1991-1993, Raphael Manfredi
4 ?RCS:
5 ?RCS: You may redistribute only under the terms of the Artistic Licence,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic Licence; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 3.0.
10 ?RCS:
11 ?RCS: $Log: ccflags.U,v $
12 ?RCS: Revision 3.0.1.9  1997/02/28  15:27:07  ram
13 ?RCS: patch61: removed support for NO_PROTOTYPE detection on SCO
14 ?RCS: patch61: new locincpth variable
15 ?RCS: patch61: added info on the "additional ld flags" question
16 ?RCS:
17 ?RCS: Revision 3.0.1.8  1995/07/25  13:48:54  ram
18 ?RCS: patch56: re-arranged compile line to include ldflags before objects
19 ?RCS:
20 ?RCS: Revision 3.0.1.7  1995/05/12  12:08:33  ram
21 ?RCS: patch54: now checks for cc/ccflags/ldflags coherency
22 ?RCS:
23 ?RCS: Revision 3.0.1.6  1994/10/29  16:07:02  ram
24 ?RCS: patch36: gcc versionning no longer relies on the C compiler's name
25 ?RCS: patch36: simplified check for gcc version checking (ADO)
26 ?RCS:
27 ?RCS: Revision 3.0.1.5  1994/08/29  16:06:35  ram
28 ?RCS: patch32: propagate -posix flag from ccflags to ldflags
29 ?RCS:
30 ?RCS: Revision 3.0.1.4  1994/05/06  14:28:45  ram
31 ?RCS: patch23: -fpcc-struct-return only needed in gcc 1.x (ADO)
32 ?RCS: patch23: cppflags now computed on an option-by-option basis
33 ?RCS: patch23: magically added cc flags now only done the first time
34 ?RCS:
35 ?RCS: Revision 3.0.1.3  1993/09/13  15:58:29  ram
36 ?RCS: patch10: explicitely mention -DDEBUG just in case they need it (WAD)
37 ?RCS: patch10: removed all the "tans" variable usage (WAD)
38 ?RCS:
39 ?RCS: Revision 3.0.1.2  1993/08/27  14:39:38  ram
40 ?RCS: patch7: added support for OSF/1 machines
41 ?RCS:
42 ?RCS: Revision 3.0.1.1  1993/08/25  14:00:24  ram
43 ?RCS: patch6: added defaults for cppflags, ccflags and ldflags
44 ?RCS:
45 ?RCS: Revision 3.0  1993/08/18  12:05:31  ram
46 ?RCS: Baseline for dist 3.0 netwide release.
47 ?RCS:
48 ?MAKE:ccflags ldflags lkflags cppflags optimize locincpth: test cat \
49         Myread Guess Options Oldconfig +gccversion mips_type +usrinc \
50         package contains rm +cc cppstdin cppminus cpprun cpplast libpth \
51         libs loclibpth hint usesocks sh run
52 ?MAKE:  -pick add $@ %<
53 ?S:ccflags:
54 ?S:     This variable contains any additional C compiler flags desired by
55 ?S:     the user.  It is up to the Makefile to use this.
56 ?S:.
57 ?S:cppflags:
58 ?S:     This variable holds the flags that will be passed to the C pre-
59 ?S:     processor. It is up to the Makefile to use it.
60 ?S:.
61 ?S:optimize:
62 ?S:     This variable contains any optimizer/debugger flag that should be used.
63 ?S:     It is up to the Makefile to use it.
64 ?S:.
65 ?S:ldflags:
66 ?S:     This variable contains any additional C loader flags desired by
67 ?S:     the user.  It is up to the Makefile to use this.
68 ?S:.
69 ?S:lkflags:
70 ?S:     This variable contains any additional C partial linker flags desired by
71 ?S:     the user.  It is up to the Makefile to use this.
72 ?S:.
73 ?S:locincpth:
74 ?S:     This variable contains a list of additional directories to be
75 ?S:     searched by the compiler.  The appropriate '-I' directives will
76 ?S:     be added to ccflags.  This is intended to simplify setting
77 ?S:     local directories from the Configure command line.
78 ?S:     It's not much, but it parallels the loclibpth stuff in libpth.U.
79 ?S:.
80 ?T:inctest thisincl xxx flag inclwanted ftry previous thislibdir
81 ?T:EBUGGING DEBUGGING
82 ?D:cppflags=''
83 ?D:ccflags=''
84 ?D:ldflags=''
85 ?D:optimize=''
86 ?INIT:: Possible local include directories to search.
87 ?INIT:: Set locincpth to "" in a hint file to defeat local include searches.
88 ?INIT:locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
89 ?INIT:locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include"
90 ?INIT::
91 ?INIT:: no include file wanted by default
92 ?INIT:inclwanted=''
93 ?INIT:
94 ?INIT:: Enable -DEBUGGING and -DDEBUGGING from the command line
95 ?INIT:EBUGGING=''
96 ?INIT:DEBUGGING=old
97 ?INIT:
98 : determine optimization, if desired, or use for debug flag also
99 ?X: Allow for Configure -Uoptimize -- it's not strictly sensible, but
100 ?X: it has happened and we know what they mean.   AD  2/16/98
101 case "$optimize" in
102 ' '|$undef) dflt='none';;
103 '') dflt='-O';;
104 *) dflt="$optimize";;
105 esac
106 $cat <<EOH
107
108 By default, $package compiles with the -O flag to use the optimizer.
109 Alternately, you might want to use the symbolic debugger, which uses
110 the -g flag (on traditional Unix systems).  Either flag can be
111 specified here.  To use neither flag, specify the word "none".
112
113 EOH
114 rp="What optimizer/debugger flag should be used?"
115 . ./myread
116 optimize="$ans"
117 case "$optimize" in
118 'none') optimize=" ";;
119 esac
120
121 : Check what DEBUGGING is required from the command line
122 : -DEBUGGING      or -DDEBUGGING or
123 : -DEBUGGING=both                       = -g + -DDEBUGGING
124 : -DEBUGGING=-g   or -Doptimize=-g      = -g
125 : -DEBUGGING=none or -UDEBUGGING        =
126 : -DEBUGGING=old  or -DEBUGGING=default = ? $optimize
127 case "$EBUGGING" in
128 '')     ;;
129 *)      DEBUGGING=$EBUGGING ;;
130 esac
131
132 case "$DEBUGGING" in
133 -g|$define)
134     case "$optimize" in
135         *-g*) ;;
136         *)    optimize="$optimize -g" ;;
137     esac ;;
138 none|$undef)
139     case "$optimize" in
140         *-g*)   set `echo "X $optimize " | sed 's/ -g / /'`
141                 shift
142                 optimize="$*"
143                 ;;
144     esac ;;
145 esac
146
147 dflt=''
148 case "$DEBUGGING" in
149 both|$define) dflt='-DDEBUGGING'
150 esac
151
152 : We will not override a previous value, but we might want to
153 : augment a hint file
154 case "$hint" in
155 default|recommended)
156         case "$gccversion" in
157         1*) dflt="$dflt -fpcc-struct-return" ;;
158         esac
159         case "$optimize:$DEBUGGING" in
160         *-g*:old) dflt="$dflt -DDEBUGGING";;
161         esac
162 ?X: check for POSIXized ISC
163         case "$gccversion" in
164         2*) if test -d /etc/conf/kconfig.d &&
165                         $contains _POSIX_VERSION $usrinc/sys/unistd.h >/dev/null 2>&1
166                 then
167                         # Interactive Systems (ISC) POSIX mode.
168                         dflt="$dflt -posix"
169                 fi
170                 ;;
171         esac
172 ?X: If the user has gcc-2.95 or greater, try adding -fno-strict-alias.
173 ?X: Since the gcc "version" can be non-numeric, e.g.
174 ?X: "2.95.1 19990809 (prerelease)" , we'll do the test on any version
175 ?X: greater than 2.8.
176 ?X:     --Andy Dougherty  27 Aug 1999
177         case "$gccversion" in
178         1*) ;;
179         2.[0-8]*) ;;
180         ?*)     echo " "
181                 echo "Checking if your compiler accepts -fno-strict-aliasing" 2>&1
182                 echo 'int main(void) { return 0; }' > gcctest.c
183                 if $cc -O2 -fno-strict-aliasing -o gcctest gcctest.c; then
184                         echo "Yes, it does." 2>&1
185                         case "$ccflags" in
186                         *strict-aliasing*)
187                                 echo "Leaving current flags $ccflags alone." 2>&1
188                                 ;;
189                         *) dflt="$dflt -fno-strict-aliasing" ;;
190                         esac
191                 else
192                         echo "Nope, it doesn't, but that's ok." 2>&1
193                 fi
194                 ;;
195         esac
196 ?X: HMB 200405
197 ?X: -pipe has shown a compile time speedup of about 40% on Linux and HP-UX
198 ?X: and also worked on cygwin-1.5.9
199 ?X: If a system fails, disable it in the hints. 99% of gcc uses binutils
200         # For gcc, adding -pipe speeds up compilations for some, but apparently
201         # some assemblers can't read from stdin.  (It also slows down compilations
202         # in other cases, but those are apparently rarer these days.)  AD 5/2004.
203         case "$gccversion" in
204         ?*)     echo " "
205                 echo "Checking if your compiler accepts -pipe" 2>&1
206                 echo 'int main(void) { return 0; }' > gcctest.c
207                 if $cc -pipe -o gcctest gcctest.c; then
208                         echo "Yes, it does." 2>&1
209                         case "$ccflags" in
210                         *-pipe*)
211                                 echo "Leaving current flags $ccflags alone." 2>&1
212                                 ;;
213                         *) dflt="$dflt -pipe" ;;
214                         esac
215                 else
216                         echo "Nope, it doesn't, but that's ok." 2>&1
217                 fi
218
219                 echo "Checking if your compiler accepts -Wdeclaration-after-statement" 2>&1
220                 echo 'int main(void) { return 0; }' > gcctest.c
221                 if $cc -Wdeclaration-after-statement -o gcctest gcctest.c; then
222                         echo "Yes, it does." 2>&1
223                         case "$ccflags" in
224                         *-Wdeclaration-after-statement*)
225                                 echo "Leaving current flags $ccflags alone." 2>&1
226                                 ;;
227                         *) dflt="$dflt -Wdeclaration-after-statement" ;;
228                         esac
229                 else
230                         echo "Nope, it doesn't, but that's ok." 2>&1
231                 fi
232                 ;;
233         esac
234         ;;
235 esac
236
237 ?X: In USG mode, a MIPS system may need some BSD includes
238 case "$mips_type" in
239 *BSD*|'') inclwanted="$locincpth $usrinc";;
240 *) inclwanted="$locincpth $inclwanted $usrinc/bsd";;
241 esac
242 for thisincl in $inclwanted; do
243         if $test -d $thisincl; then
244                 if $test x$thisincl != x$usrinc; then
245                         case "$dflt" in
246                         *" -I$thisincl "*);;
247                         *) dflt="$dflt -I$thisincl ";;
248                         esac
249                 fi
250         fi
251 done
252
253 ?X: Include test function (header, symbol)
254 inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then
255         xxx=true;
256 elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then
257         xxx=true;
258 else
259         xxx=false;
260 fi;
261 if $xxx; then
262         case "$dflt" in
263         *$2*);;
264         *) dflt="$dflt -D$2";;
265         esac;
266 fi'
267
268 set signal.h LANGUAGE_C; eval $inctest
269
270 case "$usesocks" in
271 $define)
272         ccflags="$ccflags -DSOCKS"
273         ;;
274 esac
275
276 case "$hint" in
277 default|recommended) dflt="$ccflags $dflt" ;;
278 *) dflt="$ccflags";;
279 esac
280
281 case "$dflt" in
282 ''|' ') dflt=none;;
283 esac
284
285 $cat <<EOH
286
287 Your C compiler may want other flags.  For this question you should include
288 -I/whatever and -DWHATEVER flags and any other flags used by the C compiler,
289 but you should NOT include libraries or ld flags like -lwhatever.  If you
290 want $package to honor its debug switch, you should include -DDEBUGGING here.
291 Your C compiler might also need additional flags, such as -D_POSIX_SOURCE.
292
293 To use no flags, specify the word "none".
294
295 EOH
296 ?X: strip leading space
297 set X $dflt
298 shift
299 dflt=${1+"$@"}
300 rp="Any additional cc flags?"
301 . ./myread
302 case "$ans" in
303 none) ccflags='';;
304 *) ccflags="$ans";;
305 esac
306
307 : the following weeds options from ccflags that are of no interest to cpp
308 case "$cppflags" in
309 '') cppflags="$ccflags" ;;
310 *)  cppflags="$cppflags $ccflags" ;;
311 esac
312 case "$gccversion" in
313 1*) cppflags="$cppflags -D__GNUC__"
314 esac
315 case "$mips_type" in
316 '');;
317 *BSD*) cppflags="$cppflags -DSYSTYPE_BSD43";;
318 esac
319 case "$cppflags" in
320 '');;
321 *)
322         echo " "
323         echo "Let me guess what the preprocessor flags are..." >&4
324         set X $cppflags
325         shift
326         cppflags=''
327         $cat >cpp.c <<'EOM'
328 #define BLURFL foo
329
330 BLURFL xx LFRULB
331 EOM
332 ?X:
333 ?X: For each cc flag, try it out with both cppstdin and cpprun, since the
334 ?X: first is almost surely a cc wrapper. We have to try both in case
335 ?X: of cc flags like '-Olimit 2900' that are actually two words...
336 ?X:
337         previous=''
338         for flag in $*
339         do
340                 case "$flag" in
341                 -*) ftry="$flag";;
342                 *) ftry="$previous $flag";;
343                 esac
344                 if $cppstdin -DLFRULB=bar $cppflags $ftry $cppminus <cpp.c \
345                         >cpp1.out 2>/dev/null && \
346                         $cpprun -DLFRULB=bar $cppflags $ftry $cpplast <cpp.c \
347                         >cpp2.out 2>/dev/null && \
348                         $contains 'foo.*xx.*bar' cpp1.out >/dev/null 2>&1 && \
349                         $contains 'foo.*xx.*bar' cpp2.out >/dev/null 2>&1
350                 then
351                         cppflags="$cppflags $ftry"
352                         previous=''
353                 else
354                         previous="$flag"
355                 fi
356         done
357         set X $cppflags
358         shift
359         cppflags=${1+"$@"}
360         case "$cppflags" in
361         *-*)  echo "They appear to be: $cppflags";;
362         esac
363         $rm -f cpp.c cpp?.out
364         ;;
365 esac
366
367 : flags used in final linking phase
368 case "$ldflags" in
369 '') if ./venix; then
370                 dflt='-i -z'
371         else
372                 dflt=''
373         fi
374         case "$ccflags" in
375         *-posix*) dflt="$dflt -posix" ;;
376         esac
377         ;;
378 *) dflt="$ldflags";;
379 esac
380
381 : Try to guess additional flags to pick up local libraries.
382 for thislibdir in $libpth; do
383         case " $loclibpth " in
384         *" $thislibdir "*)
385                 case "$dflt " in
386                 *"-L$thislibdir "*) ;;
387                 *)  dflt="$dflt -L$thislibdir" ;;
388                 esac
389                 ;;
390         esac
391 done
392
393 case "$dflt" in
394 '') dflt='none' ;;
395 esac
396
397 $cat <<EOH
398
399 Your C linker may need flags.  For this question you should
400 include -L/whatever and any other flags used by the C linker, but you
401 should NOT include libraries like -lwhatever.
402
403 Make sure you include the appropriate -L/path flags if your C linker
404 does not normally search all of the directories you specified above,
405 namely
406         $libpth
407 To use no flags, specify the word "none".
408
409 EOH
410
411 rp="Any additional ld flags (NOT including libraries)?"
412 . ./myread
413 case "$ans" in
414 none) ldflags='';;
415 *) ldflags="$ans";;
416 esac
417 rmlist="$rmlist pdp11"
418
419 @if lkflags
420 : partial linking may need other flags
421 case "$lkflags" in
422 '') case "$ldflags" in
423         '') dflt='none';;
424         *) dflt="$ldflags";;
425         esac;;
426 *) dflt="$lkflags";;
427 esac
428 echo " "
429 rp="Partial linking flags to be used (NOT including -r)?"
430 . ./myread
431 case "$ans" in
432 none) lkflags='';;
433 *) lkflags="$ans";;
434 esac
435
436 @end
437 ?X:
438 ?X: If the user changes compilers after selecting a hint file, it's
439 ?X: possible that the suggested ccflags/ldflags will be wrong.  Try to
440 ?X: compile and run a simple test program.  Let the user see all the
441 ?X: error messages. -- ADO and RAM
442 ?X: Sometimes, particularly on Linux systems, there is a bad library
443 ?X: (e.g. a dangling symlink or incompatible library or a "run-time"
444 ?X: version but not a "development" version of a library).  This test
445 ?X: will catch those sorts of problems too, though how to fix them
446 ?X: may not be obvious.
447 ?X:
448 : coherency check
449 echo " "
450 echo "Checking your choice of C compiler and flags for coherency..." >&4
451 $cat > try.c <<'EOF'
452 #include <stdio.h>
453 int main() { printf("Ok\n"); return(0); }
454 EOF
455 ?X: Strip extra blanks in case some of the following variables are empty
456 set X $cc -o try $optimize $ccflags $ldflags try.c $libs
457 shift
458 $cat >try.msg <<'EOM'
459 I've tried to compile and run the following simple program:
460
461 EOM
462 $cat try.c >> try.msg
463
464 $cat >> try.msg <<EOM
465
466 I used the command:
467
468         $*
469         $run ./try
470
471 and I got the following output:
472
473 EOM
474 dflt=y
475 ?X: Use "sh -c" to avoid error messages tagged with leading "Configure:".
476 ?X: We need to try the resulting executable, because cc might yield a 0 status
477 ?X: even when ld failed, in which case the executable will not run properly,
478 ?X: if its x bit is set at all...
479 ?X:
480 ?X: Also check the xxx=`$run ./try` output to check for misconfigured -lsfio.
481 ?X: If sfio's iffe goofed and it uses _exit instead of exit, then the
482 ?X: output buffers don't get flushed and we don't see any output
483 ?X: when run from within `backticks`.  What fun.
484 ?X: --Andy Dougherty 2/13/1998
485 if $sh -c "$cc -o try $optimize $ccflags $ldflags try.c $libs" >>try.msg 2>&1; then
486         if $sh -c "$run ./try" >>try.msg 2>&1; then
487                 xxx=`$run ./try`
488                 case "$xxx" in
489                 "Ok") dflt=n ;;
490                 *)      echo 'The program compiled OK, but produced no output.' >> try.msg
491                         case " $libs " in
492                         *" -lsfio "*)
493                                 cat >> try.msg <<'EOQS'
494 If $libs contains -lsfio, and sfio is mis-configured, then it
495 sometimes (apparently) runs and exits with a 0 status, but with no
496 output!  It may have to do with sfio's use of _exit vs. exit.
497
498 EOQS
499                                 rp="You have a big problem.  Shall I abort Configure"
500                                 dflt=y
501                                 ;;
502                         esac
503                         ;;
504                 esac
505         else
506                 echo "The program compiled OK, but exited with status $?." >>try.msg
507                 rp="You have a problem.  Shall I abort Configure"
508                 dflt=y
509         fi
510 else
511         echo "I can't compile the test program." >>try.msg
512         rp="You have a BIG problem.  Shall I abort Configure"
513         dflt=y
514 fi
515 case "$dflt" in
516 y)
517         $cat try.msg >&4
518 ?X: using -K will prevent default aborting--maybe they're cross compiling?
519         case "$knowitall" in
520         '')
521                 echo "(The supplied flags or libraries might be incorrect.)"
522                 ;;
523         *) dflt=n;;
524         esac
525         echo " "
526         . ./myread
527         case "$ans" in
528         n*|N*) ;;
529         *)      echo "Ok.  Stopping Configure." >&4
530                 exit 1
531                 ;;
532         esac
533         ;;
534 n) echo "OK, that should do.";;
535 esac
536 $rm -f try try.* core
537