public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Fix in-srcdir build of gcc
@ 2005-02-25 20:49 Paolo Bonzini
  2005-02-25 22:11 ` Daniel Jacobowitz
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Paolo Bonzini @ 2005-02-25 20:49 UTC (permalink / raw)
  To: binutils, gdb-patches, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 971 bytes --]

This patch is a "definitive" solution to the problem of building gcc 
in-srcdir.  It builds host modules out of srcdir always, so that they do 
not conflict with the configuration of build or target modules.  For an 
out-of-srcdir build, this does not change anything, but when --srcdir=. 
gcc will be configured to for example host-i686-pc-linux-gnu/gcc, ld 
will be configured to for example host-i686-pc-linux-gnu/ld, etc.

While this can be even expected for gcc, which anyway is almost always 
built out-of-srcdir, it may violate the "principle of least surprise" 
for binutils or gdb.  In that case, --srcdir=. is ok.  That's why I am 
posting to all three lists.

The patch requires some changes in target libraries to be able to find 
the newly-built gcc, but this is not necessary in src packages.

I bootstrapped/regtested GCC (in-srcdir and out-of-srcdir) and 
built/regtested the gdb+binutils src module in-srcdir with this patch.

Ok for gcc and src?

Paolo

[-- Attachment #2: fix-pr17383-2.patch --]
[-- Type: text/plain, Size: 26230 bytes --]

2005-05-25  Paolo Bonzini  <bonzini@gnu.org>

	* Makefile.def (target_modules): Remove "stage", now unnecessary.
	* Makefile.tpl (HOST_SUBDIR): New substitution.
	(STAGE_HOST_EXPORTS, EXPECT, HOST_LIB_PATH, USUAL_AR_FOR_TARGET,
	USUAL_AS_FOR_TARGET, USUAL_DLLTOOL_FOR_TARGET, USUAL_GCC_FOR_TARGET,
	USUAL_LD_FOR_TARGET, USUAL_NM_FOR_TARGET, USUAL_OBJDUMP_FOR_TARGET,
	USUAL_RANLIB_FOR_TARGET, USUAL_WINDRES_FOR_TARGET): Use it.
	(Host modules, Bootstrapped modules): Use it, always configure
	out-of-srcdir.
	(Build modules, Target modules): Do not create symlink trees,
	always configure out-of-srcdir.
	* configure.in (FLAGS_FOR_TARGET, CC_FOR_TARGET, GCJ_FOR_TARGET,
	GFORTRAN_FOR_TARGET, CXX_FOR_TARGET, RAW_CXX_FOR_TARGET): Use
	$(HOST_SUBDIR).

	* Makefile.in: Regenerate.
	* configure: Regenerate.

config:
2005-05-25  Paolo Bonzini  <bonzini@gnu.org>

	* config/acx.m4 (GCC_TOPLEV_SUBDIRS): Set HOST_SUBDIR if an in-src
	build is going.

gcc:
2005-05-25  Paolo Bonzini  <bonzini@gnu.org>

	* gcc/Makefile.in (host_subdir): New.
	(build_objdir): New.  Replace ../$(build_subdir) with it throughout.
	* gcc/configure: Regenerate.

libjava:
2005-05-25  Paolo Bonzini  <bonzini@gnu.org>

	* configure.ac: Call GCC_TOPLEV_SUBDIRS.
	(COMPPATH): Removed.
	(ZIP, GCJH): Replace it with ../$(host_subdir).
	(built_gcc_dir): Add $(host_subdir).
	* configure: Regenerate.
	* Makefile.in, include/Makefile.in, testsuite/Makefile.in,
	external/Makefile.in, external/sax/Makefile.in,
	external/w3c_dom/Makefile.in: Regenerate.

libobjc:
2005-05-25  Paolo Bonzini  <bonzini@gnu.org>

	* configure.ac: Call GCC_TOPLEV_SUBDIRS.
	(Determine CFLAGS for gthread): Use $host_subdir.
	* configure: Regenerate.
	* Makefile.in (host_subdir): New.
	(INCLUDES): Use it.

Index: Makefile.def
===================================================================
RCS file: /cvs/gcc/gcc/Makefile.def,v
retrieving revision 1.46
diff -u -r1.46 Makefile.def
--- Makefile.def	17 Jan 2005 23:50:25 -0000	1.46
+++ Makefile.def	25 Feb 2005 13:39:29 -0000
@@ -117,7 +117,7 @@
 target_modules = { module= newlib; };
 target_modules = { module= libgfortran; };
 target_modules = { module= libobjc; };
-target_modules = { module= libtermcap; no_check=true; stage=true;
+target_modules = { module= libtermcap; no_check=true;
                    missing=mostlyclean;
                    missing=clean;
                    missing=distclean;
@@ -129,7 +129,7 @@
 target_modules = { module= examples; no_check=true; no_install=true; };
 target_modules = { module= libffi; };
 target_modules = { module= libjava; raw_cxx=true; };
-target_modules = { module= zlib; stage=true; };
+target_modules = { module= zlib; };
 target_modules = { module= boehm-gc; };
 target_modules = { module= qthreads; };
 target_modules = { module= rda; };
Index: Makefile.tpl
===================================================================
RCS file: /cvs/gcc/gcc/Makefile.tpl,v
retrieving revision 1.124
diff -u -r1.124 Makefile.tpl
--- Makefile.tpl	17 Jan 2005 23:50:27 -0000	1.124
+++ Makefile.tpl	25 Feb 2005 13:39:30 -0000
@@ -152,6 +152,9 @@
 # This is set by the configure script to the arguments to use when configuring
 # directories built for the host system.
 HOST_CONFIGARGS = @host_configargs@
+# Host programs are put under this directory, which is . except if building
+# with srcdir=..
+HOST_SUBDIR = @host_subdir@
 # This is the list of variables to export in the environment when
 # configuring subdirectories for the host system.
 HOST_EXPORTS = \
@@ -181,8 +184,12 @@
 # Similar, for later GCC stages.
 STAGE_HOST_EXPORTS = \
 	$(HOST_EXPORTS) \
-	CC="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/"; export CC; \
-	CC_FOR_BUILD="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/"; export CC_FOR_BUILD;
+	CC="$(STAGE_CC_WRAPPER) $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
+	  -B$$r/$(HOST_SUBDIR)/prev-gcc/ -B$(build_tooldir)/bin/"; export CC; \
+	CC_FOR_BUILD="$(STAGE_CC_WRAPPER) \
+	  $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
+	  -B$$r/$(HOST_SUBDIR)/prev-gcc/ \
+	  -B$(build_tooldir)/bin/"; export CC_FOR_BUILD;
 
 # This is set by the configure script to the list of directories which
 # should be built using the target tools.
@@ -305,8 +312,9 @@
 # (Default to avoid splitting info files by setting the threshold high.)
 MAKEINFOFLAGS = --split-size=5000000
 
-EXPECT = `if [ -f $$r/expect/expect ] ; \
-	then echo $$r/expect/expect ; \
+# FIXME: expect may become a build tool?
+EXPECT = `if [ -f $$r/$(HOST_SUBDIR)/expect/expect ] ; \
+	then echo $$r/$(HOST_SUBDIR)/expect/expect ; \
 	else echo expect ; fi`
 
 RUNTEST = `if [ -f $$s/dejagnu/runtest ] ; \
@@ -319,7 +327,7 @@
 
 # This is the list of directories that may be needed in RPATH_ENVVAR
 # so that programs built for the host machine work.
-HOST_LIB_PATH = $$r/bfd:$$r/opcodes
+HOST_LIB_PATH = $$r/$(HOST_SUBDIR)/bfd:$$r/$(HOST_SUBDIR)/opcodes
 
 AS = @AS@
 
@@ -360,8 +368,8 @@
 AR_FOR_TARGET=@AR_FOR_TARGET@
 CONFIGURED_AR_FOR_TARGET=@CONFIGURED_AR_FOR_TARGET@
 USUAL_AR_FOR_TARGET = ` \
-  if [ -f $$r/binutils/ar ] ; then \
-    echo $$r/binutils/ar ; \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/ar ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/ar ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
       echo $(AR); \
@@ -373,9 +381,9 @@
 AS_FOR_TARGET=@AS_FOR_TARGET@
 CONFIGURED_AS_FOR_TARGET=@CONFIGURED_AS_FOR_TARGET@
 USUAL_AS_FOR_TARGET = ` \
-  if [ -f $$r/gas/as-new ] ; then \
-    echo $$r/gas/as-new ; \
-  elif [ -f $$r/gcc/xgcc ]; then \
+  if [ -f $$r/$(HOST_SUBDIR)/gas/as-new ] ; then \
+    echo $$r/$(HOST_SUBDIR)/gas/as-new ; \
+  elif [ -f $$r/$(HOST_SUBDIR)/gcc/xgcc ]; then \
     $(CC_FOR_TARGET) -print-prog-name=as ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
@@ -396,7 +404,8 @@
 # build libgcc2.a.  We define it here so that it can itself be
 # overridden on the command line.
 GCC_FOR_TARGET=@GCC_FOR_TARGET@
-USUAL_GCC_FOR_TARGET = $(STAGE_CC_WRAPPER) $$r/gcc/xgcc -B$$r/gcc/ $(FLAGS_FOR_TARGET)
+USUAL_GCC_FOR_TARGET = $(STAGE_CC_WRAPPER) \
+  $$r/$(HOST_SUBDIR)/gcc/xgcc -B$$r/$(HOST_SUBDIR)/gcc/ $(FLAGS_FOR_TARGET)
 LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET)
 
 CXX_FOR_TARGET = @CXX_FOR_TARGET@
@@ -409,8 +418,8 @@
 DLLTOOL_FOR_TARGET=@DLLTOOL_FOR_TARGET@
 CONFIGURED_DLLTOOL_FOR_TARGET=@CONFIGURED_DLLTOOL_FOR_TARGET@
 USUAL_DLLTOOL_FOR_TARGET = ` \
-  if [ -f $$r/binutils/dlltool ] ; then \
-    echo $$r/binutils/dlltool ; \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/dlltool ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/dlltool ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
       echo $(DLLTOOL); \
@@ -425,9 +434,9 @@
 LD_FOR_TARGET=@LD_FOR_TARGET@
 CONFIGURED_LD_FOR_TARGET=@CONFIGURED_LD_FOR_TARGET@
 USUAL_LD_FOR_TARGET = ` \
-  if [ -f $$r/ld/ld-new ] ; then \
-    echo $$r/ld/ld-new ; \
-  elif [ -f $$r/gcc/xgcc ]; then \
+  if [ -f $$r/$(HOST_SUBDIR)/ld/ld-new ] ; then \
+    echo $$r/$(HOST_SUBDIR)/ld/ld-new ; \
+  elif [ -f $$r/$(HOST_SUBDIR)/gcc/xgcc ]; then \
     $(CC_FOR_TARGET) -print-prog-name=ld ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
@@ -442,9 +451,9 @@
 NM_FOR_TARGET=@NM_FOR_TARGET@
 CONFIGURED_NM_FOR_TARGET=@CONFIGURED_NM_FOR_TARGET@
 USUAL_NM_FOR_TARGET = ` \
-  if [ -f $$r/binutils/nm-new ] ; then \
-    echo $$r/binutils/nm-new ; \
-  elif [ -f $$r/gcc/xgcc ]; then \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/nm-new ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/nm-new ; \
+  elif [ -f $$r/$(HOST_SUBDIR)/gcc/xgcc ]; then \
     $(CC_FOR_TARGET) -print-prog-name=nm ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
@@ -457,8 +466,8 @@
 RANLIB_FOR_TARGET=@RANLIB_FOR_TARGET@
 CONFIGURED_RANLIB_FOR_TARGET=@CONFIGURED_RANLIB_FOR_TARGET@
 USUAL_RANLIB_FOR_TARGET = ` \
-  if [ -f $$r/binutils/ranlib ] ; then \
-    echo $$r/binutils/ranlib ; \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/ranlib ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/ranlib ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
       if [ x'$(RANLIB)' != x ]; then \
@@ -474,8 +483,8 @@
 WINDRES_FOR_TARGET=@WINDRES_FOR_TARGET@
 CONFIGURED_WINDRES_FOR_TARGET=@CONFIGURED_WINDRES_FOR_TARGET@
 USUAL_WINDRES_FOR_TARGET = ` \
-  if [ -f $$r/binutils/windres ] ; then \
-    echo $$r/binutils/windres ; \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/windres ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/windres ; \
   else \
     if [ '$(host)' = '$(target)' ] ; then \
       echo $(WINDRES); \
@@ -822,38 +831,11 @@
 	echo Configuring in $(BUILD_SUBDIR)/[+module+]; \
 	cd "$(BUILD_SUBDIR)/[+module+]" || exit 1; \
 	case $(srcdir) in \
-	  /* | [A-Za-z]:[\\/]*) \
-	    topdir=$(srcdir) ;; \
-	  *) \
-	    case "$(BUILD_SUBDIR)" in \
-	      .) topdir="../$(srcdir)" ;; \
-	      *) topdir="../../$(srcdir)" ;; \
-	    esac ;; \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir="../../$(srcdir)" ;; \
 	esac; \
-	if [ "$(srcdir)" = "." ] ; then \
-	  if [ "$(BUILD_SUBDIR)" != "." ] ; then \
-	    if $(SHELL) $$s/symlink-tree $${topdir}/[+module+] "no-such-file" ; then \
-	      if [ -f Makefile ]; then \
-	        if $(MAKE) distclean; then \
-	          true; \
-	        else \
-	          exit 1; \
-	        fi; \
-	      else \
-	        true; \
-	      fi; \
-	    else \
-	      exit 1; \
-	    fi; \
-	  else \
-	    true; \
-	  fi; \
-	  srcdiroption="--srcdir=."; \
-	  libsrcdir="."; \
-	else \
-	  srcdiroption="--srcdir=$${topdir}/[+module+]"; \
-	  libsrcdir="$$s/[+module+]"; \
-	fi; \
+	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
+	libsrcdir="$$s/[+module+]"; \
 	rm -f no-such-file || : ; \
 	CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \
 	  $(BUILD_CONFIGARGS) $${srcdiroption} \
@@ -885,24 +867,20 @@
 maybe-configure-[+module+]: configure-[+module+]
 configure-[+module+]:
 	@[+ IF bootstrap +]test -f stage_last && exit 0; \
-	[+ ENDIF bootstrap +]test ! -f [+module+]/Makefile || exit 0; \
-	[ -d [+module+] ] || mkdir [+module+]; \
+	[+ ENDIF bootstrap +]test ! -f $(HOST_SUBDIR)/[+module+]/Makefile || exit 0; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/[+module+] ; \
 	r=`${PWD_COMMAND}`; export r; \
 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
 	$(HOST_EXPORTS) \
 	echo Configuring in [+module+]; \
-	cd [+module+] || exit 1; \
+	cd $(HOST_SUBDIR)/[+module+] || exit 1; \
 	case $(srcdir) in \
-	  \.) \
-	    srcdiroption="--srcdir=."; \
-	    libsrcdir=".";; \
-	  /* | [A-Za-z]:[\\/]*) \
-	    srcdiroption="--srcdir=$(srcdir)/[+module+]"; \
-	    libsrcdir="$$s/[+module+]";; \
-	  *) \
-	    srcdiroption="--srcdir=../$(srcdir)/[+module+]"; \
-	    libsrcdir="$$s/[+module+]";; \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  \.) topdir="../.." ;; \
+	  *) topdir="../$(srcdir)" ;; \
 	esac; \
+	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
+	libsrcdir="$$s/[+module+]"; \
 	$(SHELL) $${libsrcdir}/configure \
 	  $(HOST_CONFIGARGS) $${srcdiroption} [+extra_configure_flags+] \
 	  || exit 1
@@ -919,8 +897,8 @@
 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
 	$(SET_LIB_PATH) \
 	$(HOST_EXPORTS) \
-	(cd [+module+] && $(MAKE) $(FLAGS_TO_PASS) [+extra_make_flags+] \
-	  $(TARGET-[+module+]))
+	(cd $(HOST_SUBDIR)/[+module+] && \
+	  $(MAKE) $(FLAGS_TO_PASS) [+extra_make_flags+] $(TARGET-[+module+]))
 @endif [+module+]
 
 .PHONY: check-[+module+] maybe-check-[+module+]
@@ -937,8 +915,8 @@
 	  s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
 	  $(SET_LIB_PATH) \
 	  $(HOST_EXPORTS) \
-	  (cd [+module+] && $(MAKE) $(FLAGS_TO_PASS) [+ 
-	    extra_make_flags+] check); \
+	  (cd $(HOST_SUBDIR)/[+module+] && \
+	    $(MAKE) $(FLAGS_TO_PASS) [+extra_make_flags+] check)
 	fi
 [+ ELSE check +]
 check-[+module+]:
@@ -946,8 +924,8 @@
 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
 	$(SET_LIB_PATH) \
 	$(HOST_EXPORTS) \
-	(cd [+module+] && $(MAKE) $(FLAGS_TO_PASS)[+ 
-	  extra_make_flags+] check)
+	(cd $(HOST_SUBDIR)/[+module+] && \
+	  $(MAKE) $(FLAGS_TO_PASS) [+extra_make_flags+] check)
 [+ ENDIF no_check +]
 @endif [+module+]
 
@@ -963,8 +941,8 @@
 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
 	$(SET_LIB_PATH) \
 	$(HOST_EXPORTS) \
-	(cd [+module+] && $(MAKE) $(FLAGS_TO_PASS)[+ 
-	  extra_make_flags+] install)
+	(cd $(HOST_SUBDIR)/[+module+] && \
+	  $(MAKE) $(FLAGS_TO_PASS) [+extra_make_flags+] check)
 [+ ENDIF no_install +]
 @endif [+module+]
 
@@ -991,7 +969,7 @@
 	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
 	done; \
 	echo "Doing [+make_target+] in [+module+]" ; \
-	(cd [+module+] && \
+	(cd $(HOST_SUBDIR)/[+module+] && \
 	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
 	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
 	          "RANLIB=$${RANLIB}" \
@@ -1032,38 +1010,11 @@
 	echo Configuring in $(TARGET_SUBDIR)/[+module+]; \
 	cd "$(TARGET_SUBDIR)/[+module+]" || exit 1; \
 	case $(srcdir) in \
-	  /* | [A-Za-z]:[\\/]*) \
-	    topdir=$(srcdir) ;; \
-	  *) \
-	    case "$(TARGET_SUBDIR)" in \
-	      .) topdir="../$(srcdir)" ;; \
-	      *) topdir="../../$(srcdir)" ;; \
-	    esac ;; \
-	esac; \[+ IF stage +]
-	if [ "$(srcdir)" = "." ] ; then \
-	  if [ "$(TARGET_SUBDIR)" != "." ] ; then \
-	    if $(SHELL) $$s/symlink-tree $${topdir}/[+module+] "no-such-file" ; then \
-	      if [ -f Makefile ]; then \
-	        if $(MAKE) distclean; then \
-	          true; \
-	        else \
-	          exit 1; \
-	        fi; \
-	      else \
-	        true; \
-	      fi; \
-	    else \
-	      exit 1; \
-	    fi; \
-	  else \
-	    true; \
-	  fi; \
-	  srcdiroption="--srcdir=."; \
-	  libsrcdir="."; \
-	else \[+ ENDIF stage +]
-	  srcdiroption="--srcdir=$${topdir}/[+module+]"; \
-	  libsrcdir="$$s/[+module+]"; \[+ IF stage +]
-	fi; \[+ ENDIF stage +]
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir="../../$(srcdir)" ;; \
+	esac; \
+	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
+	libsrcdir="$$s/[+module+]"; \
 	rm -f no-such-file || : ; \
 	CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \
 	  $(TARGET_CONFIGARGS) $${srcdiroption} \
@@ -1378,18 +1329,25 @@
 stage[+id+]-start::
 	@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
 	echo stage[+id+] > stage_current ; \
-	echo stage[+id+] > stage_last[+ FOR host_modules +][+ IF bootstrap +]
+	echo stage[+id+] > stage_last; \
+	$(mkinstalldirs) $(HOST_SUBDIR)[+
+   FOR host_modules +][+ IF bootstrap +]
 @if [+ module +]
-	@[ -d stage[+id+]-[+module+] ] || mkdir stage[+id+]-[+module+]; \
-	set stage[+id+]-[+module+] [+module+] ; @CREATE_LINK_TO_DIR@ [+ IF prev +] ; \
-	set stage[+prev+]-[+module+] prev-[+module+] ; @CREATE_LINK_TO_DIR@ [+ ENDIF prev +]
+	@cd $(HOST_SUBDIR); [ -d stage[+id+]-[+module+] ] || \
+	  mkdir stage[+id+]-[+module+]; \
+	set stage[+id+]-[+module+] [+module+] ; \
+	@CREATE_LINK_TO_DIR@ [+ IF prev +] ; \
+	set stage[+prev+]-[+module+] prev-[+module+] ; \
+	@CREATE_LINK_TO_DIR@ [+ ENDIF prev +]
 @endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
 
 stage[+id+]-end::
 	@rm -f stage_current[+ FOR host_modules +][+ IF bootstrap +]
 @if [+ module +]
-	@set [+module+] stage[+id+]-[+module+] ; @UNDO_LINK_TO_DIR@ [+ IF prev +] ; \
-	set prev-[+module+] stage[+prev+]-[+module+] ; @UNDO_LINK_TO_DIR@ [+ ENDIF prev +]
+	@cd $(HOST_SUBDIR); set [+module+] stage[+id+]-[+module+] ; \
+	@UNDO_LINK_TO_DIR@ [+ IF prev +] ; \
+	set prev-[+module+] stage[+prev+]-[+module+] ; \
+	@UNDO_LINK_TO_DIR@ [+ ENDIF prev +]
 @endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
 
 # Bubble a bugfix through all the stages up to stage [+id+].  They
@@ -1434,18 +1392,14 @@
 	$(STAGE_HOST_EXPORTS) [+ ELSE prev +] \
 	$(HOST_EXPORTS) [+ ENDIF prev +] \
 	echo Configuring stage [+id+] in [+module+] ; \
-	cd [+module+] || exit 1; \
+	cd $(HOST_SUBDIR)/[+module+] || exit 1; \
 	case $(srcdir) in \
-	  \.) \
-	    srcdiroption="--srcdir=."; \
-	    libsrcdir=".";; \
-	  /* | [A-Za-z]:[\\/]*) \
-	    srcdiroption="--srcdir=$(srcdir)/[+module+]"; \
-	    libsrcdir="$$s/[+module+]";; \
-	  *) \
-	    srcdiroption="--srcdir=../$(srcdir)/[+module+]"; \
-	    libsrcdir="$$s/[+module+]";; \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  \.) topdir="../.." ;; \
+	  *) topdir="../$(srcdir)" ;; \
 	esac; \
+	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
+	libsrcdir="$$s/[+module+]"; \
 	$(SHELL) $${libsrcdir}/configure \
 	  $(HOST_CONFIGARGS) $${srcdiroption} \
 	  [+stage_configure_flags+] [+extra_configure_flags+]
@@ -1457,7 +1411,7 @@
 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; [+ IF prev +] \
 	$(STAGE_HOST_EXPORTS) [+ ELSE prev +] \
 	$(HOST_EXPORTS) [+ ENDIF prev +] \
-	cd [+module+] && \
+	cd $(HOST_SUBDIR)/[+module+] && \
 	$(MAKE) $(FLAGS_TO_PASS) [+ IF prev +] \
 		$(POSTSTAGE1_FLAGS_TO_PASS) [+ ENDIF prev +] \
 		[+stage_make_flags+] [+extra_make_flags+]
@@ -1467,7 +1421,7 @@
 	@[ -f [+module+]/Makefile ] || [ -f stage[+id+]-[+module+]/Makefile ] \
 	  || exit 0 ; \
 	[ -f [+module+]/Makefile ] || $(MAKE) stage[+id+]-start ; \
-	cd [+module+] && \
+	cd $(HOST_SUBDIR)/[+module+] && \
 	$(MAKE) $(FLAGS_TO_PASS) [+ IF prev +] \
 		$(POSTSTAGE1_FLAGS_TO_PASS) [+ ENDIF prev +] \
 		[+stage_make_flags+] [+extra_make_flags+] clean
Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/configure.in,v
retrieving revision 1.341
diff -u -r1.341 configure.in
--- configure.in	23 Feb 2005 10:12:44 -0000	1.341
+++ configure.in	25 Feb 2005 13:39:31 -0000
@@ -1988,7 +1988,7 @@
        # to it.  This is right: we don't want to search that directory
        # for binaries, but we want the header files in there, so add
        # them explicitly.
-       FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -isystem $$r/gcc/include'
+       FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -isystem $$r/$(HOST_SUBDIR)/gcc/include'
 
        # Someone might think of using the pre-installed headers on
        # Canadian crosses, in case the installed compiler is not fully
@@ -2035,13 +2035,13 @@
 if test "x${use_gnu_ld}" = x &&
    echo " ${configdirs} " | grep " ld " > /dev/null ; then
   # Arrange for us to find uninstalled linker scripts.
-  FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -L$$r/ld'
+  FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -L$$r/$(HOST_SUBDIR)/ld'
 fi
 
 if test "x${CC_FOR_TARGET+set}" = xset; then
   :
 elif test -d ${srcdir}/gcc; then
-  CC_FOR_TARGET='$$r/gcc/xgcc -B$$r/gcc/'
+  CC_FOR_TARGET='$$r/$(HOST_SUBDIR)/gcc/xgcc -B$$r/$(HOST_SUBDIR)/gcc/'
 elif test "$host" = "$target"; then
   CC_FOR_TARGET='$(CC)'
 else
@@ -2052,7 +2052,7 @@
 if test "x${GCJ_FOR_TARGET+set}" = xset; then
   :
 elif test -d ${srcdir}/gcc; then
-  GCJ_FOR_TARGET='$$r/gcc/gcj -B$$r/gcc/'
+  GCJ_FOR_TARGET='$$r/$(HOST_SUBDIR)/gcc/gcj -B$$r/$(HOST_SUBDIR)/gcc/'
 elif test "$host" = "$target"; then
   GCJ_FOR_TARGET='gcj'
 else
@@ -2063,7 +2063,7 @@
 if test "x${GFORTRAN_FOR_TARGET+set}" = xset; then
   :
 elif test -d ${srcdir}/gcc; then
-  GFORTRAN_FOR_TARGET='$$r/gcc/gfortran -B$$r/gcc/'
+  GFORTRAN_FOR_TARGET='$$r/$(HOST_SUBDIR)/gcc/gfortran -B$$r/$(HOST_SUBDIR)/gcc/'
 elif test "$host" = "$target"; then
   GFORTRAN_FOR_TARGET='gfortran'
 else
@@ -2088,8 +2088,8 @@
   # default whereas gcc does not.
   # RAW_CXX_FOR_TARGET is for linking C++ or java; CXX_FOR_TARGET is for
   # all other cases.
-  CXX_FOR_TARGET='$$r/gcc/g++ -B$$r/gcc/ -nostdinc++ '$libstdcxx_flags
-  RAW_CXX_FOR_TARGET='$$r/gcc/xgcc -shared-libgcc -B$$r/gcc/ -nostdinc++ '$raw_libstdcxx_flags
+  CXX_FOR_TARGET='$$r/$(HOST_SUBDIR)/gcc/g++ -B$$r/$(HOST_SUBDIR)/gcc/ -nostdinc++ '$libstdcxx_flags
+  RAW_CXX_FOR_TARGET='$$r/$(HOST_SUBDIR)/gcc/xgcc -shared-libgcc -B$$r/$(HOST_SUBDIR)/gcc/ -nostdinc++ '$raw_libstdcxx_flags
 elif test "$host" = "$target"; then
   CXX_FOR_TARGET='$(CXX)'
   RAW_CXX_FOR_TARGET=${CXX_FOR_TARGET}
Index: config/acx.m4
===================================================================
RCS file: /cvs/gcc/gcc/config/acx.m4,v
retrieving revision 1.10
diff -u -r1.10 acx.m4
--- config/acx.m4	13 Aug 2004 22:31:45 -0000	1.10
+++ config/acx.m4	25 Feb 2005 13:39:31 -0000
@@ -76,8 +76,12 @@
 AC_REQUIRE([_GCC_TOPLEV_NONCANONICAL_BUILD]) []dnl
 # Prefix 'build-' so this never conflicts with target_subdir.
 build_subdir="build-${build_noncanonical}"
-# Not really a subdirectory, but here for completeness.
-host_subdir=.
+# --srcdir=. covers the toplevel, while "test -d" covers the subdirectories
+if test $srcdir = . || test -d $srcdir/../host-${host_noncanonical}; then
+  host_subdir="host-${host_noncanonical}"
+else
+  host_subdir=.
+fi
 # No prefix.
 target_subdir=${target_noncanonical}
 AC_SUBST([build_subdir]) []dnl
Index: gcc/Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Makefile.in,v
retrieving revision 1.1447
diff -u -r1.1447 Makefile.in
--- gcc/Makefile.in	17 Feb 2005 08:47:19 -0000	1.1447
+++ gcc/Makefile.in	25 Feb 2005 13:39:32 -0000
@@ -83,8 +83,15 @@
 # It's normally the absolute path to the current directory.
 objdir = @objdir@
 
+host_subdir=@host_subdir@
 build_subdir=@build_subdir@
 
+ifeq ($(host_subdir),.)
+build_objdir := $(shell cd ../$(build_subdir) && pwd)
+else
+build_objdir := $(shell cd ../../$(build_subdir) && pwd)
+endif
+
 # --------
 # Defined vpaths
 # --------
@@ -757,7 +764,7 @@
 
 # Build and host support libraries.
 LIBIBERTY = ../libiberty/libiberty.a
-BUILD_LIBIBERTY = ../$(build_subdir)/libiberty/libiberty.a
+BUILD_LIBIBERTY = $(build_objdir)/libiberty/libiberty.a
 
 # Dependencies on the intl and portability libraries.
 LIBDEPS= $(CPPLIB) $(LIBIBERTY) $(LIBINTL_DEP) $(LIBICONV_DEP)
@@ -2839,8 +2846,8 @@
 
 # Build fixed copies of system files.
 stmp-fixinc: gsyslimits.h macro_list \
-  ../$(build_subdir)/fixincludes/fixincl \
-  ../$(build_subdir)/fixincludes/fixinc.sh
+  $(build_objdir)/fixincludes/fixincl \
+  $(build_objdir)/fixincludes/fixinc.sh
 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
 	  echo The directory that should contain system headers does not exist: >&2 ; \
 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
@@ -2852,7 +2859,7 @@
 	(TARGET_MACHINE='$(target)'; srcdir=`cd $(srcdir); ${PWD_COMMAND}`; \
 	  SHELL='$(SHELL)'; MACRO_LIST=`${PWD_COMMAND}`/macro_list ; \
 	  export TARGET_MACHINE srcdir SHELL MACRO_LIST && \
-	  cd ../$(build_subdir)/fixincludes && \
+	  cd $(build_objdir)/fixincludes && \
 	  $(SHELL) ./fixinc.sh ../../gcc/include \
 	    $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS) )
 	rm -f include/syslimits.h
Index: libjava/configure.ac
===================================================================
RCS file: /cvs/gcc/gcc/libjava/configure.ac,v
retrieving revision 1.19
diff -u -r1.19 configure.ac
--- libjava/configure.ac	23 Feb 2005 01:05:45 -0000	1.19
+++ libjava/configure.ac	25 Feb 2005 13:39:32 -0000
@@ -5,6 +5,8 @@
 
 AC_CONFIG_SRCDIR(java/lang/System.java)
 
+GCC_TOPLEV_SUBDIRS
+
 # We use these options to decide which functions to include.
 AC_ARG_WITH(target-subdir,
   AS_HELP_STRING([--with-target-subdir=SUBDIR],
@@ -162,13 +164,6 @@
 AM_PROG_CC_C_O
 AC_CONFIG_SUBDIRS(libltdl)
 
-if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
-   COMPPATH=.
-else
-   COMPPATH=..
-fi
-AC_SUBST(COMPPATH)
-
 # The -no-testsuite modules omit the test subdir.
 AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
 
@@ -1039,7 +1034,7 @@
 
 # Which gcj do we use?
 which_gcj=default
-built_gcc_dir="`cd ${builddotdot}/../../gcc && ${PWDCMD-pwd}`"
+built_gcc_dir="`cd ${builddotdot}/../../${host_subdir}/gcc && ${PWDCMD-pwd}`"
 if test -n "${with_cross_host}"; then
   # We are being configured with a cross compiler. We can't
   # use ac_exeext, because that is for the target platform.
@@ -1078,8 +1073,8 @@
 case "${which_gcj}" in
    built)
       GCJ="$built_gcc_dir/gcj -B`${PWDCMD-pwd}`/ -B$built_gcc_dir/"
-      GCJH='$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh'
-      ZIP='$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/fastjar'
+      GCJH='$(MULTIBUILDTOP)../../$(host_subdir)/gcc/gcjh'
+      ZIP='$(MULTIBUILDTOP)../../$(host_subdir)/fastjar/fastjar'
    ;;
    cross)
       if test "x${with_newlib}" = "xyes"; then
Index: libobjc/configure.ac
===================================================================
RCS file: /cvs/gcc/gcc/libobjc/configure.ac,v
retrieving revision 1.12
diff -u -r1.12 configure.ac
--- libobjc/configure.ac	2 Dec 2004 11:05:06 -0000	1.12
+++ libobjc/configure.ac	25 Feb 2005 13:39:33 -0000
@@ -23,6 +23,7 @@
 AC_PREREQ(2.59)
 AC_INIT(package-unused, version-unused,, libobjc)
 AC_CONFIG_SRCDIR([objc/objc.h])
+GCC_TOPLEV_SUBDIRS
 
 # We need the following definitions because AC_PROG_LIBTOOL relies on them
 PACKAGE=libobjc
@@ -218,12 +219,12 @@
 # -----------
 
 # Determine CFLAGS for gthread.
-# FIXME: the current implementation is dependent on the 'r' variable
-# passed down from the top level
 AC_CACHE_CHECK([for gthread cflags],objc_cv_gthread_flags,
-[if test -f "$r"/gcc/Makefile
+[# we know we are compiled as a target library, so the toplevel build directory
+# is ../..
+if test -f ../../$host_subdir/gcc/Makefile
 then
-  objc_cv_gthread_flags=`grep \^GTHREAD_FLAGS "$r"/gcc/Makefile | awk -F= '{ print $2 }'`
+  objc_cv_gthread_flags=`grep \^GTHREAD_FLAGS ../../$host_subdir/gcc/Makefile | awk -F= '{ print $2 }'`
 else
   AC_MSG_ERROR([not found])
 fi])
Index: libobjc/Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libobjc/Makefile.in,v
retrieving revision 1.44
diff -u -r1.44 Makefile.in
--- libobjc/Makefile.in	20 Oct 2004 01:26:37 -0000	1.44
+++ libobjc/Makefile.in	25 Feb 2005 13:52:22 -0000
@@ -34,6 +34,7 @@
 exec_prefix = @exec_prefix@
 target_noncanonical = @target_noncanonical@
 gcc_version = @gcc_version@
+host_subdir = @host_subdir@
 top_srcdir = @top_srcdir@
 toplevel_srcdir = @toplevel_srcdir@
 toolexecdir = @toolexecdir@
@@ -90,7 +91,8 @@
 #LIBTOOL_UNINSTALL = $(LIBTOOL) --mode=uninstall
 
 INCLUDES = -I$(srcdir)/objc  -I$(srcdir)/$(MULTISRCTOP)../gcc \
-  -I$(srcdir)/$(MULTISRCTOP)../gcc/config -I$(MULTIBUILDTOP)../../gcc \
+  -I$(srcdir)/$(MULTISRCTOP)../gcc/config \
+  -I$(MULTIBUILDTOP)../../$(host_subdir)/gcc \
   -I$(srcdir)/$(MULTISRCTOP)../include
 
 OBJC_GCFLAGS=-DOBJC_WITH_GC=1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-25 20:49 [PATCH] Fix in-srcdir build of gcc Paolo Bonzini
@ 2005-02-25 22:11 ` Daniel Jacobowitz
  2005-02-26  0:54   ` Paolo Bonzini
  2005-02-25 23:02 ` Joseph S. Myers
  2005-02-26  3:06 ` DJ Delorie
  2 siblings, 1 reply; 7+ messages in thread
From: Daniel Jacobowitz @ 2005-02-25 22:11 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: binutils, gdb-patches, gcc-patches

On Fri, Feb 25, 2005 at 04:51:46PM +0100, Paolo Bonzini wrote:
> This patch is a "definitive" solution to the problem of building gcc 
> in-srcdir.  It builds host modules out of srcdir always, so that they do 
> not conflict with the configuration of build or target modules.  For an 
> out-of-srcdir build, this does not change anything, but when --srcdir=. 
> gcc will be configured to for example host-i686-pc-linux-gnu/gcc, ld 
> will be configured to for example host-i686-pc-linux-gnu/ld, etc.
> 
> While this can be even expected for gcc, which anyway is almost always 
> built out-of-srcdir, it may violate the "principle of least surprise" 
> for binutils or gdb.  In that case, --srcdir=. is ok.  That's why I am 
> posting to all three lists.
> 
> The patch requires some changes in target libraries to be able to find 
> the newly-built gcc, but this is not necessary in src packages.

Did you try newlib or winsup?


-- 
Daniel Jacobowitz
CodeSourcery, LLC

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-25 20:49 [PATCH] Fix in-srcdir build of gcc Paolo Bonzini
  2005-02-25 22:11 ` Daniel Jacobowitz
@ 2005-02-25 23:02 ` Joseph S. Myers
  2005-02-26  3:06 ` DJ Delorie
  2 siblings, 0 replies; 7+ messages in thread
From: Joseph S. Myers @ 2005-02-25 23:02 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: binutils, gdb-patches, gcc-patches

On Fri, 25 Feb 2005, Paolo Bonzini wrote:

> This patch is a "definitive" solution to the problem of building gcc
> in-srcdir.  It builds host modules out of srcdir always, so that they do not
> conflict with the configuration of build or target modules.  For an
> out-of-srcdir build, this does not change anything, but when --srcdir=. gcc
> will be configured to for example host-i686-pc-linux-gnu/gcc, ld will be
> configured to for example host-i686-pc-linux-gnu/ld, etc.

Your ChangeLogs should mention GCC bug 17383.

-- 
Joseph S. Myers               http://www.srcf.ucam.org/~jsm28/gcc/
    jsm@polyomino.org.uk (personal mail)
    joseph@codesourcery.com (CodeSourcery mail)
    jsm28@gcc.gnu.org (Bugzilla assignments and CCs)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-25 22:11 ` Daniel Jacobowitz
@ 2005-02-26  0:54   ` Paolo Bonzini
  0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2005-02-26  0:54 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: binutils, gdb-patches, gcc-patches

>>The patch requires some changes in target libraries to be able to find 
>>the newly-built gcc, but this is not necessary in src packages.
> 
> Did you try newlib or winsup?

Cursorily.  All I did is checking that they never mention .. in 
configure.in.

Paolo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-25 20:49 [PATCH] Fix in-srcdir build of gcc Paolo Bonzini
  2005-02-25 22:11 ` Daniel Jacobowitz
  2005-02-25 23:02 ` Joseph S. Myers
@ 2005-02-26  3:06 ` DJ Delorie
  2005-02-27  3:12   ` Paolo Bonzini
  2 siblings, 1 reply; 7+ messages in thread
From: DJ Delorie @ 2005-02-26  3:06 UTC (permalink / raw)
  To: paolo.bonzini; +Cc: binutils, gdb-patches, gcc-patches


> While this can be even expected for gcc, which anyway is almost always 
> built out-of-srcdir, it may violate the "principle of least surprise" 
> for binutils or gdb.

As I am a proponent of "principle of least surprise" (and have been
keeping build-in-srcdir mostly working, with little reward) I'm going
to refrain from commenting.  I'll leave it up to the other build
maintainers to decide on this one.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-26  3:06 ` DJ Delorie
@ 2005-02-27  3:12   ` Paolo Bonzini
  2005-02-27  4:22     ` Paolo Bonzini
  0 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2005-02-27  3:12 UTC (permalink / raw)
  To: DJ Delorie, binutils, gdb-patches, GCC Patches

> As I am a proponent of "principle of least surprise"

I am too.  Unfortunately this patch on one hand makes ./configure work 
for gcc, on the other hand it makes it more "surprising" for 
binutils/gdb.  I am especially concerned about gdb, because of the two 
it is the one that is most likely to be built by casual users doing 
"./configure && make".

In-srcdir toplevel bootstrap definitely won't work without a patch such 
as this, because it wants to symlink or rename directories (e.g. 
stage2-gcc is linked to gcc, and stage1-gcc is linked to prev-gcc).  But 
maybe for the non-bootstrap case (and for gcc), it is enough on systems 
that support symlinks to symlink the current directory to the host 
directory.  This would be better for the "principle of least surprise".

(Another remark on the changes to target libraries: newlib and winsup 
are not affected because they do not special host tools, like fastjar 
for libjava, and neither do they need to access tm.h in the gcc 
directory, like libobjc).

Paolo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Fix in-srcdir build of gcc
  2005-02-27  3:12   ` Paolo Bonzini
@ 2005-02-27  4:22     ` Paolo Bonzini
  0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2005-02-27  4:22 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: DJ Delorie, binutils, gdb-patches, GCC Patches

> I am too.  Unfortunately this patch on one hand makes ./configure work 
> for gcc, on the other hand it makes it more "surprising" for 
> binutils/gdb.  I am especially concerned about gdb, because of the two 
> it is the one that is most likely to be built by casual users doing 
> "./configure && make".

The symbolic link confuses the fixincludes makefile.

What about making the patch create an host-subdir only when gcc is present?

Paolo

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2005-02-26  9:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-02-25 20:49 [PATCH] Fix in-srcdir build of gcc Paolo Bonzini
2005-02-25 22:11 ` Daniel Jacobowitz
2005-02-26  0:54   ` Paolo Bonzini
2005-02-25 23:02 ` Joseph S. Myers
2005-02-26  3:06 ` DJ Delorie
2005-02-27  3:12   ` Paolo Bonzini
2005-02-27  4:22     ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).