* configure: Add support for 'subdirs' variable, which is
authorPer Bothner <per@bothner.com>
Tue, 14 Apr 1992 19:02:48 +0000 (19:02 +0000)
committerPer Bothner <per@bothner.com>
Tue, 14 Apr 1992 19:02:48 +0000 (19:02 +0000)
like 'configdirs', except that configure doesn't re-invoke
itself for subdirs, it just creates a Makefile for each subdir.
* configure.texi:  Document subdirs.

ChangeLog
configure
configure.texi

index 458497b..f089c9d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue Apr 14 11:56:09 1992  Per Bothner  (bothner@cygnus.com)
+
+       * configure:  Add support for 'subdirs' variable, which is
+       like 'configdirs', except that configure doesn't re-invoke
+       itself for subdirs, it just creates a Makefile for each subdir.
+       * configure.texi:  Document subdirs.
+
 Mon Apr 13 18:50:16 1992  david d `zoo' zuhn  (zoo at cirdan.cygnus.com)
 
        * configure.in: added flex to configdirs
index 2eebca5..5fd474e 100755 (executable)
--- a/configure
+++ b/configure
@@ -62,6 +62,7 @@ next_srcdir=
 next_target=
 next_tmpdir=
 norecursion=
+removing=
 prefix=/usr/local
 progname=
 program_prefix=
@@ -72,6 +73,7 @@ site_option=
 site_makefile_frag=
 srcdir=
 srctrigger=
+subdirs=
 target_alias=
 target_makefile_frag=
 undefinedargs=
@@ -171,6 +173,7 @@ do
                -prefix | --prefix | --prefi | --pref | --pre)
                        next_prefix=yes
                        ;;
+               -rm | --rm) removing=${arg} ;;
                -program_prefix=* | --program_prefix=* | --program_prefi=* | --program_pref=* | --program_pre=* | --program_pr=* | --program_p=* | --program_=* | --program=* | --progra=* | --progr=* | --prog=* | --pro=*)
                        program_prefix=`echo ${arg} | sed 's/^[-a-z]*=//'`
                        program_prefixoption=${arg}
@@ -357,7 +360,7 @@ esac
 
 # default exec_prefix
 case "${exec_prefix}" in
-"") exec_prefix="$(prefix)" ;;
+"") exec_prefix="\$(prefix)" ;;
 *) ;;
 esac
 
@@ -450,116 +453,149 @@ if [ ! -r ${srcdir}/${srctrigger} ] ; then
        exit 1
 fi
 
-# Set up the list of links to be made.
-# ${links} is the list of link names, and ${files} is the list of names to link to.
+for subdir in . ${subdirs} ; do
 
-# Make the links.
-configlinks="${links}"
-while [ -n "${files}" ] ; do
-       # set file to car of files, files to cdr of files
-       set ${files}; file=$1; shift; files=$*
-       set ${links}; link=$1; shift; links=$*
+    # ${subdir} is relative path from . to the directory we're currently
+    # configuring.
+    # ${invsubdir} is inverse of ${subdir), *with* trailing /, if needed.
+    invsubdir=`echo ${subdir}/ | sed -e 's|\./||g' -e 's|[^/]*/|../|g'`
 
-       if [ ! -r ${srcdir}/${file} ] ; then
-               echo '***' "${progname}: cannot create a link \"${link}\"," 1>&2
-               echo '***' "since the file \"${file}\" does not exist." 1>&2
-               exit 1
-       fi
+    ### figure out what to do with srcdir
+    case "${srcdir}" in
+       ".")  # no -srcdir option.  We're building in place.
+               makesrcdir=. ;;
+       /*) # absolute path
+               makesrcdir=`echo ${srcdir}/${subdir} | sed -e 's|/\.$||'`
+               ;;
+       *) # otherwise relative
+               makesrcdir=../${srcdir}/${subdir}
+               ;;
+    esac
 
-       ${remove} -f ${link}
-       rm -f config.status
-       # Make a symlink if possible, otherwise try a hard link
-       ${symbolic_link} ${srcdir}/${file} ${link} 2>/dev/null || ${hard_link} ${srcdir}/${file} ${link}
+    if [ "${subdir}/" != "./" ] ; then
+       Makefile=${subdir}/Makefile
+    fi
 
-       if [ ! -r ${link} ] ; then
-               echo '***' "${progname}: unable to link \"${link}\" to \"${srcdir}/${file}\"." 1>&2
-               exit 1
+    case "${removing}" in
+    "")
+       if [ -n "${verbose}" -o -z "${silent}" ] ; then
+           echo Building in ${subdir}
        fi
+       # FIXME Should this be done recursively ??? (Useful for e.g. gdbtest)
+       # Set up the list of links to be made.
+       # ${links} is the list of link names, and ${files} is the list of names to link to.
+
+       # Make the links.
+       configlinks="${links}"
+       while [ -n "${files}" ] ; do
+               # set file to car of files, files to cdr of files
+               set ${files}; file=$1; shift; files=$*
+               set ${links}; link=$1; shift; links=$*
+
+               if [ ! -r ${srcdir}/${file} ] ; then
+                       echo '***' "${progname}: cannot create a link \"${link}\"," 1>&2
+                       echo '***' "since the file \"${file}\" does not exist." 1>&2
+                       exit 1
+               fi
 
-       case "${verbose}" in
-       "") ;;
-       *)  echo "Linked \"${link}\" to \"${srcdir}/${file}\"." ;;
-       esac
-done
+               ${remove} -f ${link}
+               rm -f config.status
+               # Make a symlink if possible, otherwise try a hard link
+               ${symbolic_link} ${srcdir}/${file} ${link} 2>/dev/null || ${hard_link} ${srcdir}/${file} ${link}
+
+               if [ ! -r ${link} ] ; then
+                       echo '***' "${progname}: unable to link \"${link}\" to \"${srcdir}/${file}\"." 1>&2
+                       exit 1
+               fi
 
-# Create a .gdbinit file which runs the one in srcdir
-# and tells GDB to look there for source files.
+               case "${verbose}" in
+               "") ;;
+               *)  echo "Linked \"${link}\" to \"${srcdir}/${file}\"." ;;
+               esac
+       done
 
-if [ -r ${srcdir}/.gdbinit ] ; then
-       case ${srcdir} in
-       .)
-               ;;
-       *) cat > .gdbinit <<EOF
-# ${NO_EDIT} > .gdbinit
+       # Create a .gdbinit file which runs the one in srcdir
+       # and tells GDB to look there for source files.
+
+       if [ -r ${srcdir}/${subdir}/.gdbinit ] ; then
+               case ${srcdir} in
+               .)
+                       ;;
+               *) cat > ${subdir}/.gdbinit <<EOF
+# ${NO_EDIT}
 dir .
-dir ${srcdir}
-source ${srcdir}/.gdbinit
+dir ${makesrcdir}
+source ${makesrcdir}/.gdbinit
 EOF
-               ;;
-       esac
-fi
+                       ;;
+               esac
+       fi
 
-# Install a makefile, and make it set VPATH
-# if necessary so that the sources are found.
-# Also change its value of srcdir.
-# NOTE: Makefile generation constitutes the majority of the time in configure.  Hence, this section has
-# been somewhat optimized and is perhaps a bit twisty.
+       # Install a makefile, and make it set VPATH
+       # if necessary so that the sources are found.
+       # Also change its value of srcdir.
+       # NOTE: Makefile generation constitutes the majority of the time in configure.  Hence, this section has
+       # been somewhat optimized and is perhaps a bit twisty.
 
-# code is order so as to try to sed the smallest input files we know.
+       # code is order so as to try to sed the smallest input files we know.
 
-# the three makefile fragments MUST end up in the resulting Makefile in this order: target, host, and site.
-# so do these separately because I don't trust the order of sed -e expressions.
+       # the three makefile fragments MUST end up in the resulting Makefile in this order: target, host, and site.
+       # so do these separately because I don't trust the order of sed -e expressions.
 
-# Conditionalize for this site from "Makefile.in" (or whatever it's called) into Makefile.tem
-case "${site}" in
-"") cp ${srcdir}/${Makefile_in} Makefile.tem ;;
-*)
-       site_makefile_frag=${srcdir}/config/ms-${site}
+       # Conditionalize for this site from "Makefile.in" (or whatever it's called) into Makefile.tem
+       case "${site}" in
+       "") cp ${srcdir}/${subdir}/${Makefile_in} ${subdir}/Makefile.tem ;;
+       *)
+               site_makefile_frag=${srcdir}/config/ms-${site}
 
-       if [ -f ${site_makefile_frag} ] ; then
-               sed -e "/^####/  r ${site_makefile_frag}" ${srcdir}/${Makefile_in} \
-                       Makefile.tem
-       else
-               cp ${srcdir}/${Makefile_in} Makefile.tem
-               site_makefile_frag=
-       fi
-       ;;
-esac
-# working copy now in Makefile.tem
+               if [ -f ${site_makefile_frag} ] ; then
+                       sed -e "/^####/  r ${site_makefile_frag}" ${srcdir}/${subdir}/${Makefile_in} \
+                               > ${subdir}/Makefile.tem
+               else
+                       cp ${srcdir}/${subdir}/${Makefile_in} ${subdir}/Makefile.tem
+                       site_makefile_frag=
+               fi
+               ;;
+       esac
+       # working copy now in ${subdir}/Makefile.tem
 
-# Conditionalize the makefile for this host.
-case "${host_makefile_frag}" in
-"") mv Makefile.tem ${Makefile} ;;
-*)
-       host_makefile_frag=${srcdir}/${host_makefile_frag}
-       if [ -f ${host_makefile_frag} ] ; then
-               sed -e "/^####/  r ${host_makefile_frag}" Makefile.tem > ${Makefile}
-       else
-               echo '***' Expected host makefile fragment \"${host_makefile_frag}\" 1>&2
-               echo '***' is missing in ${PWD}. 1>&2
-               mv Makefile.tem ${Makefile}
-       fi
-esac
-# working copy now in ${Makefile}
+       # Conditionalize the makefile for this host.
+       case "${host_makefile_frag}" in
+       "") mv ${subdir}/Makefile.tem ${Makefile} ;;
+       *)
+               if [ ! -f ${host_makefile_frag} ] ; then
+                       host_makefile_frag=${srcdir}/${host_makefile_frag}
+               fi
+               if [ -f ${host_makefile_frag} ] ; then
+                       sed -e "/^####/  r ${host_makefile_frag}" ${subdir}/Makefile.tem > ${Makefile}
+               else
+                       echo '***' Expected host makefile fragment \"${host_makefile_frag}\" 1>&2
+                       echo '***' is missing in ${PWD}. 1>&2
+                       mv ${subdir}/Makefile.tem ${Makefile}
+               fi
+       esac
+       # working copy now in ${Makefile}
 
-# Conditionalize the makefile for this target.
-case "${target_makefile_frag}" in
-"") mv ${Makefile} Makefile.tem ;;
-*)
-       target_makefile_frag=${srcdir}/${target_makefile_frag}
-       if [ -f ${target_makefile_frag} ] ; then
-               sed -e "/^####/  r ${target_makefile_frag}" ${Makefile} > Makefile.tem
-       else
-               mv ${Makefile} Makefile.tem
-               target_makefile_frag=
-       fi
-       ;;
-esac
-# real copy now in Makefile.tem
+       # Conditionalize the makefile for this target.
+       case "${target_makefile_frag}" in
+       "") mv ${Makefile} ${subdir}/Makefile.tem ;;
+       *)
+               target_makefile_frag=${srcdir}/${target_makefile_frag}
+               if [ -f ${target_makefile_frag} ] ; then
+                       sed -e "/^####/  r ${target_makefile_frag}" ${Makefile} > ${subdir}/Makefile.tem
+               else
+                       mv ${Makefile} ${subdir}/Makefile.tem
+                       target_makefile_frag=
+               fi
+               ;;
+       esac
+       # real copy now in ${subdir}/Makefile.tem
 
-# prepend warning about editting, and a bunch of variables.
-cat > ${Makefile} <<EOF
+       # prepend warning about editting, and a bunch of variables.
+       cat > ${Makefile} <<EOF
 # ${NO_EDIT}
+VPATH = ${makesrcdir}
+links = ${configlinks}
 host_alias = ${host_alias}
 host_cpu = ${host_cpu}
 host_vendor = ${host_vendor}
@@ -568,84 +604,106 @@ target_alias = ${target_alias}
 target_cpu = ${target_cpu}
 target_vendor = ${target_vendor}
 target_os = ${target_os}
-target_makefile_frag = ${target_makefile_frag}
-host_makefile_frag = ${host_makefile_frag}
-site_makefile_frag = ${site_makefile_frag}
-links = ${configlinks}
-VPATH = ${srcdir}
 EOF
+       if [ "${target_makefile_frag}" != "" ] ; then
+           echo target_makefile_frag = ${invsubdir}${target_makefile_frag} >>${Makefile}
+       fi 
+       if [ "${host_makefile_frag}" != "" ] ; then
+           echo host_makefile_frag = ${invsubdir}${host_makefile_frag} >>${Makefile}
+       fi 
+       if [ "${site_makefile_frag}" != "" ] ; then
+           echo site_makefile_frag = ${invsubdir}${site_makefile_frag} >>${Makefile}
+       fi 
+
+       # fixme: this shouldn't be in configure.
+       # Define macro CROSS_COMPILE in compilation if this is a cross-compiler.
+       case "${host_alias}" in
+       "${target_alias}")
+               tooldir="\$(libdir)"
+               echo "ALL=all.internal" >> ${Makefile}
+               ;;
+       *)
+               echo "CROSS=-DCROSS_COMPILE" >> ${Makefile}
+               echo "ALL=all.cross" >> ${Makefile}
+               case "${program_prefix}" in
+               "")     program_prefix=${target_alias}- ;;
+               *)      ;;
+               esac
 
-# fixme: this shouldn't be in configure.
-# Define macro CROSS_COMPILE in compilation if this is a cross-compiler.
-case "${host_alias}" in
-"${target_alias}")
-       tooldir="$(libdir)"
-       echo "ALL=all.internal" >> ${Makefile}
-       ;;
-*)
-       echo "CROSS=-DCROSS_COMPILE" >> ${Makefile}
-       echo "ALL=all.cross" >> ${Makefile}
-       case "${program_prefix}" in
-       "")     program_prefix=${target_alias}- ;;
-       *)      ;;
+               tooldir="\$(libdir)/${target_alias}"
+               ;;
        esac
 
-       tooldir="$(libdir)/${target_alias}"
-       ;;
-esac
-
-# reset prefix, exec_prefix, srcdir, SUBDIRS, NONSUBDIRS, remove any form
-# feeds.
-sed -e "s:^prefix[     ]*=.*$:prefix = ${prefix}:" \
-       -e "s:^exec_prefix[     ]*=.*$:exec_prefix = ${exec_prefix}:" \
-       -e "s:^srcdir[  ]*=.*$:srcdir = ${srcdir}:" \
-       -e "s:^SUBDIRS[         ]*=.*$:SUBDIRS = ${configdirs}:" \
-       -e "s:^NONSUBDIRS[      ]*=.*$:NONSUBDIRS = ${noconfigdirs}:" \
-       -e "s/\f//" \
-       -e "s:^program_prefix[  ]*=.*$:program_prefix = ${program_prefix}:" \
-       -e "s:^tooldir[         ]*=.*$:tooldir = ${tooldir}:" \
-       Makefile.tem >> ${Makefile}
-# final copy now in ${Makefile}
-
-rm Makefile.tem
-
-if [ -n "${verbose}" -o -z "${silent}" ] ; then
-       case "${host_makefile_frag}" in
-       "") using= ;;
-       *) using="and \"${host_makefile_frag}\"" ;;
-       esac
+       # reset prefix, exec_prefix, srcdir, SUBDIRS, NONSUBDIRS,
+       # remove any form feeds.
+       if [ -z "${subdirs}" ]; then
+           sed -e "s:^SUBDIRS[         ]*=.*$:SUBDIRS = ${configdirs}:" \
+               -e "s:^NONSUBDIRS[      ]*=.*$:NONSUBDIRS = ${noconfigdirs}:" \
+               ${subdir}/Makefile.tem > ${subdir}/Makefile.tem2
+           mv ${subdir}/Makefile.tem2 ${subdir}/Makefile.tem
+       fi
+       sed -e "s:^prefix[      ]*=.*$:prefix = ${prefix}:" \
+               -e "s:^exec_prefix[     ]*=.*$:exec_prefix = ${exec_prefix}:" \
+               -e "s:^srcdir[  ]*=.*$:srcdir = ${makesrcdir}:" \
+               -e "s/\f//" \
+               -e "s:^program_prefix[  ]*=.*$:program_prefix = ${program_prefix}:" \
+               -e "s:^tooldir[         ]*=.*$:tooldir = ${tooldir}:" \
+               ${subdir}/Makefile.tem >> ${Makefile}
+       # final copy now in ${Makefile}
+
+       rm ${subdir}/Makefile.tem
+
+       if [ -n "${verbose}" -o -z "${silent}" ] ; then
+               case "${host_makefile_frag}" in
+               "") using= ;;
+               *) using="and \"${host_makefile_frag}\"" ;;
+               esac
 
-       case "${target_makefile_frag}" in
-       "") ;;
-       *) using="${using} and \"${target_makefile_frag}\"" ;;
-       esac
+               case "${target_makefile_frag}" in
+               "") ;;
+               *) using="${using} and \"${target_makefile_frag}\"" ;;
+               esac
 
-       case "${site_makefile_frag}" in
-       "") ;;
-       *) using="${using} and \"${site_makefile_frag}\"" ;;
-       esac
+               case "${site_makefile_frag}" in
+               "") ;;
+               *) using="${using} and \"${site_makefile_frag}\"" ;;
+               esac
 
-       echo "Created \"${Makefile}\" in" ${PWD} `echo "${using}" | sed 's/and/using/'`
-fi
+               echo "Created \"${Makefile}\" in" ${PWD} `echo "${using}" | sed 's/and/using/'`
+       fi
 
-. ${tmpfile}.pos
+       . ${tmpfile}.pos
 
-# describe the chosen configuration in config.status.
-# Make that file a shellscript which will reestablish
-# the same configuration.  Used in Makefiles to rebuild
-# Makefiles.
+       # describe the chosen configuration in config.status.
+       # Make that file a shellscript which will reestablish
+       # the same configuration.  Used in Makefiles to rebuild
+       # Makefiles.
 
-case "${norecursion}" in
-"") arguments="${arguments} -norecursion" ;;
-*) ;;
-esac
+       case "${norecursion}" in
+       "") arguments="${arguments} -norecursion" ;;
+       *) ;;
+       esac
 
-echo "#!/bin/sh
+       if [ ${subdir} = . ] ; then
+           echo "#!/bin/sh
 # ${NO_EDIT}
 # ${PWD} was configured as follows:
 ${progname}" ${arguments}  "
-# ${using}" > config.status
-chmod a+x config.status
+# ${using}" > ${subdir}/config.status
+       else
+           echo "#!/bin/sh
+# ${NO_EDIT}
+# ${PWD}/${subdir} was configured as follows:
+cd ${invsubdir}
+${progname}" ${arguments}  "
+# ${using}" > ${subdir}/config.status
+       fi
+       chmod a+x ${subdir}/config.status
+       ;;
+
+    *) rm -f ${Makefile} ${subdir}/config.status ${links} ;;
+    esac
+done
 
 # If there are subdirectories, then recur. 
 if [ -z "${norecursion}" -a -n "${configdirs}" ] ; then 
@@ -694,7 +752,7 @@ if [ -z "${norecursion}" -a -n "${configdirs}" ] ; then
 ### The recursion line is here.
                        if ${recprog} -s ${host_alias} -target=${target_alias} \
                                ${verbose} ${prefixoption} ${tmpdiroption} ${exec_prefixoption} \
-                               ${srcdiroption} ${program_prefixoption} ${site_option} ; then
+                               ${srcdiroption} ${program_prefixoption} ${site_option} ${removing} ; then
                                true
                        else
                                exit 1
index 5c7545e..89bcef7 100644 (file)
@@ -983,13 +983,30 @@ error message.
 @defvar{configdirs}
 Contains the names of any subdirectories where @code{configure} should
 recur.  You must usually set this in the per-invocation section of
-@file{configure.in}.  If @file{Makefile.in} contains a line starting
-with @code{SUBDIRS =}, then it will be replaced with an assignment to
-@code{SUBDIRS} using the value of @code{configdirs}.  This can be used
-to determine which directories to configure and build depending on the
-host and target configurations.
+@file{configure.in}.
+If @file{Makefile.in} contains a line starting with @code{SUBDIRS =},
+then it will be replaced with an assignment to @code{SUBDIRS} using
+the value of @code{configdirs} (if #code{subdirs} is empty).  This can
+be used to determine which directories to configure and build depending
+on the host and target configurations.
 @c Most other matching makefile/config vars use the same name.  Why not
 @c this? (FIXME).
+@c Can we get rid of SUBDIRS-substitution?  It doesn't work well with subdirs.
+Use @code{configdirs} (instead of the @code{subdirs} variable
+described below) if you want to be able to partition the
+sub-directories, or use independent Makefile fragments.
+Each sub-directory can be independent, and independently re-configured.
+@end defvar
+
+@defvar{subdirs}
+Contains the names of any subdirectories where @code{configure} should
+create a @code{Makefile} (in addition to the current directory),
+@emph{without} recursively running @code{configure}.
+Use @code{subdirs} (instead of the @code{configdirs} variable
+described above) if you want to configure all of the directories
+as a unit.  Since there is a single invocation of @code{configure}
+that configures many directories, all the directories can use the
+same Makefile fragments, and the same @code{configure.in}.
 @end defvar
 
 @defvar{host}