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