This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix .gitignore: only ignore 'perl' in root of repo, not U/perl subdir
[metaconfig.git] / U / perl / dlsrc.U
1 ?RCS: $Id: dlsrc.U,v$
2 ?RCS:
3 ?RCS: Copyright (c) 1996-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 ?RCS: $Log: dlsrc.U,v $
9 ?RCS:
10 ?X:  hpux support thanks to Jeff Okamoto <okamoto@hpcc101.corp.hp.com>
11 ?X:
12 ?X:  To create a shared library, you must compile ALL source files in the
13 ?X:  library with +z (or possibly +Z if the library is whopping huge),
14 ?X:  then link the library with -b.  Example:
15 ?X:       cc -c +z module_a.c
16 ?X:       cc -c +z module_b.c
17 ?X:       ld -b module_a.o module_b.o -o module.sl
18 ?X:
19 ?MAKE:usedl ld dlsrc cccdlflags lddlflags ccdlflags bin_ELF ld_can_script: \
20         rm_try Getfile Myread test osname sed d_dlopen Findhdr Setvar \
21         src run cc ccflags ldflags optimize ls gccversion cat rsrc i_stdlib \
22         i_unistd osvers sysroot
23 ?MAKE:  -pick add $@ %<
24 ?Y:BOTTOM
25 ?S:usedl:
26 ?S:     This variable indicates if the system supports dynamic
27 ?S:     loading of some sort.  See also dlsrc and dlobj.
28 ?S:.
29 ?S:ld:
30 ?S:     This variable indicates the program to be used to link
31 ?S:     libraries for dynamic loading.  On some systems, it is 'ld'.
32 ?S:     On ELF systems, it should be $cc.  Mostly, we'll try to respect
33 ?S:     the hint file setting.
34 ?S:.
35 ?S:dlsrc:
36 ?S:     This variable contains the name of the dynamic loading file that
37 ?S:     will be used with the package.
38 ?S:.
39 ?S:cccdlflags:
40 ?S:     This variable contains any special flags that might need to be
41 ?S:     passed with 'cc -c' to compile modules to be used to create a shared
42 ?S:     library that will be used for dynamic loading.  For hpux, this
43 ?S:     should be +z.  It is up to the makefile to use it.
44 ?S:.
45 ?S:lddlflags:
46 ?S:     This variable contains any special flags that might need to be
47 ?S:     passed to $ld to create a shared library suitable for dynamic
48 ?S:     loading.  It is up to the makefile to use it.  For hpux, it
49 ?S:     should be '-b'.  For sunos 4.1, it is empty.
50 ?S:.
51 ?S:ccdlflags:
52 ?S:     This variable contains any special flags that might need to be
53 ?S:     passed to cc to link with a shared library for dynamic loading.
54 ?S:     It is up to the makefile to use it.  For sunos 4.1, it should
55 ?S:     be empty.
56 ?S:.
57 ?S:bin_ELF:
58 ?S:     This variable saves the result from configure if generated binaries
59 ?S:     are in ELF format. Only set to defined when the test has actually
60 ?S:     been performed, and the result was positive.
61 ?S:.
62 ?S:ld_can_script:
63 ?S:     This variable shows if the loader accepts scripts in the form of
64 ?S:     -Wl,--version-script=ld.script. This is currently only supported
65 ?S:     for GNU ld on ELF in dynamic loading builds.
66 ?S:.
67 ?C:USE_DYNAMIC_LOADING ~ %<:
68 ?C:     This symbol, if defined, indicates that dynamic loading of
69 ?C:     some sort is available.
70 ?C:.
71 ?H:?%<:#$usedl USE_DYNAMIC_LOADING              /**/
72 ?H:.
73 ?W:%<:dlopen
74 ?T:dldir thisflag tdir
75 ?F:!a.out
76 : determine which dynamic loading, if any, to compile in
77 echo " "
78 dldir="ext/DynaLoader"
79 case "$usedl" in
80     $define|y|true)
81         dflt='y'
82         usedl="$define"
83         ;;
84     $undef|n|false)
85         dflt='n'
86         usedl="$undef"
87         ;;
88     *)
89         dflt='n'
90         case "$d_dlopen" in
91             $define) dflt='y' ;;
92         esac
93         : Does a dl_xxx.xs file exist for this operating system
94         $test -f $rsrc/$dldir/dl_${osname}.xs && dflt='y'
95         ;;
96 esac
97 rp="Do you wish to use dynamic loading?"
98 . ./myread
99 usedl="$ans"
100 bin_ELF="$undef"
101 case "$ans" in
102     y*) usedl="$define"
103         case "$dlsrc" in
104             '') if $test -f $rsrc/$dldir/dl_${osname}.xs ; then
105                     dflt="$dldir/dl_${osname}.xs"
106                 elif $test "$d_dlopen" = "$define" ; then
107                     dflt="$dldir/dl_dlopen.xs"
108                 else
109                     dflt=''
110                 fi
111                 ;;
112             *)  dflt="$dldir/$dlsrc"
113                 ;;
114         esac
115         echo "The following dynamic loading files are available:"
116         : Can not go over to $dldir because getfile has path hard-coded in.
117         tdir=`pwd`; cd "$rsrc"; $ls -C $dldir/dl*.xs; cd "$tdir"
118         rp="Source file to use for dynamic loading"
119         fn="fne"
120         gfpth="$src"
121         . ./getfile
122         usedl="$define"
123         : emulate basename
124         dlsrc=`echo $ans | $sed -e 's%.*/\([^/]*\)$%\1%'`
125
126         $cat << EOM
127
128 Some systems may require passing special flags to $cc -c to
129 compile modules that will be used to create a shared library.
130 To use no flags, say "none".
131
132 EOM
133         case "$cccdlflags" in
134             '') case "$gccversion" in
135                 '') case "$osname" in
136                         hpux)   dflt='+z' ;;
137                         irix*)  dflt='-KPIC' ;;
138                         svr4*|esix*|solaris|nonstopux) dflt='-KPIC' ;;
139                         sunos)  dflt='-pic' ;;
140                         *)      dflt='none' ;;
141                     esac
142                     ;;
143                 *)  case "$osname" in
144                         darwin) dflt='none' ;;
145                         *linux*|svr4*|esix*|solaris|nonstopux) dflt='-fPIC' ;;
146                         *)      dflt='-fpic' ;;
147                     esac ;;
148                 esac ;;
149             ' ') dflt='none' ;;
150             *)   dflt="$cccdlflags" ;;
151         esac
152
153         case "$dflt" in
154             none) dflt='' ;;
155         esac
156
157         # If -Dsysroot was specified, now's the time to add it
158         # to cccdlflags
159         if test "X$sysroot" != X; then
160             case "$gccversion" in
161                 '') ;;
162                 *)  case "$dflt" in
163                         *sysroot*) ;;
164                         'undef'|*)
165                             dflt="$dflt --sysroot=$sysroot" ;;
166                     esac
167                     ;;
168             esac
169         fi
170
171         case "$dflt" in
172             '') dflt='none';;
173         esac
174
175         rp="Any special flags to pass to $cc -c to compile shared library modules?"
176         . ./myread
177         case "$ans" in
178 ?X: Use ' ' so that a subsequent Configure run preserves the old state.
179             none) cccdlflags=' ' ;;
180             *)    cccdlflags="$ans" ;;
181         esac
182
183         cat << EOM
184
185 Some systems use ld to create libraries that can be dynamically loaded,
186 while other systems (such as those using ELF) use $cc.
187
188 EOM
189
190 : Determine if this is ELF
191         $cat >try.c <<EOM
192 /* Test for whether ELF binaries are produced */
193 #include <fcntl.h>
194 #$i_stdlib I_STDLIB
195 #ifdef I_STDLIB
196 #include <stdlib.h>
197 #endif
198 #$i_unistd I_UNISTD
199 #ifdef I_UNISTD
200 #include <unistd.h>
201 #endif
202 int main() {
203     char b[4];
204     int i = open("a.out",O_RDONLY);
205     if(i == -1)
206         exit(1); /* fail */
207     if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
208         exit(0); /* succeed (yes, it is ELF) */
209     exit(1); /* fail */
210 }
211 EOM
212         if $cc $ccflags $ldflags -o a.out try.c >/dev/null 2>&1 && $run ./a.out; then
213             bin_ELF="$define"
214         fi
215         $rm_try
216
217         case "$ld" in
218             '') if $test $bin_ELF = "$define"; then
219                     cat <<EOM
220 You appear to have ELF support.  I'll use $cc to build dynamic libraries.
221 EOM
222                     dflt="$cc"
223                 else
224                     echo "I'll use ld to build dynamic libraries."
225                     dflt='ld'
226                 fi
227                 ;;
228             *)  dflt="$ld"
229                 ;;
230         esac
231
232         rp="What command should be used to create dynamic libraries?"
233         . ./myread
234         ld="$ans"
235
236         cat << EOM
237
238 Some systems may require passing special flags to $ld to create a
239 library that can be dynamically loaded.  If your ld flags include
240 -L/other/path options to locate libraries outside your loader's normal
241 search path, you may need to specify those -L options here as well.  To
242 use no flags, say "none".
243
244 EOM
245         case "$lddlflags" in
246             '') case "$osname" in
247                     haiku) dflt='-shared' ;;
248                     hpux) dflt='-b';
249                           case "$gccversion" in
250                               '') dflt="$dflt +vnocompatwarnings" ;;
251                           esac
252                           ;;
253                     *linux*|irix*|gnu*)  dflt="-shared $optimize" ;;
254                     solaris) # See [perl #66604].
255                             # On Solaris 11, gcc -m64 on amd64
256                             # appears not to understand -G.  gcc versions at
257                             # least as old as 3.4.3 support -shared, so just
258                             # use that with Solaris 11 and later, but keep
259                             # the old behavior for older Solaris versions.
260                             case "$gccversion" in
261                                 '') dflt='-G' ;;
262                                 *)  case "$osvers" in
263                                         2.?|2.10) dflt='-G' ;;
264                                         *) dflt='-shared' ;;
265                                     esac
266                                     ;;
267                             esac
268                             ;;
269                     sunos) dflt='-assert nodefinitions' ;;
270                     svr4*|esix*|nonstopux) dflt="-G $ldflags" ;;
271                     *)     dflt='none' ;;
272                 esac
273                 ;;
274             *) dflt="$lddlflags" ;;
275         esac
276
277         : Only do this for gcc, since, for example, qcc has no concept
278         : of --sysroot.
279         if $test "X$sysroot" != X; then
280             case "$gccversion" in
281                 '') ;;
282                 *)  dflt="$dflt --sysroot $sysroot" ;;
283             esac
284         fi
285
286         : Try to guess additional flags to pick up local libraries.
287         : Be careful not to append to a plain 'none'
288         case "$dflt" in
289             none) dflt='' ;;
290         esac
291         for thisflag in $ldflags; do
292             case "$thisflag" in
293                 -L*|-R*|-Wl,-R*)
294                     case " $dflt " in
295                         *" $thisflag "*) ;;
296                         *) dflt="$dflt $thisflag" ;;
297                     esac
298                     ;;
299             esac
300         done
301
302         case "$dflt" in
303             ''|' ') dflt='none' ;;
304         esac
305
306         case "$ldflags" in
307             *-fstack-protector-strong*)
308                 case "$dflt" in
309                     *-fstack-protector-strong*) ;; # Don't add it again
310                     *) dflt="$dflt -fstack-protector-strong" ;;
311                 esac
312                 ;;
313             *-fstack-protector*)
314                 case "$dflt" in
315                     *-fstack-protector*) ;; # Don't add it again
316                     *) dflt="$dflt -fstack-protector" ;;
317                 esac
318                 ;;
319         esac
320
321         rp="Any special flags to pass to $ld to create a dynamically loaded library?"
322         . ./myread
323         case "$ans" in
324 ?X: Use ' ' so that a subsequent Configure run preserves the old state.
325             none) lddlflags=' ' ;;
326             *) lddlflags="$ans" ;;
327         esac
328
329         cat <<EOM
330
331 Some systems may require passing special flags to $cc to indicate that
332 the resulting executable will use dynamic linking.  To use no flags,
333 say "none".
334
335 EOM
336         case "$ccdlflags" in
337             '') case "$osname" in
338                     *linux*|hpux|gnu*) dflt='-Wl,-E' ;;
339                     sunos)             dflt='none'   ;;
340                     *)                 dflt='none'   ;;
341                 esac ;;
342             ' ') dflt='none' ;;
343             *)   dflt="$ccdlflags" ;;
344         esac
345         rp="Any special flags to pass to $cc to use dynamic linking?"
346         . ./myread
347         case "$ans" in
348 ?X: Use ' ' so that a subsequent Configure run preserves the old state.
349             none) ccdlflags=' ' ;;
350             *)    ccdlflags="$ans" ;;
351         esac
352         ;;
353 ?X: End of usedl=y section
354
355     *)  usedl="$undef"
356         ld='ld'
357         dlsrc='dl_none.xs'
358         lddlflags=''
359         ccdlflags=''
360         ;;
361 esac
362
363 ld_can_script="$undef"
364 case "$bin_ELF$usedl" in
365     $define$define)
366         # Abuse try.h and a.out names for neat cleanup
367         $cat >try.c <<EOM
368 void foo() {}
369 void bar() {}
370 EOM
371         $cat >try.h <<EOM
372 LIBTEST_42 {
373  global:
374   foo;
375  local: *;
376  };
377 EOM
378         if $cc $cccdlflags $ccdlflags $ccflags \
379                $ldflags $lddlflags -o a.out try.c \
380                -Wl,--version-script=try.h >/dev/null 2>&1 \
381            &&  $test -s a.out ; then
382             echo "ld supports scripting" >&4
383             ld_can_script="$define"
384         else
385             echo "ld does not support scripting" >&4
386         fi
387         $rm_try
388         ;;
389 esac
390