Subject: bin/5371: cross-compiling
To: None <gnats-bugs@gnats.netbsd.org>
From: None <ivanenko@ctpa03.mit.edu>
List: netbsd-bugs
Date: 04/28/1998 11:21:35
>Number:         5371
>Category:       bin
>Synopsis:       cross-compiling 
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Apr 28 08:35:01 1998
>Last-Modified:
>Originator:     
>Organization:
	
	working for myself
>Release:        <NetBSD-current source date> April 21, 1998
>Environment:
	
	Cross-compiling NetBSD/mac68k  from SunOS 4.1.3
System: SunOS 4.1.3 2 sun4c
Architecture: sun4

>Description:
	
Almost all programs can be cross compiled straight from the tree
except few that compile small utility programs that generate
source code file. I found only two instances of such behaviour:
bin/sh and gcc
When those programs are compiled natively, the "utility programs" are built 
natively and run on 'make depend' phase. When cross-compiling, those programs 
must be compiled with *host* compiler and run in the *host* environment.
Therefore, Makefiles must be changed to use host compiler to produce those 
programs. Here is the detailed description of changes:

bin/sh: changed src/bin/sh/Makefile

Three programs are generated on 'make depend': mkinit mknodes mksyntax
from their respective *.c files
the first two programs generate extra source files from other source files
and should work in any environment. The third program is more tricky, it
determins the properties of the chars. This program is an anomaly by itself,
<ctype.h> should be sufficient. I believe all NetBSD ports use ASCII char set 
anyway so the output of this program should be the same on all reasonable host architectures. (it would be nice to check this).

gnu/usr.bin/egcs: changed
	gnu/usr.bin/egcs/Makefile.inc
	gnu/usr.bin/common/Makefile
	gnu/usr.bin/f771/Makefile

The top-level makefile only added one more definition, the changes to 
{common,f77} are similar to the ones above. GCC is a nice cross-compiler
by its own I do not see big problems cross-compiling it in BSD-style 
environment. In "common" subdirectory the bunch of programs are compiled 
and run sequentially and in "f771" subdirectory the program "fini" does 
some preprocessing of the source code. 

NOTE: In the "common" subdirectory the same files are first compiled to run
auxilliary programs and later arer built into libcc1.so Fortunately, 
the extentions are .o for host files and .so for native files and they do 
not mix. 
QUESTION: Does libcc1.so need the files compiled and run 
during "make depend" ? I hesitate to answer to this question without 
native compile.

To fix the problem I added few rules and variables into Makefiles:
HOST_CC, HOST_CFLAGS, HOST_LDFLAGS are already defined in bsd.own.mk
HOST_CPPFLAGS is the same as CPPFLAGS *except* -idirafter flag intoduced by
	setting DESTDIR env. variable. 
	Is (unset DESTDIR; HOST_CPPFLAGS=${CPPFLAGS}) any better?
HOST_LDADD is not used but some host systems may require it

As a final comment, host compiler would better be gcc and I also needed 
-Dlint to stop error messages comping from RCSID lines.

>How-To-Repeat:
	
	make depend
	in the directories mentioned above, see the programs compiled and run
	and think how would they run in cross-compiling environment
>Fix:
	

Apply the following path to the source tree:

*** src/bin/sh/Makefile.orig	Tue Apr 28 09:29:59 1998
--- src/bin/sh/Makefile	Tue Apr 28 10:23:06 1998
***************
*** 19,27 ****
  
  .PATH:	${.CURDIR}/bltin ${.CURDIR}/../../usr.bin/printf
  
! CLEANFILES+= mkinit mknodes mksyntax
! CLEANFILES+= mkinit.o mknodes.o mksyntax.o
  CLEANFILES+= ${GENSRCS} y.tab.h
  
  token.h: mktokens
  	sh ${.ALLSRC}
--- 19,41 ----
  
  .PATH:	${.CURDIR}/bltin ${.CURDIR}/../../usr.bin/printf
  
! HOST_PROGS=mkinit mknodes mksyntax
! HOST_OBJS=mkinit.o mknodes.o mksyntax.o
! HOST_CPPFLAGS+=-DSHELL -I. -I${.CURDIR}
! 
! CLEANFILES+= ${HOST_PROGS}
! CLEANFILES+= ${HOST_OBJS}
  CLEANFILES+= ${GENSRCS} y.tab.h
+ 
+ .for obj in ${HOST_OBJS}
+ ${obj} : ${obj:.o=.c}
+ 	${HOST_CC} ${HOST_CFLAGS} ${HOST_CPPFLAGS} -c ${.IMPSRC} -o ${.TARGET}
+ .endfor
+ 
+ .for prog in ${HOST_PROGS}
+ ${prog} : ${prog}.o
+ 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} ${.ALLSRC} -o ${.TARGET} ${HOST_LDADD}
+ .endfor
  
  token.h: mktokens
  	sh ${.ALLSRC}
*** src/gnu/usr.bin/egcs/Makefile.inc.orig	Thu Apr 16 07:10:27 1998
--- src/gnu/usr.bin/egcs/Makefile.inc	Tue Apr 28 10:20:23 1998
***************
*** 19,25 ****
  	-DMD_EXEC_PREFIX=\"/usr/libexec/\" \
  	-DMD_STARTFILE_PREFIX=\"/usr/lib/\" \
  	-DIN_GCC -DNETBSD_NATIVE
! 
  LDADD+=		-lgnumalloc
  DPADD+=		${LIBGNUMALLOC}
  
--- 19,35 ----
  	-DMD_EXEC_PREFIX=\"/usr/libexec/\" \
  	-DMD_STARTFILE_PREFIX=\"/usr/lib/\" \
  	-DIN_GCC -DNETBSD_NATIVE
! HOST_CPPFLAGS+=-I${.CURDIR} \
! 	-I${COMMON} \
! 	-I${COMMONOBJ} \
! 	-I${.CURDIR}/../arch \
! 	-I${.CURDIR}/../arch/${MACHINE_ARCH} \
! 	-I${DIST} \
! 	-I${DIST}/config \
! 	-I${DIST}/config/${MACHINE_ARCH} \
! 	-DMD_EXEC_PREFIX=\"/usr/libexec/\" \
! 	-DMD_STARTFILE_PREFIX=\"/usr/lib/\" \
! 	-DIN_GCC -DNETBSD_NATIVE
  LDADD+=		-lgnumalloc
  DPADD+=		${LIBGNUMALLOC}
  
*** src/gnu/usr.bin/egcs/common/Makefile.orig	Thu Apr 16 07:10:29 1998
--- src/gnu/usr.bin/egcs/common/Makefile	Tue Apr 28 10:21:53 1998
***************
*** 17,22 ****
--- 17,23 ----
  CPPFLAGS+=	-DTARGET_NAME=\"${target_alias}\"
  
  .PATH:	${DIST}
+ HOST_CPPFLAGS+=-DTARGET_NAME=\"${target_alias}\"
  
  SRCS= \
  	${TARGET_GNU_ARCH}.c alias.c bc-arity.h bc-emit.c bc-opcode.h \
***************
*** 36,164 ****
  	./genattr ${MD} > insn-attr.h
  CLEANFILES += insn-attr.h genattr genattr.o
  
  insn-flags.h: genflags ${MD}
  	./genflags ${MD} > insn-flags.h
  CLEANFILES += insn-flags.h genflags genflags.o
  
  insn-codes.h: gencodes ${MD}
  	./gencodes ${MD} > insn-codes.h
  CLEANFILES += insn-codes.h gencodes gencodes.o
  
  insn-config.h: genconfig ${MD}
  	./genconfig ${MD} > insn-config.h
  CLEANFILES += insn-config.h genconfig genconfig.o
  
  bc-opcode.h: bi-opcode ${BCDEF}
  	./bi-opcode < ${BCDEF} > bc-opcode.h
  CLEANFILES += bc-opcode.h bi-opcode bi-opcode.o
  
  bc-opname.h: bi-opname ${BCDEF}
  	./bi-opname < ${BCDEF} > bc-opname.h
  CLEANFILES += bc-opname.h bi-opname bi-opname.o
  
  bc-arity.h: bi-arity ${BCDEF}
  	./bi-arity < ${BCDEF} > bc-arity.h
  CLEANFILES += bc-arity.h bi-arity bi-arity.o
  
  insn-peep.c: genpeep ${MD}
  	./genpeep ${MD} > insn-peep.c
  CLEANFILES += insn-peep.c genpeep genpeep.o
  
  insn-opinit.c: genopinit ${MD}
  	./genopinit ${MD} > insn-opinit.c
  CLEANFILES += insn-opinit.c genopinit genopinit.o
  
  insn-recog.c: genrecog ${MD}
  	./genrecog ${MD} > insn-recog.c
  CLEANFILES += insn-recog.c genrecog genrecog.o
  
  insn-extract.c: genextract ${MD}
  	./genextract ${MD} > insn-extract.c
  CLEANFILES += insn-extract.c genextract genextract.o
  
  insn-output.c: genoutput ${MD}
  	./genoutput ${MD} > insn-output.c
  CLEANFILES += insn-output.c genoutput genoutput.o
  
  insn-emit.c: genemit ${MD}
  	./genemit ${MD} > insn-emit.c
  CLEANFILES += insn-emit.c genemit genemit.o
  
  insn-attrtab.c: genattrtab ${MD}
  	./genattrtab ${MD} > insn-attrtab.c
  CLEANFILES += insn-attrtab.c genattrtab genattrtab.o
  
! genattr.o: genattr.c
  
  genattr: genattr.o rtl.o obstack.o
! 	${CC} -o genattr genattr.o rtl.o obstack.o
  
! genflags.o: genflags.c
  
  genflags: genflags.o rtl.o obstack.o
! 	${CC} -o genflags genflags.o rtl.o obstack.o
  
! gencodes.o: gencodes.c
  
  gencodes: gencodes.o rtl.o obstack.o
! 	${CC} -o gencodes gencodes.o rtl.o obstack.o
  
! genconfig.o: genconfig.c
  
  genconfig: genconfig.o rtl.o obstack.o
! 	${CC} -o genconfig genconfig.o rtl.o obstack.o
  
! genpeep.o: genpeep.c
  
  genpeep: genpeep.o rtl.o obstack.o
! 	${CC} -o genpeep genpeep.o rtl.o obstack.o
  
! genopinit.o: genopinit.c
  
  genopinit: genopinit.o rtl.o obstack.o
! 	${CC} -o genopinit genopinit.o rtl.o obstack.o
  
! genrecog.o: genrecog.c
  
  genrecog: genrecog.o rtl.o obstack.o
! 	${CC} -o genrecog genrecog.o rtl.o obstack.o
  
! genextract.o: genextract.c
  
  genextract: genextract.o rtl.o obstack.o
! 	${CC} -o genextract genextract.o rtl.o obstack.o
  
! genoutput.o: genoutput.c
  
  genoutput: genoutput.o rtl.o obstack.o
! 	${CC} -o genoutput genoutput.o rtl.o obstack.o
  
! genemit.o: genemit.c
  
  genemit: genemit.o rtl.o obstack.o
! 	${CC} -o genemit genemit.o rtl.o obstack.o
  
! genattrtab.o: genattrtab.c insn-config.h
  
  
  genattrtab: genattrtab.o rtl.o obstack.o print-rtl.o rtlanal.o
! 	${CC} -o genattrtab genattrtab.o rtl.o obstack.o print-rtl.o rtlanal.o
  
! bi-opcode.o: bi-opcode.c
  
  bi-opcode: bi-opcode.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${CC} -o bi-opcode bi-opcode.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
  CLEANFILES+= bi-reverse.o
  
! bi-opname.o: bi-opname.c
  
  bi-opname: bi-opname.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${CC} -o bi-opname bi-opname.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
  
! bi-arity.o: bi-arity.c
  
  bi-arity: bi-arity.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${CC} -o bi-arity bi-arity.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
  
  CLEANFILES += bi-lexer.o bi-parser.o bi-parser.c bi-parser.h
  
--- 37,196 ----
  	./genattr ${MD} > insn-attr.h
  CLEANFILES += insn-attr.h genattr genattr.o
  
+ HOST_PROGS += genattr
+ 
  insn-flags.h: genflags ${MD}
  	./genflags ${MD} > insn-flags.h
  CLEANFILES += insn-flags.h genflags genflags.o
  
+ HOST_PROGS += genflags
+ 
  insn-codes.h: gencodes ${MD}
  	./gencodes ${MD} > insn-codes.h
  CLEANFILES += insn-codes.h gencodes gencodes.o
  
+ HOST_PROGS += gencodes
+ 
  insn-config.h: genconfig ${MD}
  	./genconfig ${MD} > insn-config.h
  CLEANFILES += insn-config.h genconfig genconfig.o
  
+ HOST_PROGS += genconfig
+ 
  bc-opcode.h: bi-opcode ${BCDEF}
  	./bi-opcode < ${BCDEF} > bc-opcode.h
  CLEANFILES += bc-opcode.h bi-opcode bi-opcode.o
  
+ HOST_PROGS += bi-opcode
+ 
  bc-opname.h: bi-opname ${BCDEF}
  	./bi-opname < ${BCDEF} > bc-opname.h
  CLEANFILES += bc-opname.h bi-opname bi-opname.o
  
+ HOST_PROGS += bi-opname
+ 
  bc-arity.h: bi-arity ${BCDEF}
  	./bi-arity < ${BCDEF} > bc-arity.h
  CLEANFILES += bc-arity.h bi-arity bi-arity.o
  
+ HOST_PROGS += bi-arity
+ 
  insn-peep.c: genpeep ${MD}
  	./genpeep ${MD} > insn-peep.c
  CLEANFILES += insn-peep.c genpeep genpeep.o
  
+ HOST_PROGS += genpeep
+ 
  insn-opinit.c: genopinit ${MD}
  	./genopinit ${MD} > insn-opinit.c
  CLEANFILES += insn-opinit.c genopinit genopinit.o
  
+ HOST_PROGS += genopinit
+ 
  insn-recog.c: genrecog ${MD}
  	./genrecog ${MD} > insn-recog.c
  CLEANFILES += insn-recog.c genrecog genrecog.o
  
+ HOST_PROGS += genrecog
+ 
  insn-extract.c: genextract ${MD}
  	./genextract ${MD} > insn-extract.c
  CLEANFILES += insn-extract.c genextract genextract.o
  
+ HOST_PROGS += genextract
+ 
  insn-output.c: genoutput ${MD}
  	./genoutput ${MD} > insn-output.c
  CLEANFILES += insn-output.c genoutput genoutput.o
  
+ HOST_PROGS += genoutput
+ 
  insn-emit.c: genemit ${MD}
  	./genemit ${MD} > insn-emit.c
  CLEANFILES += insn-emit.c genemit genemit.o
  
+ HOST_PROGS += genemit
+ 
  insn-attrtab.c: genattrtab ${MD}
  	./genattrtab ${MD} > insn-attrtab.c
  CLEANFILES += insn-attrtab.c genattrtab genattrtab.o
  
! HOST_PROGS += genattrtab
  
+ HOST_OBJS += genattr.o
+ HOST_OBJS += rtl.o obstack.o
+ 
  genattr: genattr.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genattr genattr.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genflags.o 
  
  genflags: genflags.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genflags genflags.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += gencodes.o 
  
  gencodes: gencodes.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o gencodes gencodes.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genconfig.o
  
  genconfig: genconfig.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genconfig genconfig.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genpeep.o
  
  genpeep: genpeep.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genpeep genpeep.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genopinit.o
  
  genopinit: genopinit.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genopinit genopinit.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genrecog.o
  
  genrecog: genrecog.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genrecog genrecog.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genextract.o
  
  genextract: genextract.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genextract genextract.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genoutput.o
  
  genoutput: genoutput.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genoutput genoutput.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genemit.o
  
  genemit: genemit.o rtl.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genemit genemit.o rtl.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += genattrtab.o print-rtl.o rtlanal.o
  
+ genattrtab.o: insn-config.h
  
  genattrtab: genattrtab.o rtl.o obstack.o print-rtl.o rtlanal.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o genattrtab genattrtab.o rtl.o obstack.o print-rtl.o rtlanal.o ${HOST_LDADD}
  
! HOST_OBJS += bi-opcode.o bi-parser.o bi-lexer.o bi-reverse.o
  
  bi-opcode: bi-opcode.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o bi-opcode bi-opcode.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o ${HOST_LDADD}
! 
  CLEANFILES+= bi-reverse.o
  
! HOST_OBJS += bi-opname.o
  
  bi-opname: bi-opname.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o bi-opname bi-opname.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o ${HOST_LDADD}
  
! HOST_OBJS += bi-arity.o
  
  bi-arity: bi-arity.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o bi-arity bi-arity.o bi-parser.o bi-lexer.o bi-reverse.o obstack.o ${HOST_LDADD}
  
  CLEANFILES += bi-lexer.o bi-parser.o bi-parser.c bi-parser.h
  
***************
*** 171,176 ****
--- 203,213 ----
  c-lex.o: c-parse.h
  
  c-parse.h c-parse.o: c-parse.c
+ 
+ .for obj in ${HOST_OBJS}
+ ${obj} : ${obj:.o=.c}
+ 	${HOST_CC} ${HOST_CFLAGS} ${HOST_CPPFLAGS} -c ${.IMPSRC} -o ${.TARGET}
+ .endfor
  
  install: __libinstall
  
*** src/gnu/usr.bin/egcs/f771/Makefile.orig	Tue Apr 28 10:34:42 1998
--- src/gnu/usr.bin/egcs/f771/Makefile	Tue Apr 28 10:36:03 1998
***************
*** 19,26 ****
  	./fini ${F}/str-op.fin str-op.j str-op.h
  	./fini ${F}/str-ot.fin str-ot.j str-ot.h
  
  fini:	fini.o proj.o
! 	${CC} -o fini fini.o proj.o
  
  st.c sta.c stb.c stc.c std.c ste.c stt.c stu.c stw.c:	${FINIFILES}
  
--- 19,33 ----
  	./fini ${F}/str-op.fin str-op.j str-op.h
  	./fini ${F}/str-ot.fin str-ot.j str-ot.h
  
+ HOST_OBJS = fini.o proj.o
+ 
+ .for obj in ${HOST_OBJS}
+ ${obj} : ${obj:.o=.c}
+ 	${HOST_CC} ${HOST_CFLAGS} ${HOST_CPPFLAGS} -c ${.IMPSRC} -o ${.TARGET}
+ .endfor
+ 
  fini:	fini.o proj.o
! 	${HOST_CC} ${HOST_CFLAGS} ${HOST_LDFLAGS} -o ${.TARGET} ${.ALLSRC} ${HOST_LDADD}
  
  st.c sta.c stb.c stc.c std.c ste.c stt.c stu.c stw.c:	${FINIFILES}
  
>Audit-Trail:
>Unformatted:
	changes to Makefile to allow cross-compilation in the tree
	non-critical
	low
	change-request