config-ml.in revision 38889
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 204arc-*-elf*) 205 if [ x$enable_biendian != xyes ] 206 then 207 old_multidirs=${multidirs} 208 multidirs="" 209 for x in ${old_multidirs}; do 210 case "${x}" in 211 *be*) : ;; 212 *) multidirs="${multidirs} ${x}" ;; 213 esac 214 done 215 fi 216 ;; 217m68*-*-*) 218 if [ x$enable_softfloat = xno ] 219 then 220 old_multidirs="${multidirs}" 221 multidirs="" 222 for x in ${old_multidirs}; do 223 case "$x" in 224 *soft-float* ) : ;; 225 *) multidirs="${multidirs} ${x}" ;; 226 esac 227 done 228 fi 229 if [ x$enable_m68881 = xno ] 230 then 231 old_multidirs="${multidirs}" 232 multidirs="" 233 for x in ${old_multidirs}; do 234 case "$x" in 235 *m68881* ) : ;; 236 *) multidirs="${multidirs} ${x}" ;; 237 esac 238 done 239 fi 240 if [ x$enable_m68000 = xno ] 241 then 242 old_multidirs="${multidirs}" 243 multidirs="" 244 for x in ${old_multidirs}; do 245 case "$x" in 246 *m68000* ) : ;; 247 *) multidirs="${multidirs} ${x}" ;; 248 esac 249 done 250 fi 251 if [ x$enable_m68020 = xno ] 252 then 253 old_multidirs="${multidirs}" 254 multidirs="" 255 for x in ${old_multidirs}; do 256 case "$x" in 257 *m68020* ) : ;; 258 *) multidirs="${multidirs} ${x}" ;; 259 esac 260 done 261 fi 262 ;; 263mips*-*-*) 264 if [ x$enable_single_float = xno ] 265 then 266 old_multidirs="${multidirs}" 267 multidirs="" 268 for x in ${old_multidirs}; do 269 case "$x" in 270 *single* ) : ;; 271 *) multidirs="${multidirs} ${x}" ;; 272 esac 273 done 274 fi 275 if [ x$enable_biendian = xno ] 276 then 277 old_multidirs="${multidirs}" 278 multidirs="" 279 for x in ${old_multidirs}; do 280 case "$x" in 281 *el* ) : ;; 282 *eb* ) : ;; 283 *) multidirs="${multidirs} ${x}" ;; 284 esac 285 done 286 fi 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 ;; 299powerpc*-*-* | rs6000*-*-*) 300 if [ x$enable_softfloat = xno ] 301 then 302 old_multidirs="${multidirs}" 303 multidirs="" 304 for x in ${old_multidirs}; do 305 case "$x" in 306 *soft-float* ) : ;; 307 *) multidirs="${multidirs} ${x}" ;; 308 esac 309 done 310 fi 311 if [ x$enable_powercpu = xno ] 312 then 313 old_multidirs="${multidirs}" 314 multidirs="" 315 for x in ${old_multidirs}; do 316 case "$x" in 317 power | */power | */power/* ) : ;; 318 *) multidirs="${multidirs} ${x}" ;; 319 esac 320 done 321 fi 322 if [ x$enable_powerpccpu = xno ] 323 then 324 old_multidirs="${multidirs}" 325 multidirs="" 326 for x in ${old_multidirs}; do 327 case "$x" in 328 *powerpc* ) : ;; 329 *) multidirs="${multidirs} ${x}" ;; 330 esac 331 done 332 fi 333 if [ x$enable_powerpcos = xno ] 334 then 335 old_multidirs="${multidirs}" 336 multidirs="" 337 for x in ${old_multidirs}; do 338 case "$x" in 339 *mcall-linux* | *mcall-solaris* ) : ;; 340 *) multidirs="${multidirs} ${x}" ;; 341 esac 342 done 343 fi 344 if [ x$enable_biendian = xno ] 345 then 346 old_multidirs="${multidirs}" 347 multidirs="" 348 for x in ${old_multidirs}; do 349 case "$x" in 350 *mlittle* | *mbig* ) : ;; 351 *) multidirs="${multidirs} ${x}" ;; 352 esac 353 done 354 fi 355 if [ x$enable_sysv = xno ] 356 then 357 old_multidirs="${multidirs}" 358 multidirs="" 359 for x in ${old_multidirs}; do 360 case "$x" in 361 *mcall-sysv* ) : ;; 362 *) multidirs="${multidirs} ${x}" ;; 363 esac 364 done 365 fi 366 if [ x$enable_aix = xno ] 367 then 368 old_multidirs="${multidirs}" 369 multidirs="" 370 for x in ${old_multidirs}; do 371 case "$x" in 372 *mcall-aix* ) : ;; 373 *) multidirs="${multidirs} ${x}" ;; 374 esac 375 done 376 fi 377 ;; 378esac 379 380# Remove extraneous blanks from multidirs. 381# Tests like `if [ -n "$multidirs" ]' require it. 382multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'` 383 384# Add code to library's top level makefile to handle building the multilib 385# subdirs. 386 387cat > Multi.tem <<\EOF 388 389# FIXME: There should be an @-sign in front of the `if'. 390# Leave out until this is tested a bit more. 391multi-do: 392 if [ -z "$(MULTIDIRS)" ]; then \ 393 true; \ 394 else \ 395 rootpre=`pwd`/; export rootpre; \ 396 srcrootpre=`cd $(srcdir); pwd`/; export srcrootpre; \ 397 lib=`echo $${rootpre} | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \ 398 compiler="$(CC)"; \ 399 for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \ 400 dir=`echo $$i | sed -e 's/;.*$$//'`; \ 401 if [ "$${dir}" = "." ]; then \ 402 true; \ 403 else \ 404 if [ -d ../$${dir}/$${lib} ]; then \ 405 flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ 406 if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \ 407 CFLAGS="$(CFLAGS) $${flags}" \ 408 CXXFLAGS="$(CXXFLAGS) $${flags}" \ 409 LIBCFLAGS="$(LIBCFLAGS) $${flags}" \ 410 LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \ 411 LDFLAGS="$(LDFLAGS) $${flags}" \ 412 $(DO)); then \ 413 true; \ 414 else \ 415 exit 1; \ 416 fi; \ 417 else true; \ 418 fi; \ 419 fi; \ 420 done; \ 421 fi 422 423# FIXME: There should be an @-sign in front of the `if'. 424# Leave out until this is tested a bit more. 425multi-clean: 426 if [ -z "$(MULTIDIRS)" ]; then \ 427 true; \ 428 else \ 429 lib=`pwd | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \ 430 for dir in Makefile $(MULTIDIRS); do \ 431 if [ -f ../$${dir}/$${lib}/Makefile ]; then \ 432 if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) $(DO)); \ 433 then true; \ 434 else exit 1; \ 435 fi; \ 436 else true; \ 437 fi; \ 438 done; \ 439 fi 440EOF 441 442cat ${Makefile} Multi.tem > Makefile.tem 443rm -f ${Makefile} Multi.tem 444mv Makefile.tem ${Makefile} 445 446fi # ${ml_toplevel_p} = yes 447 448if [ "${ml_verbose}" = --verbose ]; then 449 echo "Adding multilib support to Makefile in ${ml_realsrcdir}" 450 if [ "${ml_toplevel_p}" = yes ]; then 451 echo "multidirs=${multidirs}" 452 fi 453 echo "with_multisubdir=${with_multisubdir}" 454fi 455 456if [ "${srcdir}" = "." ]; then 457 if [ "${with_target_subdir}" != "." ]; then 458 ml_srcdotdot="../" 459 else 460 ml_srcdotdot="" 461 fi 462else 463 ml_srcdotdot="" 464fi 465 466if [ -z "${with_multisubdir}" ]; then 467 ml_subdir= 468 ml_builddotdot= 469 : # ml_srcdotdot= # already set 470else 471 ml_subdir="/${with_multisubdir}" 472 # The '[^/][^/]*' appears that way to work around a SunOS sed bug. 473 ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/ 474 if [ "$srcdir" = "." ]; then 475 ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot} 476 else 477 : # ml_srcdotdot= # already set 478 fi 479fi 480 481if [ "${ml_toplevel_p}" = yes ]; then 482 ml_do='$(MAKE)' 483 ml_clean='$(MAKE)' 484else 485 ml_do=true 486 ml_clean=true 487fi 488 489# TOP is used by newlib and should not be used elsewhere for this purpose. 490# MULTI{SRC,BUILD}TOP are the proper ones to use. MULTISRCTOP is empty 491# when srcdir != builddir. MULTIBUILDTOP is always some number of ../'s. 492# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can 493# delete TOP. Newlib may wish to continue to use TOP for its own purposes 494# of course. 495# MULTIDIRS is non-empty for the cpu top level Makefile (eg: newlib/Makefile) 496# and lists the subdirectories to recurse into. 497# MULTISUBDIR is non-empty in each cpu subdirectory's Makefile 498# (eg: newlib/h8300h/Makefile) and is the installed subdirectory name with 499# a leading '/'. 500# MULTIDO is used for targets like all, install, and check where 501# $(FLAGS_TO_PASS) augmented with the subdir's compiler option is needed. 502# MULTICLEAN is used for the *clean targets. 503# 504# ??? It is possible to merge MULTIDO and MULTICLEAN into one. They are 505# currently kept separate because we don't want the *clean targets to require 506# the existence of the compiler (which MULTIDO currently requires) and 507# therefore we'd have to record the directory options as well as names 508# (currently we just record the names and use --print-multi-lib to get the 509# options). 510 511sed -e "s:^TOP[ ]*=[ ]*\([./]*\)[ ]*$:TOP = ${ml_builddotdot}\1:" \ 512 -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \ 513 -e "s:^MULTIBUILDTOP[ ]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \ 514 -e "s:^MULTIDIRS[ ]*=.*$:MULTIDIRS = ${multidirs}:" \ 515 -e "s:^MULTISUBDIR[ ]*=.*$:MULTISUBDIR = ${ml_subdir}:" \ 516 -e "s:^MULTIDO[ ]*=.*$:MULTIDO = $ml_do:" \ 517 -e "s:^MULTICLEAN[ ]*=.*$:MULTICLEAN = $ml_clean:" \ 518 ${Makefile} > Makefile.tem 519rm -f ${Makefile} 520mv Makefile.tem ${Makefile} 521 522# If this is the library's top level, configure each multilib subdir. 523# This is done at the end because this is the loop that runs configure 524# in each multilib subdir and it seemed reasonable to finish updating the 525# Makefile before going on to configure the subdirs. 526 527if [ "${ml_toplevel_p}" = yes ]; then 528 529# We must freshly configure each subdirectory. This bit of code is 530# actually partially stolen from the main configure script. FIXME. 531 532if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then 533 534 if [ "${ml_verbose}" = --verbose ]; then 535 echo "Running configure in multilib subdirs ${multidirs}" 536 echo "pwd: `pwd`" 537 fi 538 539 ml_origdir=`pwd` 540 ml_libdir=`echo $ml_origdir | sed -e 's,^.*/,,'` 541 # cd to top-level-build-dir/${with_target_subdir} 542 cd .. 543 544 for ml_dir in ${multidirs}; do 545 546 if [ "${ml_verbose}" = --verbose ]; then 547 echo "Running configure in multilib subdir ${ml_dir}" 548 echo "pwd: `pwd`" 549 fi 550 551 if [ -d ${ml_dir} ]; then true; else mkdir ${ml_dir}; fi 552 if [ -d ${ml_dir}/${ml_libdir} ]; then true; else mkdir ${ml_dir}/${ml_libdir}; fi 553 554 # Eg: if ${ml_dir} = m68000/m68881, dotdot = ../../ 555 dotdot=../`echo ${ml_dir} | sed -e 's|[^/]||g' -e 's|/|../|g'` 556 557 case ${srcdir} in 558 ".") 559 echo Building symlink tree in `pwd`/${ml_dir}/${ml_libdir} 560 if [ "${with_target_subdir}" != "." ]; then 561 ml_unsubdir="../" 562 else 563 ml_unsubdir="" 564 fi 565 (cd ${ml_dir}/${ml_libdir}; 566 ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "") 567 ml_newsrcdir="." 568 ml_srcdiroption= 569 multisrctop=${dotdot} 570 ;; 571 *) 572 case "${srcdir}" in 573 /*) # absolute path 574 ml_newsrcdir=${srcdir} 575 ;; 576 *) # otherwise relative 577 ml_newsrcdir=${dotdot}${srcdir} 578 ;; 579 esac 580 ml_srcdiroption="-srcdir=${ml_newsrcdir}" 581 multisrctop= 582 ;; 583 esac 584 585 case "${progname}" in 586 /*) ml_recprog=${progname} ;; 587 *) ml_recprog=${dotdot}${progname} ;; 588 esac 589 590 # FIXME: POPDIR=${PWD=`pwd`} doesn't work here. 591 ML_POPDIR=`pwd` 592 cd ${ml_dir}/${ml_libdir} 593 594 if [ -f ${ml_newsrcdir}/configure ]; then 595 ml_recprog=${ml_newsrcdir}/configure 596 fi 597 if eval ${ml_config_shell} ${ml_recprog} \ 598 --with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \ 599 ${ml_arguments} ${ml_srcdiroption} ; then 600 true 601 else 602 exit 1 603 fi 604 605 cd ${ML_POPDIR} 606 607 done 608 609 cd ${ml_origdir} 610fi 611 612fi # ${ml_toplevel_p} = yes 613fi # ${enable_multilib} = yes 614