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, target, arguments 76# 77# Autoconf incoming variables: 78# srcdir, target, ac_configure_args 79# 80# We *could* figure srcdir and target 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 84if [ -n "${ac_configure_args}" ]; then 85 Makefile=${ac_file-Makefile} 86 ml_config_shell=${CONFIG_SHELL-/bin/sh} 87 ml_arguments="${ac_configure_args}" 88 ml_realsrcdir=${srcdir} 89else 90 Makefile=${Makefile-Makefile} 91 ml_config_shell=${config_shell-/bin/sh} 92 ml_arguments="${arguments}" 93 if [ -n "${subdir}" -a "${subdir}" != "." ] ; then 94 ml_realsrcdir=${srcdir}/${subdir} 95 else 96 ml_realsrcdir=${srcdir} 97 fi 98fi 99 100# Scan all the arguments and set all the ones we need. 101 102ml_verbose=--verbose 103for option in ${ml_arguments} 104do 105 case $option in 106 --*) ;; 107 -*) option=-$option ;; 108 esac 109 110 case $option in 111 --*=*) 112 optarg=`echo $option | sed -e 's/^[^=]*=//'` 113 ;; 114 esac 115 116 case $option in 117 --disable-*) 118 enableopt=`echo ${option} | sed 's:^--disable-:enable_:;s:-:_:g'` 119 eval $enableopt=no 120 ;; 121 --enable-*) 122 case "$option" in 123 *=*) ;; 124 *) optarg=yes ;; 125 esac 126 enableopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'` 127 eval $enableopt="$optarg" 128 ;; 129 --norecursion | --no*) 130 ml_norecursion=yes 131 ;; 132 --silent | --sil* | --quiet | --q*) 133 ml_verbose=--silent 134 ;; 135 --verbose | --v | --verb*) 136 ml_verbose=--verbose 137 ;; 138 --with-*) 139 case "$option" in 140 *=*) ;; 141 *) optarg=yes ;; 142 esac 143 withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'` 144 eval $withopt="$optarg" 145 ;; 146 --without-*) 147 withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'` 148 eval $withopt=no 149 ;; 150 esac 151done 152 153# Only do this if --enable-multilib. 154if [ "${enable_multilib}" = yes ]; then 155 156# Compute whether this is the library's top level directory 157# (ie: not a multilib subdirectory, and not a subdirectory like libg++/src). 158# ${with_multisubdir} tells us we're in the right branch, but we could be 159# in a subdir of that. 160# ??? The previous version could void this test by separating the process into 161# two files: one that only the library's toplevel configure.in ran (to 162# configure the multilib subdirs), and another that all configure.in's ran to 163# update the Makefile. It seemed reasonable to collapse all multilib support 164# into one file, but it does leave us with having to perform this test. 165ml_toplevel_p=no 166if [ -z "${with_multisubdir}" ]; then 167 if [ "${srcdir}" = "." ]; then 168 # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}. 169 # ${with_target_subdir} = "." for native, otherwise target alias. 170 if [ "${with_target_subdir}" = "." ]; then 171 if [ -f ${ml_realsrcdir}/../config-ml.in ]; then 172 ml_toplevel_p=yes 173 fi 174 else 175 if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then 176 ml_toplevel_p=yes 177 fi 178 fi 179 else 180 # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}. 181 if [ -f ${ml_realsrcdir}/../config-ml.in ]; then 182 ml_toplevel_p=yes 183 fi 184 fi 185fi 186 187# If this is the library's top level directory, set multidirs to the 188# multilib subdirs to support. This lives at the top because we need 189# `multidirs' set right away. 190 191if [ "${ml_toplevel_p}" = yes ]; then 192 193multidirs= 194for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do 195 dir=`echo $i | sed -e 's/;.*$//'` 196 if [ "${dir}" = "." ]; then 197 true 198 else 199 if [ -z "${multidirs}" ]; then 200 multidirs="${dir}" 201 else 202 multidirs="${multidirs} ${dir}" 203 fi 204 fi 205done 206 207case "${target}" in 208arc-*-elf*) 209 if [ x$enable_biendian != xyes ] 210 then 211 old_multidirs=${multidirs} 212 multidirs="" 213 for x in ${old_multidirs}; do 214 case "${x}" in 215 *be*) : ;; 216 *) multidirs="${multidirs} ${x}" ;; 217 esac 218 done 219 fi 220 ;; 221m68*-*-*) 222 if [ x$enable_softfloat = xno ] 223 then 224 old_multidirs="${multidirs}" 225 multidirs="" 226 for x in ${old_multidirs}; do 227 case "$x" in 228 *soft-float* ) : ;; 229 *) multidirs="${multidirs} ${x}" ;; 230 esac 231 done 232 fi 233 if [ x$enable_m68881 = xno ] 234 then 235 old_multidirs="${multidirs}" 236 multidirs="" 237 for x in ${old_multidirs}; do 238 case "$x" in 239 *m68881* ) : ;; 240 *) multidirs="${multidirs} ${x}" ;; 241 esac 242 done 243 fi 244 if [ x$enable_m68000 = xno ] 245 then 246 old_multidirs="${multidirs}" 247 multidirs="" 248 for x in ${old_multidirs}; do 249 case "$x" in 250 *m68000* ) : ;; 251 *) multidirs="${multidirs} ${x}" ;; 252 esac 253 done 254 fi 255 if [ x$enable_m68020 = xno ] 256 then 257 old_multidirs="${multidirs}" 258 multidirs="" 259 for x in ${old_multidirs}; do 260 case "$x" in 261 *m68020* ) : ;; 262 *) multidirs="${multidirs} ${x}" ;; 263 esac 264 done 265 fi 266 ;; 267mips*-*-*) 268 if [ x$enable_single_float = xno ] 269 then 270 old_multidirs="${multidirs}" 271 multidirs="" 272 for x in ${old_multidirs}; do 273 case "$x" in 274 *single* ) : ;; 275 *) multidirs="${multidirs} ${x}" ;; 276 esac 277 done 278 fi 279 if [ x$enable_biendian = xno ] 280 then 281 old_multidirs="${multidirs}" 282 multidirs="" 283 for x in ${old_multidirs}; do 284 case "$x" in 285 *el* ) : ;; 286 *eb* ) : ;; 287 *) multidirs="${multidirs} ${x}" ;; 288 esac 289 done 290 fi 291 if [ x$enable_softfloat = xno ] 292 then 293 old_multidirs="${multidirs}" 294 multidirs="" 295 for x in ${old_multidirs}; do 296 case "$x" in 297 *soft-float* ) : ;; 298 *) multidirs="${multidirs} ${x}" ;; 299 esac 300 done 301 fi 302 case " $multidirs " in 303 *" mabi=64 "*) 304 # We will not be able to create libraries with -mabi=64 if 305 # we cannot even link a trivial program. It usually 306 # indicates the 64bit libraries are missing. 307 if echo 'main() {}' > conftest.c && 308 ${CC-gcc} -mabi=64 conftest.c -o conftest; then 309 : 310 else 311 echo Could not link program with -mabi=64, disabling it. 312 old_multidirs="${multidirs}" 313 multidirs="" 314 for x in ${old_multidirs}; do 315 case "$x" in 316 *mabi=64* ) : ;; 317 *) multidirs="${multidirs} ${x}" ;; 318 esac 319 done 320 fi 321 rm -f conftest.c conftest 322 ;; 323 esac 324 ;; 325powerpc*-*-* | rs6000*-*-*) 326 if [ x$enable_softfloat = xno ] 327 then 328 old_multidirs="${multidirs}" 329 multidirs="" 330 for x in ${old_multidirs}; do 331 case "$x" in 332 *soft-float* ) : ;; 333 *) multidirs="${multidirs} ${x}" ;; 334 esac 335 done 336 fi 337 if [ x$enable_powercpu = xno ] 338 then 339 old_multidirs="${multidirs}" 340 multidirs="" 341 for x in ${old_multidirs}; do 342 case "$x" in 343 power | */power | */power/* ) : ;; 344 *) multidirs="${multidirs} ${x}" ;; 345 esac 346 done 347 fi 348 if [ x$enable_powerpccpu = xno ] 349 then 350 old_multidirs="${multidirs}" 351 multidirs="" 352 for x in ${old_multidirs}; do 353 case "$x" in 354 *powerpc* ) : ;; 355 *) multidirs="${multidirs} ${x}" ;; 356 esac 357 done 358 fi 359 if [ x$enable_powerpcos = xno ] 360 then 361 old_multidirs="${multidirs}" 362 multidirs="" 363 for x in ${old_multidirs}; do 364 case "$x" in 365 *mcall-linux* | *mcall-solaris* ) : ;; 366 *) multidirs="${multidirs} ${x}" ;; 367 esac 368 done 369 fi 370 if [ x$enable_biendian = xno ] 371 then 372 old_multidirs="${multidirs}" 373 multidirs="" 374 for x in ${old_multidirs}; do 375 case "$x" in 376 *mlittle* | *mbig* ) : ;; 377 *) multidirs="${multidirs} ${x}" ;; 378 esac 379 done 380 fi 381 if [ x$enable_sysv = xno ] 382 then 383 old_multidirs="${multidirs}" 384 multidirs="" 385 for x in ${old_multidirs}; do 386 case "$x" in 387 *mcall-sysv* ) : ;; 388 *) multidirs="${multidirs} ${x}" ;; 389 esac 390 done 391 fi 392 if [ x$enable_aix = xno ] 393 then 394 old_multidirs="${multidirs}" 395 multidirs="" 396 for x in ${old_multidirs}; do 397 case "$x" in 398 *mcall-aix* ) : ;; 399 *) multidirs="${multidirs} ${x}" ;; 400 esac 401 done 402 fi 403 ;; 404esac 405 406# Remove extraneous blanks from multidirs. 407# Tests like `if [ -n "$multidirs" ]' require it. 408multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'` 409 410# Add code to library's top level makefile to handle building the multilib 411# subdirs. 412 413cat > Multi.tem <<\EOF 414 415# FIXME: There should be an @-sign in front of the `if'. 416# Leave out until this is tested a bit more. 417multi-do: 418 if [ -z "$(MULTIDIRS)" ]; then \ 419 true; \ 420 else \ 421 rootpre=`pwd`/; export rootpre; \ 422 srcrootpre=`cd $(srcdir); pwd`/; export srcrootpre; \ 423 lib=`echo $${rootpre} | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \ 424 compiler="$(CC)"; \ 425 for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \ 426 dir=`echo $$i | sed -e 's/;.*$$//'`; \ 427 if [ "$${dir}" = "." ]; then \ 428 true; \ 429 else \ 430 if [ -d ../$${dir}/$${lib} ]; then \ 431 flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ 432 if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \ 433 CFLAGS="$(CFLAGS) $${flags}" \ 434 CXXFLAGS="$(CXXFLAGS) $${flags}" \ 435 LIBCFLAGS="$(LIBCFLAGS) $${flags}" \ 436 LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \ 437 LDFLAGS="$(LDFLAGS) $${flags}" \ 438 $(DO)); then \ 439 true; \ 440 else \ 441 exit 1; \ 442 fi; \ 443 else true; \ 444 fi; \ 445 fi; \ 446 done; \ 447 fi 448 449# FIXME: There should be an @-sign in front of the `if'. 450# Leave out until this is tested a bit more. 451multi-clean: 452 if [ -z "$(MULTIDIRS)" ]; then \ 453 true; \ 454 else \ 455 lib=`pwd | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \ 456 for dir in Makefile $(MULTIDIRS); do \ 457 if [ -f ../$${dir}/$${lib}/Makefile ]; then \ 458 if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) $(DO)); \ 459 then true; \ 460 else exit 1; \ 461 fi; \ 462 else true; \ 463 fi; \ 464 done; \ 465 fi 466EOF 467 468cat ${Makefile} Multi.tem > Makefile.tem 469rm -f ${Makefile} Multi.tem 470mv Makefile.tem ${Makefile} 471 472fi # ${ml_toplevel_p} = yes 473 474if [ "${ml_verbose}" = --verbose ]; then 475 echo "Adding multilib support to Makefile in ${ml_realsrcdir}" 476 if [ "${ml_toplevel_p}" = yes ]; then 477 echo "multidirs=${multidirs}" 478 fi 479 echo "with_multisubdir=${with_multisubdir}" 480fi 481 482if [ "${srcdir}" = "." ]; then 483 if [ "${with_target_subdir}" != "." ]; then 484 ml_srcdotdot="../" 485 else 486 ml_srcdotdot="" 487 fi 488else 489 ml_srcdotdot="" 490fi 491 492if [ -z "${with_multisubdir}" ]; then 493 ml_subdir= 494 ml_builddotdot= 495 : # ml_srcdotdot= # already set 496else 497 ml_subdir="/${with_multisubdir}" 498 # The '[^/][^/]*' appears that way to work around a SunOS sed bug. 499 ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/ 500 if [ "$srcdir" = "." ]; then 501 ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot} 502 else 503 : # ml_srcdotdot= # already set 504 fi 505fi 506 507if [ "${ml_toplevel_p}" = yes ]; then 508 ml_do='$(MAKE)' 509 ml_clean='$(MAKE)' 510else 511 ml_do=true 512 ml_clean=true 513fi 514 515# TOP is used by newlib and should not be used elsewhere for this purpose. 516# MULTI{SRC,BUILD}TOP are the proper ones to use. MULTISRCTOP is empty 517# when srcdir != builddir. MULTIBUILDTOP is always some number of ../'s. 518# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can 519# delete TOP. Newlib may wish to continue to use TOP for its own purposes 520# of course. 521# MULTIDIRS is non-empty for the cpu top level Makefile (eg: newlib/Makefile) 522# and lists the subdirectories to recurse into. 523# MULTISUBDIR is non-empty in each cpu subdirectory's Makefile 524# (eg: newlib/h8300h/Makefile) and is the installed subdirectory name with 525# a leading '/'. 526# MULTIDO is used for targets like all, install, and check where 527# $(FLAGS_TO_PASS) augmented with the subdir's compiler option is needed. 528# MULTICLEAN is used for the *clean targets. 529# 530# ??? It is possible to merge MULTIDO and MULTICLEAN into one. They are 531# currently kept separate because we don't want the *clean targets to require 532# the existence of the compiler (which MULTIDO currently requires) and 533# therefore we'd have to record the directory options as well as names 534# (currently we just record the names and use --print-multi-lib to get the 535# options). 536 537sed -e "s:^TOP[ ]*=[ ]*\([./]*\)[ ]*$:TOP = ${ml_builddotdot}\1:" \ 538 -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \ 539 -e "s:^MULTIBUILDTOP[ ]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \ 540 -e "s:^MULTIDIRS[ ]*=.*$:MULTIDIRS = ${multidirs}:" \ 541 -e "s:^MULTISUBDIR[ ]*=.*$:MULTISUBDIR = ${ml_subdir}:" \ 542 -e "s:^MULTIDO[ ]*=.*$:MULTIDO = $ml_do:" \ 543 -e "s:^MULTICLEAN[ ]*=.*$:MULTICLEAN = $ml_clean:" \ 544 ${Makefile} > Makefile.tem 545rm -f ${Makefile} 546mv Makefile.tem ${Makefile} 547 548# If this is the library's top level, configure each multilib subdir. 549# This is done at the end because this is the loop that runs configure 550# in each multilib subdir and it seemed reasonable to finish updating the 551# Makefile before going on to configure the subdirs. 552 553if [ "${ml_toplevel_p}" = yes ]; then 554 555# We must freshly configure each subdirectory. This bit of code is 556# actually partially stolen from the main configure script. FIXME. 557 558if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then 559 560 if [ "${ml_verbose}" = --verbose ]; then 561 echo "Running configure in multilib subdirs ${multidirs}" 562 echo "pwd: `pwd`" 563 fi 564 565 ml_origdir=`pwd` 566 ml_libdir=`echo $ml_origdir | sed -e 's,^.*/,,'` 567 # cd to top-level-build-dir/${with_target_subdir} 568 cd .. 569 570 for ml_dir in ${multidirs}; do 571 572 if [ "${ml_verbose}" = --verbose ]; then 573 echo "Running configure in multilib subdir ${ml_dir}" 574 echo "pwd: `pwd`" 575 fi 576 577 if [ -d ${ml_dir} ]; then true; else mkdir ${ml_dir}; fi 578 if [ -d ${ml_dir}/${ml_libdir} ]; then true; else mkdir ${ml_dir}/${ml_libdir}; fi 579 580 # Eg: if ${ml_dir} = m68000/m68881, dotdot = ../../ 581 dotdot=../`echo ${ml_dir} | sed -e 's|[^/]||g' -e 's|/|../|g'` 582 583 case ${srcdir} in 584 ".") 585 echo Building symlink tree in `pwd`/${ml_dir}/${ml_libdir} 586 if [ "${with_target_subdir}" != "." ]; then 587 ml_unsubdir="../" 588 else 589 ml_unsubdir="" 590 fi 591 (cd ${ml_dir}/${ml_libdir}; 592 ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "") 593 if [ -f ${ml_dir}/${ml_libdir}/Makefile ]; then 594 if [ x"${MAKE}" = x ]; then 595 (cd ${ml_dir}/${ml_libdir}; make distclean) 596 else 597 (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean) 598 fi 599 fi 600 ml_newsrcdir="." 601 ml_srcdiroption= 602 multisrctop=${dotdot} 603 ;; 604 *) 605 case "${srcdir}" in 606 /*) # absolute path 607 ml_newsrcdir=${srcdir} 608 ;; 609 *) # otherwise relative 610 ml_newsrcdir=${dotdot}${srcdir} 611 ;; 612 esac 613 ml_srcdiroption="-srcdir=${ml_newsrcdir}" 614 multisrctop= 615 ;; 616 esac 617 618 case "${progname}" in 619 /*) ml_recprog=${progname} ;; 620 *) ml_recprog=${dotdot}${progname} ;; 621 esac 622 623 # FIXME: POPDIR=${PWD=`pwd`} doesn't work here. 624 ML_POPDIR=`pwd` 625 cd ${ml_dir}/${ml_libdir} 626 627 if [ -f ${ml_newsrcdir}/configure ]; then 628 ml_recprog=${ml_newsrcdir}/configure 629 fi 630 if eval ${ml_config_shell} ${ml_recprog} \ 631 --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ 632 ${ml_arguments} ${ml_srcdiroption} ; then 633 true 634 else 635 exit 1 636 fi 637 638 cd ${ML_POPDIR} 639 640 done 641 642 cd ${ml_origdir} 643fi 644 645fi # ${ml_toplevel_p} = yes 646fi # ${enable_multilib} = yes 647