Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2001 13:29:32 -0700
From:      Mark Peek <mark@whistle.com>
To:        Dag-Erling Smorgrav <des@ofug.org>, Warner Losh <imp@harmony.village.org>
Cc:        current@FreeBSD.ORG
Subject:   Re: Cross building FYI
Message-ID:  <p05100317b770dbc6dcd4@[207.76.207.129]>
In-Reply-To: <xzpr8vqoqb4.fsf@flood.ping.uio.no>
References:  <200107082141.f68LfVJ13849@harmony.village.org> <xzpr8vqoqb4.fsf@flood.ping.uio.no>

next in thread | previous in thread | raw e-mail | index | archive | help
At 3:15 AM +0200 7/9/01, Dag-Erling Smorgrav wrote:
>Warner Losh <imp@harmony.village.org> writes:
>>  cc: ../../libbfd/libbfd.a: No such file or directory
>>  cc: ../../libiberty/libiberty.a: No such file or directory
>>  cc: ../../libopcodes/libopcodes.a: No such file or directory
>>  *** Error code 1
>
>Funny, mine got past that and didn't die until much later.


Below are patches which allowed me to run an alpha cross build 
through to completion using:

   make -DNOPERL MACHINE_ARCH=alpha MAKEOBJDIRPREFIX=/usr/aobj buildworld

and a normal build using

   make -DNOPERL MAKEOBJDIRPREFIX=/usr/iobj buildworld

(Note: at this time I decided not to see whether PERL would DTRT in a 
cross environment.)

Here's a quick summary of the build stages to make my explanation a 
little clearer. For a cross build:

    HOST == BUILD_ARCH == the system you're doing the build on
    TARGET == MACHINE_ARCH == the architecture you're wanting to build

stage 1: build bootstrap tools (HOST format, HOST object directory)
	- Builds build tools which are required to come from the new
	  source code tree.

stage 2: build tools (HOST format, TARGET object directory)
	- Builds build tools which are required to run on the host machine
	  in the context of the TARGET build (stage 4). We must
	  compile them with the host compiler and not the cross compiler.

stage 3: cross tools (HOST format, HOST object directory)
	- Builds the cross compiler to run on the HOST machine and generate
	  TARGET machine code.

stage 4: build everything (TARGET format, TARGET object directory)
	- Builds the TARGET libraries and binaries using the cross compilation
	  tools from stage 3 and the build tools from stage 2.

The changes I made are:

1. Make the build-tools with the build architecture, not the target.

2. Make the object directories intended for building stage 4

Directories were bring created in the object directory based on the 
build architecture and not the target architecture. This caused 
problems building during stage 4 (for an example, look at 
lib/Makefile in how it builds the csu library). An assumption with 
this fix is that the build tools object directories will be properly 
made during this pass. (Note: the cross build probably wouldn't work 
if this assumption wasn't made).

3. Move the compiler tools from the build tools stage to the cross 
compilation stage

The problem with cc_tools is it creates includes and binaries in 
stage 2 in the TARGET object directory but the includes are for the 
HOST system and not the TARGET system. When building stage 4, the 
binaries from stage 2 are run to create the insn-* files but the 
includes are not regenerated. This breaks the build since there is 
now a mixture of HOST and TARGET related data in the same directory. 
Note: even if the include files were regenerated, there is still 
Makefile dependencies which will cause the gen* binaries to be 
regenerated as well. To fix this, I build the tools during stage 3 in 
the HOST directories, put the HOST directory into the PATH and run 
the HOST versions when running stage 4. This keeps the 2 sets of 
files separate.

4. Fix the fortran build tool similar to #3 above


It would be nice if someone could reproduce my results and review the patches.

Mark

--------------------

Index: Makefile.inc1
===================================================================
RCS file: /cvs/freebsd/src/Makefile.inc1,v
retrieving revision 1.205
diff -u -r1.205 Makefile.inc1
--- Makefile.inc1	2001/06/14 01:35:22	1.205
+++ Makefile.inc1	2001/07/10 19:36:13
@@ -130,7 +130,7 @@
  WORLDTMP=	${OBJTREE}${.CURDIR}/${BUILD_ARCH}
  # /usr/games added for fortune which depend on strfile
  STRICTTMPPATH=	${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games
-TMPPATH=	${STRICTTMPPATH}:${PATH}
+TMPPATH= 
	${STRICTTMPPATH}:${WORLDTMP}${.CURDIR}/gnu/usr.bin/cc/cc_tools:${WORLDTMP}${.CURDIR}/gnu/usr.bin/cc/f771:${PATH}
  OBJFORMAT_PATH?=	/usr/libexec

  TMPDIR?=	/tmp
@@ -185,13 +185,14 @@
  # build-tool stage
  TMAKEENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
  		INSTALL="sh ${.CURDIR}/tools/install.sh" \
+		MACHINE_ARCH=${BUILD_ARCH} \
  		PATH=${TMPPATH}
  TMAKE=		${TMAKEENV} ${MAKE} -f Makefile.inc1

  # cross-tool stage
  XMAKEENV=	${BOOTSTRAPENV} \
  		TARGET_ARCH=${MACHINE_ARCH}
-XMAKE=		${XMAKEENV} ${MAKE} -f Makefile.inc1 -DNO_FORTRAN -DNO_GDB \
+XMAKE=		${XMAKEENV} ${MAKE} -f Makefile.inc1 -DNO_GDB \
  			-DNOHTML -DNOINFO -DNOMAN -DNOPIC -DNOPROFILE \
  			-DNOSHARED

@@ -272,12 +273,15 @@
  	@echo ">>> stage 2: cleaning up the object tree"
  	@echo "--------------------------------------------------------------"
  	cd ${.CURDIR}; ${TMAKE} ${CLEANDIR:S/^/par-/}
+.if ${MACHINE_ARCH} != ${BUILD_ARCH}
+	cd ${.CURDIR}; ${XMAKE} ${CLEANDIR:S/^/par-/}
+.endif
  .endif
  	@echo
  	@echo "--------------------------------------------------------------"
  	@echo ">>> stage 2: rebuilding the object tree"
  	@echo "--------------------------------------------------------------"
-	cd ${.CURDIR}; ${TMAKE} par-obj
+	cd ${.CURDIR}; ${WMAKE} par-obj
  	@echo
  	@echo "--------------------------------------------------------------"
  	@echo ">>> stage 2: build tools"
@@ -584,10 +588,6 @@
  _share=	share/syscons/scrnmaps
  .endif

-.if !defined(NO_FORTRAN)
-_fortran= gnu/usr.bin/cc/f771
-.endif
-
  .if exists(${.CURDIR}/kerberosIV) && exists(${.CURDIR}/crypto) && \
      !defined(NOCRYPT) && defined(MAKE_KERBEROS4)
  _libroken4= kerberosIV/lib/libroken
@@ -599,7 +599,7 @@
  .endif

  build-tools:
-.for _tool in bin/csh bin/sh ${_games} gnu/usr.bin/cc/cc_tools ${_fortran} \
+.for _tool in bin/csh bin/sh ${_games} \
      ${_libroken4} ${_libkrb5} lib/libncurses ${_share} usr.sbin/sysinstall
  	cd ${.CURDIR}/${_tool}; ${MAKE} build-tools
  .endfor
@@ -630,7 +630,14 @@
  _perl=	gnu/usr.bin/perl/libperl gnu/usr.bin/perl/miniperl
  .endif

+.if !defined(NO_FORTRAN)
+_fortran= gnu/usr.bin/cc/f771
+.endif
+
  cross-tools:
+.for _tool in gnu/usr.bin/cc/cc_tools ${_fortran}
+	cd ${.CURDIR}/${_tool}; ${MAKE} obj; ${MAKE} build-tools
+.endfor
  .for _tool in ${_btxld} ${_elf2exe} ${_perl} \
      gnu/usr.bin/binutils usr.bin/objformat gnu/usr.bin/cc
  	cd ${.CURDIR}/${_tool}; \
Index: gnu/usr.bin/cc/cc_tools/Makefile
===================================================================
RCS file: /cvs/freebsd/src/gnu/usr.bin/cc/cc_tools/Makefile,v
retrieving revision 1.51
diff -u -r1.51 Makefile
--- gnu/usr.bin/cc/cc_tools/Makefile	2001/03/02 03:00:41	1.51
+++ gnu/usr.bin/cc/cc_tools/Makefile	2001/07/10 19:36:13
@@ -22,13 +22,13 @@

  .for F in attr codes config flags
  insn-$F.h: gen$F ${MD_FILE}
-	./gen$F ${MD_FILE} > insn-$F.h
+	gen$F ${MD_FILE} > insn-$F.h
  GENSRCS+=	insn-$F.h
  .endfor

  .for F in attrtab emit extract opinit output peep recog
  insn-$F.c: gen$F ${MD_FILE}
-	./gen$F ${MD_FILE} > insn-$F.c
+	gen$F ${MD_FILE} > insn-$F.c
  GENSRCS+=	insn-$F.c
  .endfor

@@ -66,7 +66,7 @@

  .ORDER: genrtl.c genrtl.h
  genrtl.c genrtl.h: gengenrtl
-	./gengenrtl genrtl.h genrtl.c
+	gengenrtl genrtl.h genrtl.c

  GENSRCS+=	genrtl.c genrtl.h

@@ -93,7 +93,7 @@
  # Common parser stuff.

  tree-check.h: gencheck
-	./gencheck > ${.TARGET}
+	gencheck > ${.TARGET}
  GENSRCS+=	tree-check.h

  #-----------------------------------------------------------------------
Index: gnu/usr.bin/cc/f771/Makefile
===================================================================
RCS file: /cvs/freebsd/src/gnu/usr.bin/cc/f771/Makefile,v
retrieving revision 1.6
diff -u -r1.6 Makefile
--- gnu/usr.bin/cc/f771/Makefile	2000/03/15 05:13:53	1.6
+++ gnu/usr.bin/cc/f771/Makefile	2001/07/10 19:36:13
@@ -35,7 +35,7 @@
  .for i in 1t 2t fo io nq op ot
  .ORDER: str-$i.h str-$i.j
  str-$i.j str-$i.h: str-$i.fin fini
-	./fini ${GCCDIR}/f/str-$i.fin str-$i.j str-$i.h
+	fini ${GCCDIR}/f/str-$i.fin str-$i.j str-$i.h

  FINIHDRS+=	str-$i.j str-$i.h
  .endfor

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?p05100317b770dbc6dcd4>