config-ml.in revision 60484
1# Configure fragment invoked in the post-target section for subdirs
2# wanting multilib support.
3#
4# It is advisable to support a few --enable/--disable options to let the
5# user select which libraries s/he really wants.
6#
7# Subdirectories wishing to use multilib should put the following lines
8# in the "post-target" section of configure.in.
9#
10# if [ "${srcdir}" = "." ] ; then
11#   if [ "${with_target_subdir}" != "." ] ; then
12#     . ${with_multisrctop}../../config-ml.in
13#   else
14#     . ${with_multisrctop}../config-ml.in
15#   fi
16# else
17#   . ${srcdir}/../config-ml.in
18# fi
19#
20# See librx/configure.in in the libg++ distribution for an example of how
21# to handle autoconf'd libraries.
22#
23# Things are complicated because 6 separate cases must be handled:
24# 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
25#
26# srcdir=. is special.  It must handle make programs that don't handle VPATH.
27# To implement this, a symlink tree is built for each library and for each
28# multilib subdir.
29#
30# The build tree is layed out as
31#
32# ./
33#   libg++
34#   newlib
35#   m68020/
36#          libg++
37#          newlib
38#          m68881/
39#                 libg++
40#                 newlib
41#
42# The nice feature about this arrangement is that inter-library references
43# in the build tree work without having to care where you are.  Note that
44# inter-library references also work in the source tree because symlink trees
45# are built when srcdir=.
46#
47# Unfortunately, trying to access the libraries in the build tree requires
48# the user to manually choose which library to use as GCC won't be able to
49# find the right one.  This is viewed as the lesser of two evils.
50#
51# Configure variables:
52# ${with_target_subdir} = "." for native, or ${target_alias} for cross.
53# Set by top level Makefile.
54# ${with_multisrctop} = how many levels of multilibs there are in the source
55# tree.  It exists to handle the case of configuring in the source tree:
56# ${srcdir} is not constant.
57# ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
58#
59# Makefile variables:
60# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
61# (FIXME: note that this is different than ${with_multisrctop}.  Check out.).
62# MULTIBUILDTOP = number of multilib levels in build tree
63# MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
64# (only defined in each library's main Makefile).
65# MULTISUBDIR = installed subdirectory name with leading '/' (eg: /m68000)
66# (only defined in each multilib subdir).
67
68# FIXME: Multilib is currently disabled by default for everything other than
69# newlib.  It is up to each target to turn on multilib support for the other
70# libraries as desired.
71
72# We have to handle being invoked by both Cygnus configure and Autoconf.
73#
74# Cygnus configure incoming variables:
75# srcdir, subdir, host, arguments
76#
77# Autoconf incoming variables:
78# srcdir, host, ac_configure_args
79#
80# We *could* figure srcdir and host out, but we'd have to do work that
81# our caller has already done to figure them out and requiring these two
82# seems reasonable.
83# Note that `host' in this case is GCC's `target'.  Target libraries are
84# configured for a particular host.
85
86if [ -n "${ac_configure_args}" ]; then
87  Makefile=${ac_file-Makefile}
88  ml_config_shell=${CONFIG_SHELL-/bin/sh}
89  ml_arguments="${ac_configure_args}"
90  ml_realsrcdir=${srcdir}
91else
92  Makefile=${Makefile-Makefile}
93  ml_config_shell=${config_shell-/bin/sh}
94  ml_arguments="${arguments}"
95  if [ -n "${subdir}" -a "${subdir}" != "." ] ; then
96    ml_realsrcdir=${srcdir}/${subdir}
97  else
98    ml_realsrcdir=${srcdir}
99  fi
100fi
101
102# Scan all the arguments and set all the ones we need.
103
104ml_verbose=--verbose
105for option in ${ml_arguments}
106do
107  case $option in
108  --*) ;;
109  -*) option=-$option ;;
110  esac
111
112  case $option in
113  --*=*)
114	optarg=`echo $option | sed -e 's/^[^=]*=//'`
115	;;
116  esac
117
118  case $option in
119  --disable-*)
120	enableopt=`echo ${option} | sed 's:^--disable-:enable_:;s:-:_:g'`
121	eval $enableopt=no
122	;;
123  --enable-*)
124	case "$option" in
125	*=*)	;;
126	*)	optarg=yes ;;
127	esac
128	enableopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
129	eval $enableopt="$optarg"
130	;;
131  --norecursion | --no*)
132	ml_norecursion=yes
133	;;
134  --silent | --sil* | --quiet | --q*)
135	ml_verbose=--silent
136	;;
137  --verbose | --v | --verb*)
138	ml_verbose=--verbose
139	;;
140  --with-*)
141	case "$option" in
142	*=*)	;;
143	*)	optarg=yes ;;
144	esac
145	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
146	eval $withopt="$optarg"
147	;;
148  --without-*)
149	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
150	eval $withopt=no
151	;;
152  esac
153done
154
155# Only do this if --enable-multilib.
156if [ "${enable_multilib}" = yes ]; then
157
158# Compute whether this is the library's top level directory
159# (ie: not a multilib subdirectory, and not a subdirectory like libg++/src).
160# ${with_multisubdir} tells us we're in the right branch, but we could be
161# in a subdir of that.
162# ??? The previous version could void this test by separating the process into
163# two files: one that only the library's toplevel configure.in ran (to
164# configure the multilib subdirs), and another that all configure.in's ran to
165# update the Makefile.  It seemed reasonable to collapse all multilib support
166# into one file, but it does leave us with having to perform this test.
167ml_toplevel_p=no
168if [ -z "${with_multisubdir}" ]; then
169  if [ "${srcdir}" = "." ]; then
170    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
171    # ${with_target_subdir} = "." for native, otherwise target alias.
172    if [ "${with_target_subdir}" = "." ]; then
173      if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
174	ml_toplevel_p=yes
175      fi
176    else
177      if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
178	ml_toplevel_p=yes
179      fi
180    fi
181  else
182    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
183    if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
184      ml_toplevel_p=yes
185    fi
186  fi
187fi
188
189# If this is the library's top level directory, set multidirs to the
190# multilib subdirs to support.  This lives at the top because we need
191# `multidirs' set right away.
192
193if [ "${ml_toplevel_p}" = yes ]; then
194
195multidirs=
196for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
197  dir=`echo $i | sed -e 's/;.*$//'`
198  if [ "${dir}" = "." ]; then
199    true
200  else
201    if [ -z "${multidirs}" ]; then
202      multidirs="${dir}"
203    else
204      multidirs="${multidirs} ${dir}"
205    fi
206  fi
207done
208
209# Target libraries are configured for the host they run on, so we check
210# $host here, not $target.
211
212case "${host}" in
213arc-*-elf*)
214	if [ x$enable_biendian != xyes ]
215	then
216	  old_multidirs=${multidirs}
217	  multidirs=""
218	  for x in ${old_multidirs}; do
219	    case "${x}" in
220	      *be*) : ;;
221	      *) multidirs="${multidirs} ${x}" ;;
222	    esac
223	  done
224	fi
225	;;
226arm-*-*)
227	if [ x"$enable_fpu" = xno ]
228	then
229	  old_multidirs=${multidirs}
230	  multidirs=""
231	  for x in ${old_multidirs}; do
232	    case "${x}" in
233	      *fpu*) : ;;
234	      *) multidirs="${multidirs} ${x}" ;;
235	    esac
236	  done
237	fi
238	if [ x"$enable_26bit" = xno ]
239	then
240	  old_multidirs=${multidirs}
241	  multidirs=""
242	  for x in ${old_multidirs}; do
243	    case "${x}" in
244	      *26bit*) : ;;
245	      *) multidirs="${multidirs} ${x}" ;;
246	    esac
247	  done
248	fi
249	if [ x"$enable_underscore" = xno ]
250	then
251	  old_multidirs=${multidirs}
252	  multidirs=""
253	  for x in ${old_multidirs}; do
254	    case "${x}" in
255	      *under*) : ;;
256	      *) multidirs="${multidirs} ${x}" ;;
257	    esac
258	  done
259	fi
260	if [ x"$enable_interwork" = xno ]
261	then
262	  old_multidirs=${multidirs}
263	  multidirs=""
264	  for x in ${old_multidirs}; do
265	    case "${x}" in
266	      *interwork*) : ;;
267	      *) multidirs="${multidirs} ${x}" ;;
268	    esac
269	  done
270	fi
271	if [ x$enable_biendian = xno ]
272	then
273	  old_multidirs="${multidirs}"
274	  multidirs=""
275	  for x in ${old_multidirs}; do
276	    case "$x" in
277	      *le* ) : ;;
278	      *be* ) : ;;
279	      *) multidirs="${multidirs} ${x}" ;;
280	    esac
281	  done
282	fi
283	;;
284m68*-*-*)
285	if [ x$enable_softfloat = xno ]
286	then
287	  old_multidirs="${multidirs}"
288	  multidirs=""
289	  for x in ${old_multidirs}; do
290	    case "$x" in
291	      *soft-float* ) : ;;
292	      *) multidirs="${multidirs} ${x}" ;;
293	    esac
294	  done
295	fi
296	if [ x$enable_m68881 = xno ]
297	then
298	  old_multidirs="${multidirs}"
299	  multidirs=""
300	  for x in ${old_multidirs}; do
301	    case "$x" in
302	      *m68881* ) : ;;
303	      *) multidirs="${multidirs} ${x}" ;;
304	    esac
305	  done
306	fi
307	if [ x$enable_m68000 = xno ]
308	then
309	  old_multidirs="${multidirs}"
310	  multidirs=""
311	  for x in ${old_multidirs}; do
312	    case "$x" in
313	      *m68000* ) : ;;
314	      *) multidirs="${multidirs} ${x}" ;;
315	    esac
316	  done
317	fi
318	if [ x$enable_m68020 = xno ]
319	then
320	  old_multidirs="${multidirs}"
321	  multidirs=""
322	  for x in ${old_multidirs}; do
323	    case "$x" in
324	      *m68020* ) : ;;
325	      *) multidirs="${multidirs} ${x}" ;;
326	    esac
327	  done
328	fi
329	;;
330mips*-*-*)
331	if [ x$enable_single_float = xno ]
332	then
333	  old_multidirs="${multidirs}"
334	  multidirs=""
335	  for x in ${old_multidirs}; do
336	    case "$x" in
337	      *single* ) : ;;
338	      *) multidirs="${multidirs} ${x}" ;;
339	    esac
340	  done
341	fi
342	if [ x$enable_biendian = xno ]
343	then
344	  old_multidirs="${multidirs}"
345	  multidirs=""
346	  for x in ${old_multidirs}; do
347	    case "$x" in
348	      *el* ) : ;;
349	      *eb* ) : ;;
350	      *) multidirs="${multidirs} ${x}" ;;
351	    esac
352	  done
353	fi
354	if [ x$enable_softfloat = xno ]
355	then
356	  old_multidirs="${multidirs}"
357	  multidirs=""
358	  for x in ${old_multidirs}; do
359	    case "$x" in
360	      *soft-float* ) : ;;
361	      *) multidirs="${multidirs} ${x}" ;;
362	    esac
363	  done
364	fi
365	;;
366powerpc*-*-* | rs6000*-*-*)
367	if [ x$enable_softfloat = xno ]
368	then
369	  old_multidirs="${multidirs}"
370	  multidirs=""
371	  for x in ${old_multidirs}; do
372	    case "$x" in
373	      *soft-float* ) : ;;
374	      *) multidirs="${multidirs} ${x}" ;;
375	    esac
376	  done
377	fi
378	if [ x$enable_powercpu = xno ]
379	then
380	  old_multidirs="${multidirs}"
381	  multidirs=""
382	  for x in ${old_multidirs}; do
383	    case "$x" in
384	      power | */power | */power/* ) : ;;
385	      *) multidirs="${multidirs} ${x}" ;;
386	    esac
387	  done
388	fi
389	if [ x$enable_powerpccpu = xno ]
390	then
391	  old_multidirs="${multidirs}"
392	  multidirs=""
393	  for x in ${old_multidirs}; do
394	    case "$x" in
395	      *powerpc* ) : ;;
396	      *) multidirs="${multidirs} ${x}" ;;
397	    esac
398	  done
399	fi
400	if [ x$enable_powerpcos = xno ]
401	then
402	  old_multidirs="${multidirs}"
403	  multidirs=""
404	  for x in ${old_multidirs}; do
405	    case "$x" in
406	      *mcall-linux* | *mcall-solaris* ) : ;;
407	      *) multidirs="${multidirs} ${x}" ;;
408	    esac
409	  done
410	fi
411	if [ x$enable_biendian = xno ]
412	then
413	  old_multidirs="${multidirs}"
414	  multidirs=""
415	  for x in ${old_multidirs}; do
416	    case "$x" in
417	      *mlittle* | *mbig* ) : ;;
418	      *) multidirs="${multidirs} ${x}" ;;
419	    esac
420	  done
421	fi
422	if [ x$enable_sysv = xno ]
423	then
424	  old_multidirs="${multidirs}"
425	  multidirs=""
426	  for x in ${old_multidirs}; do
427	    case "$x" in
428	      *mcall-sysv* ) : ;;
429	      *) multidirs="${multidirs} ${x}" ;;
430	    esac
431	  done
432	fi
433	if [ x$enable_aix = xno ]
434	then
435	  old_multidirs="${multidirs}"
436	  multidirs=""
437	  for x in ${old_multidirs}; do
438	    case "$x" in
439	      *mcall-aix* ) : ;;
440	      *) multidirs="${multidirs} ${x}" ;;
441	    esac
442	  done
443	fi
444	;;
445esac
446
447# Remove extraneous blanks from multidirs.
448# Tests like `if [ -n "$multidirs" ]' require it.
449multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'`
450
451# Add code to library's top level makefile to handle building the multilib
452# subdirs.
453
454cat > Multi.tem <<\EOF
455
456# FIXME: There should be an @-sign in front of the `if'.
457# Leave out until this is tested a bit more.
458multi-do:
459	if [ -z "$(MULTIDIRS)" ]; then \
460	  true; \
461	else \
462	  rootpre=`pwd`/; export rootpre; \
463	  srcrootpre=`cd $(srcdir); pwd`/; export srcrootpre; \
464	  lib=`echo $${rootpre} | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \
465	  compiler="$(CC)"; \
466	  for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \
467	    dir=`echo $$i | sed -e 's/;.*$$//'`; \
468	    if [ "$${dir}" = "." ]; then \
469	      true; \
470	    else \
471	      if [ -d ../$${dir}/$${lib} ]; then \
472		flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
473		if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \
474				CFLAGS="$(CFLAGS) $${flags}" \
475				CXXFLAGS="$(CXXFLAGS) $${flags}" \
476				LIBCFLAGS="$(LIBCFLAGS) $${flags}" \
477				LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \
478				LDFLAGS="$(LDFLAGS) $${flags}" \
479				$(DO)); then \
480		  true; \
481		else \
482		  exit 1; \
483		fi; \
484	      else true; \
485	      fi; \
486	    fi; \
487	  done; \
488	fi
489
490# FIXME: There should be an @-sign in front of the `if'.
491# Leave out until this is tested a bit more.
492multi-clean:
493	if [ -z "$(MULTIDIRS)" ]; then \
494	  true; \
495	else \
496	  lib=`pwd | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
497	  for dir in Makefile $(MULTIDIRS); do \
498	    if [ -f ../$${dir}/$${lib}/Makefile ]; then \
499	      if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) $(DO)); \
500	      then true; \
501	      else exit 1; \
502	      fi; \
503	    else true; \
504	    fi; \
505	  done; \
506	fi
507EOF
508
509cat ${Makefile} Multi.tem > Makefile.tem
510rm -f ${Makefile} Multi.tem
511mv Makefile.tem ${Makefile}
512
513fi # ${ml_toplevel_p} = yes
514
515if [ "${ml_verbose}" = --verbose ]; then
516  echo "Adding multilib support to Makefile in ${ml_realsrcdir}"
517  if [ "${ml_toplevel_p}" = yes ]; then
518    echo "multidirs=${multidirs}"
519  fi
520  echo "with_multisubdir=${with_multisubdir}"
521fi
522
523if [ "${srcdir}" = "." ]; then
524  if [ "${with_target_subdir}" != "." ]; then
525    ml_srcdotdot="../"
526  else
527    ml_srcdotdot=""
528  fi
529else
530  ml_srcdotdot=""
531fi
532
533if [ -z "${with_multisubdir}" ]; then
534  ml_subdir=
535  ml_builddotdot=
536  : # ml_srcdotdot= # already set
537else
538  ml_subdir="/${with_multisubdir}"
539  # The '[^/][^/]*' appears that way to work around a SunOS sed bug.
540  ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
541  if [ "$srcdir" = "." ]; then
542    ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
543  else
544    : # ml_srcdotdot= # already set
545  fi
546fi
547
548if [ "${ml_toplevel_p}" = yes ]; then
549  ml_do='$(MAKE)'
550  ml_clean='$(MAKE)'
551else
552  ml_do=true
553  ml_clean=true
554fi
555
556# TOP is used by newlib and should not be used elsewhere for this purpose.
557# MULTI{SRC,BUILD}TOP are the proper ones to use.  MULTISRCTOP is empty
558# when srcdir != builddir.  MULTIBUILDTOP is always some number of ../'s.
559# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
560# delete TOP.  Newlib may wish to continue to use TOP for its own purposes
561# of course.
562# MULTIDIRS is non-empty for the cpu top level Makefile (eg: newlib/Makefile)
563# and lists the subdirectories to recurse into.
564# MULTISUBDIR is non-empty in each cpu subdirectory's Makefile
565# (eg: newlib/h8300h/Makefile) and is the installed subdirectory name with
566# a leading '/'.
567# MULTIDO is used for targets like all, install, and check where
568# $(FLAGS_TO_PASS) augmented with the subdir's compiler option is needed.
569# MULTICLEAN is used for the *clean targets.
570#
571# ??? It is possible to merge MULTIDO and MULTICLEAN into one.  They are
572# currently kept separate because we don't want the *clean targets to require
573# the existence of the compiler (which MULTIDO currently requires) and
574# therefore we'd have to record the directory options as well as names
575# (currently we just record the names and use --print-multi-lib to get the
576# options).
577
578sed -e "s:^TOP[ 	]*=[ 	]*\([./]*\)[ 	]*$:TOP = ${ml_builddotdot}\1:" \
579    -e "s:^MULTISRCTOP[ 	]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
580    -e "s:^MULTIBUILDTOP[ 	]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
581    -e "s:^MULTIDIRS[ 	]*=.*$:MULTIDIRS = ${multidirs}:" \
582    -e "s:^MULTISUBDIR[ 	]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
583    -e "s:^MULTIDO[ 	]*=.*$:MULTIDO = $ml_do:" \
584    -e "s:^MULTICLEAN[ 	]*=.*$:MULTICLEAN = $ml_clean:" \
585	${Makefile} > Makefile.tem
586rm -f ${Makefile}
587mv Makefile.tem ${Makefile}
588
589# If this is the library's top level, configure each multilib subdir.
590# This is done at the end because this is the loop that runs configure
591# in each multilib subdir and it seemed reasonable to finish updating the
592# Makefile before going on to configure the subdirs.
593
594if [ "${ml_toplevel_p}" = yes ]; then
595
596# We must freshly configure each subdirectory.  This bit of code is
597# actually partially stolen from the main configure script.  FIXME.
598
599if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
600
601  if [ "${ml_verbose}" = --verbose ]; then
602    echo "Running configure in multilib subdirs ${multidirs}"
603    echo "pwd: `pwd`"
604  fi
605
606  ml_origdir=`pwd`
607  ml_libdir=`echo $ml_origdir | sed -e 's,^.*/,,'`
608  # cd to top-level-build-dir/${with_target_subdir}
609  cd ..
610
611  for ml_dir in ${multidirs}; do
612
613    if [ "${ml_verbose}" = --verbose ]; then
614      echo "Running configure in multilib subdir ${ml_dir}"
615      echo "pwd: `pwd`"
616    fi
617
618    if [ -d ${ml_dir} ]; then true; else mkdir ${ml_dir}; fi
619    if [ -d ${ml_dir}/${ml_libdir} ]; then true; else mkdir ${ml_dir}/${ml_libdir}; fi
620
621    # Eg: if ${ml_dir} = m68000/m68881, dotdot = ../../
622    dotdot=../`echo ${ml_dir} | sed -e 's|[^/]||g' -e 's|/|../|g'`
623
624    case ${srcdir} in
625    ".")
626      echo Building symlink tree in `pwd`/${ml_dir}/${ml_libdir}
627      if [ "${with_target_subdir}" != "." ]; then
628	ml_unsubdir="../"
629      else
630	ml_unsubdir=""
631      fi
632      (cd ${ml_dir}/${ml_libdir};
633       ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "")
634      if [ -f ${ml_dir}/${ml_libdir}/Makefile ]; then
635	if [ x"${MAKE}" = x ]; then
636	  (cd ${ml_dir}/${ml_libdir}; make distclean)
637	else
638	  (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
639	fi
640      fi
641      ml_newsrcdir="."
642      ml_srcdiroption=
643      multisrctop=${dotdot}
644      ;;
645    *)
646      case "${srcdir}" in
647      /*) # absolute path
648        ml_newsrcdir=${srcdir}
649        ;;
650      *) # otherwise relative
651        ml_newsrcdir=${dotdot}${srcdir}
652        ;;
653      esac
654      ml_srcdiroption="-srcdir=${ml_newsrcdir}"
655      multisrctop=
656      ;;
657    esac
658
659    case "${progname}" in
660    /*)     ml_recprog=${progname} ;;
661    *)      ml_recprog=${dotdot}${progname} ;;
662    esac
663
664    # FIXME: POPDIR=${PWD=`pwd`} doesn't work here.
665    ML_POPDIR=`pwd`
666    cd ${ml_dir}/${ml_libdir}
667
668    if [ -f ${ml_newsrcdir}/configure ]; then
669      ml_recprog=${ml_newsrcdir}/configure
670    fi
671    if eval ${ml_config_shell} ${ml_recprog} \
672	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
673	${ml_arguments} ${ml_srcdiroption} ; then
674      true
675    else
676      exit 1
677    fi
678
679    cd ${ML_POPDIR}
680
681  done
682
683  cd ${ml_origdir}
684fi
685
686fi # ${ml_toplevel_p} = yes
687fi # ${enable_multilib} = yes
688