From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2343 invoked by alias); 3 Jun 2003 19:19:29 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 2276 invoked from network); 3 Jun 2003 19:19:28 -0000 Received: from unknown (HELO ms-smtp-03.nyroc.rr.com) (24.92.226.153) by sources.redhat.com with SMTP; 3 Jun 2003 19:19:28 -0000 Received: from doctormoo (syr-24-24-19-190.twcny.rr.com [24.24.19.190]) by ms-smtp-03.nyroc.rr.com (8.12.5/8.12.2) with ESMTP id h53JJQik021825; Tue, 3 Jun 2003 15:19:26 -0400 (EDT) Received: from neroden by doctormoo with local (Exim 3.36 #1 (Debian)) id 19NHJa-0006fM-00; Tue, 03 Jun 2003 15:19:22 -0400 Date: Tue, 03 Jun 2003 19:19:00 -0000 To: gcc-patches@gcc.gnu.org, gdb-patches@sources.redhat.com, binutils@sources.redhat.com, dj@redhat.com Subject: [toplevel patch] Autogenerate all recursive targets (death to shell loops) Message-ID: <20030603191922.GA25625@doctormoo> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.4i From: Nathanael Nerode X-SW-Source: 2003-06/txt/msg00130.txt.bz2 This continues my rewrite of the top level Makefile structure; the last of the evil embedded shell loops is slain. Also, Wolfgang will appreciate the addition of the dvi-x: configure-x dependencies; now '../gcc/configure; make dvi' will work. Unfortunately, it will cause GCC to be built (which is technically correct, but may not be desirable). This is because of the following chain, for example: dvi: dvi-target dvi-target: dvi-target-libffi dvi-target-libffi: configure-target-libffi configure-target-libffi: all-gcc If it is preferred, I can simply cut out the dependencies from Makefile.def, which will leave things back where they were with no noticable behavior change. (I tested that version too.) Tested on i686-pc-linux-gnu with lots of combinations of the affected targets. * Makefile.tpl: Make 'recursive targets' using autogen rather than shell loop. Remove duplicate 'clean' targets. * Makefile.def: Add systematic dependencies to 'recursive' targets. * Makefile.in: Regenerate. * configure.in: Add 'recursive targets' to maybe list. Index: Makefile.def =================================================================== RCS file: /cvs/gcc/gcc/Makefile.def,v retrieving revision 1.8 diff -u -r1.8 Makefile.def --- Makefile.def 3 Jun 2003 16:35:42 -0000 1.8 +++ Makefile.def 3 Jun 2003 19:17:51 -0000 @@ -87,12 +87,22 @@ // These are (some of) the make targets to be done in each subdirectory. // Not all; these are the ones which don't have special options. +// "depend" indicates that a target depends on another target uniformly +// for each subdirectory. There can be several such lines per target. +recursive_targets = { make_target= info; + depend=configure; }; +recursive_targets = { make_target= dvi; + depend=configure; }; +recursive_targets = { make_target= TAGS; + depend=configure; }; +recursive_targets = { make_target= install-info; + depend=configure; + depend=info; }; +recursive_targets = { make_target= installcheck; + depend=configure; }; +recursive_targets = { make_target= mostlyclean; }; recursive_targets = { make_target= clean; }; recursive_targets = { make_target= distclean; }; -recursive_targets = { make_target= dvi; }; -recursive_targets = { make_target= info; }; -recursive_targets = { make_target= install-info; }; -recursive_targets = { make_target= installcheck; }; -recursive_targets = { make_target= mostlyclean; }; recursive_targets = { make_target= maintainer-clean; }; -recursive_targets = { make_target= TAGS; }; + + Index: Makefile.tpl =================================================================== RCS file: /cvs/gcc/gcc/Makefile.tpl,v retrieving revision 1.52 diff -u -r1.52 Makefile.tpl --- Makefile.tpl 3 Jun 2003 16:35:42 -0000 1.52 +++ Makefile.tpl 3 Jun 2003 19:17:59 -0000 @@ -565,26 +565,6 @@ maybe-configure-target-[+module+][+ ENDFOR target_modules +] -# This is a list of the targets for which we can do a clean-{target}. -CLEAN_MODULES =[+ - FOR host_modules +][+ - IF (not (or (exist? "no_clean") (exist? "with_x"))) +] \ - clean-[+module+][+ - ENDIF no_clean +][+ - ENDFOR host_modules +] - -# All of the target modules that can be cleaned -CLEAN_TARGET_MODULES =[+ - FOR target_modules +][+ - IF (not (exist? "no_clean")) +] \ - clean-target-[+module+][+ - ENDIF no_clean +][+ - ENDFOR target_modules +] - -# All of the x11 modules that can be cleaned -CLEAN_X11_MODULES = [+ FOR host_modules +][+ IF with_x +]\ - clean-[+module+] [+ ENDIF with_x +][+ ENDFOR host_modules +] - # The target built for a native build. .PHONY: all.normal all.normal: @all_build_modules@ all-host all-target @@ -609,54 +589,94 @@ # length limit on some systems. [+ FOR recursive_targets +] .PHONY: do-[+make_target+] -do-[+make_target+]: - @r=`${PWD}`; export r; \ +do-[+make_target+]: [+make_target+]-host [+make_target+]-target + +.PHONY: [+make_target+]-host +[+make_target+]-host: maybe-[+make_target+]-gcc [+ + FOR host_modules +] \ + maybe-[+make_target+]-[+module+][+ + ENDFOR host_modules +] + +.PHONY: do-[+make_target+]-target +[+make_target+]-target: [+ + FOR target_modules +] \ + maybe-[+make_target+]-target-[+module+][+ + ENDFOR target_modules +] + +# GCC, the eternal special case +.PHONY: maybe-[+make_target+]-gcc [+make_target+]-gcc +maybe-[+make_target+]-gcc: +[+make_target+]-gcc: [+ + FOR depend +]\ + [+depend+]-gcc [+ + ENDFOR depend +] + @[ -f ./gcc/Makefile ] || exit 0; \ + r=`${PWD}`; export r; \ s=`cd $(srcdir); ${PWD}`; export s; \ $(SET_LIB_PATH) \ - for i in $(SUBDIRS) -dummy-; do \ - if [ -f ./$$i/Makefile ]; then \ - case $$i in \ - gcc) \ - for flag in $(EXTRA_GCC_FLAGS); do \ - eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ - done; \ - ;; \ - *) \ - for flag in $(EXTRA_HOST_FLAGS); do \ - eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ - done; \ - ;; \ - esac ; \ - (cd ./$$i && \ - $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ - "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ - "RANLIB=$${RANLIB}" \ - "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \ - [+make_target+]) \ - || exit 1; \ - else true; fi; \ - done - # Break into two pieces + for flag in $(EXTRA_GCC_FLAGS); do \ + eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ + done; \ + echo "Doing [+make_target+] in gcc" ; \ + (cd gcc && \ + $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ + "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ + "RANLIB=$${RANLIB}" \ + "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \ + [+make_target+]) \ + || exit 1 + +# Host modules. +[+ FOR host_modules +] +.PHONY: maybe-[+make_target+]-[+module+] [+make_target+]-[+module+] +maybe-[+make_target+]-[+module+]: +[+make_target+]-[+module+]: [+ + FOR depend +]\ + [+depend+]-[+module+] [+ + ENDFOR depend +] + @[ -f ./[+module+]/Makefile ] || exit 0; \ r=`${PWD}`; export r; \ s=`cd $(srcdir); ${PWD}`; export s; \ $(SET_LIB_PATH) \ - for i in $(TARGET_CONFIGDIRS) -dummy-; do \ - if [ -f $(TARGET_SUBDIR)/$$i/Makefile ]; then \ - for flag in $(EXTRA_TARGET_FLAGS); do \ - eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ - done; \ - (cd $(TARGET_SUBDIR)/$$i && \ - $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ - "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ - "RANLIB=$${RANLIB}" \ - "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \ - [+make_target+]) \ - || exit 1; \ - else true; fi; \ - done + for flag in $(EXTRA_HOST_FLAGS); do \ + eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ + done; \ + echo "Doing [+make_target+] in [+module+]" ; \ + (cd [+module+] && \ + $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ + "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ + "RANLIB=$${RANLIB}" \ + "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \ + [+make_target+]) \ + || exit 1 +[+ ENDFOR host_modules +] + +# Target modules. +[+ FOR target_modules +] +.PHONY: maybe-[+make_target+]-target-[+module+] [+make_target+]-target-[+module+] +maybe-[+make_target+]-target-[+module+]: +[+make_target+]-target-[+module+]: [+ + FOR depend +]\ + [+depend+]-target-[+module+] [+ + ENDFOR depend +] + @[ -f $(TARGET_SUBDIR)/[+module+]/Makefile ] || exit 0 ; \ + r=`${PWD}`; export r; \ + s=`cd $(srcdir); ${PWD}`; export s; \ + $(SET_LIB_PATH) \ + echo "Doing [+make_target+] in $(TARGET_SUBDIR)/[+module+]" ; \ + for flag in $(EXTRA_TARGET_FLAGS); do \ + eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \ + done; \ + (cd $(TARGET_SUBDIR)/$$i && \ + $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \ + "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \ + "RANLIB=$${RANLIB}" \ + "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \ + [+make_target+]) \ + || exit 1 +[+ ENDFOR target_modules +] [+ ENDFOR recursive_targets +] - # Here are the targets which correspond to the do-X targets. .PHONY: info installcheck dvi install-info @@ -703,33 +723,8 @@ maintainer-clean: local-distclean realclean: maintainer-clean -# This rule is used to clean specific modules. -.PHONY: $(CLEAN_MODULES) $(CLEAN_X11_MODULES) clean-gcc -$(CLEAN_MODULES) $(CLEAN_X11_MODULES) clean-gcc: - @dir=`echo $@ | sed -e 's/clean-//'`; \ - if [ -f ./$${dir}/Makefile ] ; then \ - r=`${PWD}`; export r; \ - s=`cd $(srcdir); ${PWD}`; export s; \ - $(SET_LIB_PATH) \ - (cd $${dir} && $(MAKE) $(FLAGS_TO_PASS) clean); \ - else \ - true; \ - fi - -.PHONY: $(CLEAN_TARGET_MODULES) -$(CLEAN_TARGET_MODULES): - @dir=`echo $@ | sed -e 's/clean-target-//'`; \ - rm -f $(TARGET_SUBDIR)/$${dir}/multilib.out $(TARGET_SUBDIR)/$${dir}/tmpmulti.out; \ - if [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \ - r=`${PWD}`; export r; \ - s=`cd $(srcdir); ${PWD}`; export s; \ - $(SET_LIB_PATH) \ - (cd $(TARGET_SUBDIR)/$${dir} && $(MAKE) $(TARGET_FLAGS_TO_PASS) clean); \ - else \ - true; \ - fi - -clean-target: $(CLEAN_TARGET_MODULES) clean-target-libgcc +# Extra dependency for clean-target, owing to the mixed nature of gcc +clean-target: clean-target-libgcc clean-target-libgcc: test ! -d gcc/libgcc || \ (cd gcc/libgcc && find . -type d -print) | \ Index: configure.in =================================================================== RCS file: /cvs/gcc/gcc/configure.in,v retrieving revision 1.236 diff -u -r1.236 configure.in --- configure.in 22 May 2003 02:49:07 -0000 1.236 +++ configure.in 3 Jun 2003 19:18:09 -0000 @@ -1655,7 +1655,8 @@ echo '# maybedep.tmp' > maybedep.tmp # Make-targets which may need maybe dependencies. -mts="configure all install check" +mts="configure all install check clean distclean dvi info install-info" +mts="${mts} installcheck mostlyclean maintainer-clean TAGS" # Loop over modules and make-targets. for module in ${build_modules} ; do