From 8becd045a3ff51887dead36493bb591a878c9ed5 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Tue, 14 Apr 1992 19:02:48 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 ++ configure | 372 +++++++++++++++++++++++++++++++++------------------------ configure.texi | 27 ++++- 3 files changed, 244 insertions(+), 162 deletions(-) diff --git a/ChangeLog b/ChangeLog index 458497b..f089c9d 100644 --- 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 diff --git a/configure b/configure index 2eebca5..5fd474e 100755 --- 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 < .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 < 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} < ${Makefile} <>${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/ //" \ - -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/ //" \ + -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 diff --git a/configure.texi b/configure.texi index 5c7545e..89bcef7 100644 --- a/configure.texi +++ b/configure.texi @@ -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} -- 2.7.4