This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
e9e6edad2d818a40b0afcc06b4655242d530a5ac
[metaconfig.git] / U / perl / Extensions.U
1 ?RCS: $Id: Extensions.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: Extensions.U,v $
9 ?RCS:
10 ?MAKE:known_extensions extensions dynamic_ext static_ext nonxs_ext \
11         useposix useopcode : \
12         Myread hint usedl d_sem d_socket i_db i_dbm i_rpcsvcdbm i_gdbm \
13         i_ndbm usethreads useithreads package test cat rsrc \
14         d_msg d_shm osname use64bitint i_langinfo d_nl_langinfo \
15         libs
16 ?MAKE:  -pick add $@ %<
17 ?Y:BOTTOM
18 ?S:known_extensions:
19 ?S:     This variable holds a list of all XS extensions included in
20 ?S:     the package.
21 ?S:.
22 ?S:dynamic_ext:
23 ?S:     This variable holds a list of XS extension files we want to
24 ?S:     link dynamically into the package.  It is used by Makefile.
25 ?S:.
26 ?S:static_ext:
27 ?S:     This variable holds a list of XS extension files we want to
28 ?S:     link statically into the package.  It is used by Makefile.
29 ?S:.
30 ?S:nonxs_ext:
31 ?S:     This variable holds a list of all non-xs extensions included
32 ?S:     in the package.  All of them will be built.
33 ?S:.
34 ?S:extensions:
35 ?S:     This variable holds a list of all extension files (both XS and
36 ?S:     non-xs linked into the package.  It is propagated to Config.pm
37 ?S:     and is typically used to test whether a particular extesion
38 ?S:     is available.
39 ?S:.
40 ?S:useposix:
41 ?S:     This variable holds either 'true' or 'false' to indicate
42 ?S:     whether the POSIX extension should be used.  The sole
43 ?S:     use for this currently is to allow an easy mechanism
44 ?S:     for hints files to indicate that POSIX will not compile
45 ?S:     on a particular system.
46 ?S:.
47 ?S:useopcode:
48 ?S:     This variable holds either 'true' or 'false' to indicate
49 ?S:     whether the Opcode extension should be used.  The sole
50 ?S:     use for this currently is to allow an easy mechanism
51 ?S:     for users to skip the Opcode extension from the Configure
52 ?S:     command line.
53 ?S:.
54 ?T:xxx avail_ext tdir nonxs_extensions find_extensions
55 ?INIT:: set useposix=false in your hint file to disable the POSIX extension.
56 ?INIT:useposix=true
57 ?INIT:: set useopcode=false in your hint file to disable the Opcode extension.
58 ?INIT:useopcode=true
59 ?LINT:extern noextensions
60 ?LINT:extern onlyextensions
61 ?T:keepextensions i
62 echo " "
63 echo "Looking for extensions..." >&4
64 : If we are using the old config.sh, known_extensions may contain
65 : old or inaccurate or duplicate values.
66 known_extensions=''
67 nonxs_extensions=''
68 : We do not use find because it might not be available.
69 : We do not just use MANIFEST because the user may have dropped
70 : some additional extensions into the source tree and expect them
71 : to be built.
72
73 : Function to recursively find available extensions, ignoring DynaLoader
74 : NOTE: recursion limit of 10 to prevent runaway in case of symlink madness
75 find_extensions='
76     for xxx in *; do
77         if $test "$1" = Compress/IO/ ; then
78             nonxs_extensions="$nonxs_extensions IO/Compress/$xxx";
79         else
80             case "$xxx" in
81                 DynaLoader|dynaload) ;;
82                 *)
83                 if $test -f $xxx/$xxx.xs; then
84                     known_extensions="$known_extensions $1$xxx";
85                 elif $test -f $xxx/Makefile.PL; then
86                     nonxs_extensions="$nonxs_extensions $1$xxx";
87                 else
88                     if $test -d $xxx -a $# -lt 10; then
89                         set $1$xxx/ $*;
90                         cd "$xxx";
91                         eval $find_extensions;
92                         cd ..;
93                         shift;
94                     fi;
95                 fi
96                 ;;
97             esac;
98         fi
99     done'
100 tdir=`pwd`
101 cd "$rsrc/ext"
102 set X
103 shift
104 eval $find_extensions
105 # Special case:  Add in threads/shared since it is not picked up by the
106 # recursive find above (and adding in general recursive finding breaks
107 # SDBM_File/sdbm).  A.D.  10/25/2001.
108 known_extensions="$known_extensions threads/shared"
109 set X $nonxs_extensions
110 shift
111 nonxs_extensions="$*"
112 set X $known_extensions
113 shift
114 known_extensions="$*"
115 cd "$tdir"
116
117 : Now see which are supported on this system.
118 ?X: avail_ext lists available XS extensions.
119 avail_ext=''
120 for xxx in $known_extensions ; do
121         case "$xxx" in
122 ?X: Handle possible DOS 8.3 filename and case alterations
123         DB_File|db_file)
124                 case "$i_db" in
125                 $define) avail_ext="$avail_ext $xxx" ;;
126                 esac
127                 ;;
128         GDBM_File|gdbm_fil)
129                 case "$i_gdbm" in
130                 $define) avail_ext="$avail_ext $xxx" ;;
131                 esac
132                 ;;
133         I18N/Langinfo|i18n_lan)
134                 case "$i_langinfo$d_nl_langinfo" in
135                 $define$define) avail_ext="$avail_ext $xxx" ;;
136                 esac
137                 ;;
138         NDBM_File|ndbm_fil)
139                 case "$i_ndbm" in
140                 $define)
141                     case "$osname-$use64bitint" in
142                     hpux-define)
143                         case "$libs" in
144                         *-lndbm*) avail_ext="$avail_ext $xxx" ;;
145                         esac
146                         ;;
147                     *) avail_ext="$avail_ext $xxx" ;;
148                     esac
149                     ;;
150                 esac
151                 ;;
152         ODBM_File|odbm_fil)
153                 case "${i_dbm}${i_rpcsvcdbm}" in
154                 *"${define}"*)
155                     case "$osname-$use64bitint" in
156                     hpux-define)
157                         case "$libs" in
158                         *-ldbm*) avail_ext="$avail_ext $xxx" ;;
159                         esac
160                         ;;
161                     *) avail_ext="$avail_ext $xxx" ;;
162                     esac
163                     ;;
164                 esac
165                 ;;
166         POSIX|posix)
167                 case "$useposix" in
168                 true|define|y) avail_ext="$avail_ext $xxx" ;;
169                 esac
170                 ;;
171         Opcode|opcode)
172                 case "$useopcode" in
173                 true|define|y) avail_ext="$avail_ext $xxx" ;;
174                 esac
175                 ;;
176         Socket|socket)
177                 case "$d_socket" in
178                 true|$define|y)
179                     case "$osname" in
180                     beos) ;; # not unless BONE
181                     *) avail_ext="$avail_ext $xxx" ;;
182                     esac
183                     ;;
184                 esac
185                 ;;
186         Sys/Syslog|sys/syslog)
187                 : XXX syslog requires socket
188                 case "$d_socket" in
189                 true|$define|y) avail_ext="$avail_ext $xxx" ;;
190                 esac
191                 ;;
192         Thread|thread)
193                 case "$usethreads" in
194                 true|$define|y)
195                         case "$useithreads" in
196                         $undef|false|[nN]*) avail_ext="$avail_ext $xxx" ;;
197                         esac
198                 esac
199                 ;;
200         XS/APItest|xs/apitest)
201                 # This is just for testing.  Skip it unless we have dynamic loading.
202
203                 case "$usedl" in
204                 $define) avail_ext="$avail_ext $xxx" ;;
205                 esac
206                 ;;
207         XS/Typemap|xs/typemap)
208                 # This is just for testing.  Skip it unless we have dynamic loading.
209                 case "$usedl" in
210                 $define) avail_ext="$avail_ext $xxx" ;;
211                 esac
212                 ;;
213         threads|threads/shared)
214                 # threads and threads::shared are special cases.
215                 # To stop people from asking "Perl 5.8.0 was supposed
216                 # to have this new fancy threads implementation but my
217                 # perl doesn't have it" and from people trying to
218                 # (re)install the threads module using CPAN.pm and
219                 # CPAN.pm then offering to reinstall Perl 5.8.0,
220                 # the threads.pm and threads/shared.pm will always be
221                 # there, croaking informatively ("you need to rebuild
222                 # all of Perl with threads, sorry") when threads haven't
223                 # been compiled in.
224                 # --jhi
225                 avail_ext="$avail_ext $xxx"
226                 ;;
227         IPC/SysV|ipc/sysv)
228                 : XXX Do we need a useipcsysv variable here
229                 case "${d_msg}${d_sem}${d_shm}" in
230                 *"${define}"*) avail_ext="$avail_ext $xxx" ;;
231                 esac
232                 ;;
233         *)      avail_ext="$avail_ext $xxx"
234                 ;;
235         esac
236 done
237
238 set X $avail_ext
239 shift
240 avail_ext="$*"
241
242 case "$onlyextensions" in
243 '') ;;
244 *)  keepextensions=''
245     echo "You have requested that only certains extensions be included..." >&4
246     for i in $onlyextensions; do
247         case " $avail_ext " in
248         *" $i "*)
249             echo "Keeping extension $i."
250             keepextensions="$keepextensions $i"
251             ;;
252         *) echo "Ignoring extension $i." ;;
253         esac
254     done
255     avail_ext="$keepextensions"
256     ;;
257 esac
258
259 case "$noextensions" in
260 '') ;;
261 *)  keepextensions=''
262     echo "You have requested that certain extensions be ignored..." >&4
263     for i in $avail_ext; do
264         case " $noextensions " in
265         *" $i "*) echo "Ignoring extension $i." ;;
266         *) echo "Keeping extension $i.";
267            keepextensions="$keepextensions $i"
268            ;;
269         esac
270     done
271     avail_ext="$keepextensions"
272     ;;
273 esac
274
275 : Now see which nonxs extensions are supported on this system.
276 : For now assume all are.
277 nonxs_ext=''
278 for xxx in $nonxs_extensions ; do
279         case "$xxx" in
280         *)      nonxs_ext="$nonxs_ext $xxx"
281                 ;;
282         esac
283 done
284
285 set X $nonxs_ext
286 shift
287 nonxs_ext="$*"
288
289 case $usedl in
290 $define)
291         $cat <<EOM
292 A number of extensions are supplied with $package.  You may choose to
293 compile these extensions for dynamic loading (the default), compile
294 them into the $package executable (static loading), or not include
295 them at all.  Answer "none" to include no extensions.
296 Note that DynaLoader is always built and need not be mentioned here.
297
298 EOM
299         case "$dynamic_ext" in
300         '')
301                 : Exclude those listed in static_ext
302                 dflt=''
303                 for xxx in $avail_ext; do
304                         case " $static_ext " in
305                         *" $xxx "*) ;;
306                         *) dflt="$dflt $xxx" ;;
307                         esac
308                 done
309                 set X $dflt
310                 shift
311                 dflt="$*"
312                 ;;
313         *)      dflt="$dynamic_ext"
314                 # Perhaps we are reusing an old out-of-date config.sh.
315                 case "$hint" in
316                 previous)
317                         if test X"$dynamic_ext" != X"$avail_ext"; then
318                                 $cat <<EOM
319 NOTICE:  Your previous config.sh list may be incorrect.
320 The extensions now available to you are
321         ${avail_ext}
322 but the default list from your previous config.sh is
323         ${dynamic_ext}
324
325 EOM
326                         fi
327                         ;;
328                 esac
329                 ;;
330         esac
331         case "$dflt" in
332         '')     dflt=none;;
333         esac
334         rp="What extensions do you wish to load dynamically?"
335         . ./myread
336         case "$ans" in
337 ?X: Use ' ' so a subsequent Configure will preserve that value.
338         none) dynamic_ext=' ' ;;
339         *) dynamic_ext="$ans" ;;
340         esac
341
342         case "$static_ext" in
343         '')
344                 : Exclude those already listed in dynamic linking
345                 dflt=''
346                 for xxx in $avail_ext; do
347                         case " $dynamic_ext " in
348                         *" $xxx "*) ;;
349                         *) dflt="$dflt $xxx" ;;
350                         esac
351                 done
352                 set X $dflt
353                 shift
354                 dflt="$*"
355                 ;;
356         *)  dflt="$static_ext"
357                 ;;
358         esac
359
360         case "$dflt" in
361         '')     dflt=none;;
362         esac
363         rp="What extensions do you wish to load statically?"
364         . ./myread
365         case "$ans" in
366 ?X: Use ' ' so a subsequent Configure will preserve that value.
367         none) static_ext=' ' ;;
368         *) static_ext="$ans" ;;
369         esac
370         ;;
371 *)
372         $cat <<EOM
373 A number of extensions are supplied with $package.  Answer "none"
374 to include no extensions.
375 Note that DynaLoader is always built and need not be mentioned here.
376
377 EOM
378         case "$static_ext" in
379         '') dflt="$avail_ext" ;;
380         *)      dflt="$static_ext"
381                 # Perhaps we are reusing an old out-of-date config.sh.
382                 case "$hint" in
383                 previous)
384                         if test X"$static_ext" != X"$avail_ext"; then
385                                 $cat <<EOM
386 NOTICE:  Your previous config.sh list may be incorrect.
387 The extensions now available to you are
388         ${avail_ext}
389 but the default list from your previous config.sh is
390         ${static_ext}
391
392 EOM
393                         fi
394                         ;;
395                 esac
396                 ;;
397         esac
398         : Exclude those that are not xs extensions
399         case "$dflt" in
400         '')     dflt=none;;
401         esac
402         rp="What extensions do you wish to include?"
403         . ./myread
404         case "$ans" in
405 ?X: Use ' ' so a subsequent Configure will preserve that value.
406         none) static_ext=' ' ;;
407         *) static_ext="$ans" ;;
408         esac
409         ;;
410 esac
411 #
412 # Encode is a special case.  If we are building Encode as a static
413 # extension, we need to explicitly list its subextensions as well.
414 # For other nested extensions, this is handled automatically by
415 # the appropriate Makefile.PL.
416 case " $static_ext " in
417         *" Encode "*) # Add the subextensions of Encode
418         cd "$rsrc/ext"
419         for xxx in `ls Encode/*/Makefile.PL|awk -F/ '{print $2}'`; do
420                 static_ext="$static_ext Encode/$xxx"
421         done
422         cd "$tdir"
423         ;;
424 esac
425
426 set X $dynamic_ext $static_ext $nonxs_ext
427 shift
428 extensions="$*"
429
430 # Sanity check:  We require an extension suitable for use with
431 # AnyDBM_File, as well as Fcntl and IO.  (Failure to have these
432 # should show up as failures in the test suite, but it's helpful to
433 # catch them now.) The 'extensions' list is normally sorted
434 # alphabetically, so we need to accept either
435 #    DB_File ... Fcntl ... IO  ....
436 # or something like
437 #    Fcntl ... NDBM_File ... IO  ....
438 case " $extensions"  in
439 *"_File "*" Fcntl "*" IO "*) ;; # DB_File
440 *" Fcntl "*"_File "*" IO "*) ;; # GDBM_File
441 *" Fcntl "*" IO "*"_File "*) ;; # NDBM_File
442 *) echo "WARNING: Extensions DB_File or *DBM_File, Fcntl, and IO not configured." >&4
443    echo "WARNING: The Perl you are building will be quite crippled." >& 4
444    ;;
445 esac
446