sync
[bitrig.git] / Makefile.cross
blob88c324d62e8d8b6da39b1cfe95df7bd31d7ed1f6
1 # $OpenBSD: Makefile.cross,v 1.61 2013/03/10 08:50:42 miod Exp $
3 # preconditions for cross build environment
4 # build and install the binutils cross package eg bitrig-newbinutils-2.22-arm
5 # this is  bitrig/bitrig-binutils-2.22 FLAVOR=armcross
6 # also either the libgcc.a or libclang_rt.a for the machine must be copied
7 # into /usr/src (dont know how to build this object yet)
9 cross-tools:    cross-includes cross-buildenv cross-lib
10 cross-distrib:  cross-tools cross-bin cross-share cross-sys cross-etc-root-var
11 # cross-gnu \
13 .NOTPARALLEL:
15 CCCROSSOPTS=
17 # Have to compute TARGET_ARCH directly in the Makefile, for .if tests involving
18 # this variable to work.
19 .if     (${TARGET} == "beagle" || ${TARGET} == "imx")
20 TARGET_ARCH=    arm
21 CCCROSSOPTS+="-march=armv7-a -mfloat-abi=soft"
22 .else
23 TARGET_ARCH=    ${TARGET}
24 .endif
25 TARGET_CPU?=    ${TARGET_ARCH}
27 # List of LP64 archs
28 # XXX move to bsd.*.mk?
29 LP64_ARCH = amd64
31 TARGET_IS_LP64 =
32 MACHINE_IS_LP64 =
33 .for _ in ${LP64_ARCH}
34 . if !empty(TARGET_ARCH:M$_)
35     TARGET_IS_LP64 = yes
36 . endif
37 . if !empty(MACHINE_ARCH:M$_)
38     MACHINE_IS_LP64 = yes
39 . endif
40 .endfor
42 #CROSSCPPFLAGS?=        -nostdinc -I${CROSSDIR}/usr/include
43 #CROSSLDFLAGS?= -nostdlib -L${CROSSDIR}/usr/lib -static
44 CROSSCFLAGS?=   ${CROSSCPPFLAGS} -O2 ${PIPE} ${DEBUG}
45 CROSSCXXFLAGS?= ${CROSSCPPFLAGS}
46 #LDSTATIC?=     -static
48 # XXX
49 BINMODE?=555
50 BINOWN?=root
51 BINGRP?=bin
53 CROSSDIR=       ${DESTDIR}/usr/cross/${TARGET}
54 CROSSENV=       AR=${CROSSDIR}/usr/bin/${TARGET_CANON}-ar \
55                 AS=${CROSSDIR}/usr/bin/${TARGET_CANON}-as \
56                 CC="${CROSSDIR}/usr/bin/${TARGET_CANON}-clang" \
57                 CPP=${CROSSDIR}/usr/bin/${TARGET_CANON}-cpp \
58                 CXX=${CROSSDIR}/usr/bin/${TARGET_CANON}-clang++ \
59                 LD=${CROSSDIR}/usr/bin/${TARGET_CANON}-ld \
60                 OBJCOPY=${CROSSDIR}/usr/bin/${TARGET_CANON}-objcopy \
61                 LORDER=/usr/bin/lorder RANLIB=${CROSSDIR}/usr/bin/${TARGET_CANON}-ranlib \
62                 STRIP=${CROSSDIR}/usr/bin/${TARGET_CANON}-strip \
63                 HOSTCC=\"${CC}\" HOSTCXX=\"${CXX}\" NOMAN= \
64                 HOSTCFLAGS=\"${CFLAGS}\" HOSTCXXFLAGS=\"${CXXFLAGS}\" \
65                 HOSTLDFLAGS=\"${LDFLAGS}\" \
66                 CFLAGS=\"${CROSSCFLAGS}\" CPPFLAGS=\"${CROSSCPPFLAGS}\" \
67                 CXXFLAGS=\"${CROSSCXXFLAGS}\" \
68                 LDFLAGS=\"${CROSSLDFLAGS}\"
69 CROSSADDPATH=:${CROSSDIR}/usr/bin/
70 CROSSPATH=      /usr/bin:/bin:/usr/sbin:/sbin${CROSSADDPATH}
71 CROSSLANGS?=    c c++
73 TARGET_CANON=`cat ${CROSSDIR}/TARGET_CANON`
74 #CROSSCFLAGS+=${CCCROSSOPTS}
76 CROSSDIRS=      ${CROSSDIR}/.dirs_done
77 CROSSOBJ=       ${CROSSDIR}/.obj_done
78 CROSSBUILDENV=  ${CROSSDIR}/.buildenv_done
79 CROSSINCLUDES=  ${CROSSDIR}/.includes_done
80 #NO_CROSS=      isakmpd keynote ssh
82 .include <bsd.own.mk>
84 .if !empty(PIE_ARCH:M${_arch})
85 NOPIE_FLAGS=-fno-pie
86 NOPIE_LDFLAGS=-nopie
87 PIE_DEFAULT=${DEFAULT_PIE_DEF}
88 .else
89 NOPIE_FLAGS=
90 PIE_DEFAULT=
91 .endif
93 # no libcrypto.... these won't build
94 #NO_CROSS+=     dc login_krb5 login_krb5-or-pwd passwd ppp tcpdump telnet \
95 #               ftp gzsig sasyncd vnconfig
96                 
97 # explicit cross-compile
98 NO_CROSS+=bind
99 NO_CROSS+=httpd
100 NO_CROSS+=microcode
101 NO_CROSS+=groff lynx perl texinfo cvs
102 NO_CROSS+=nsd
103 NO_CROSS+=nginx
104 NO_CROSS+=sqlite3
105 NO_CROSS+=bgplg
107 cross-dirs:     ${CROSSDIRS}
108 cross-obj:      ${CROSSOBJ}
109 cross-buildenv: ${CROSSBUILDENV}
110 cross-includes: ${CROSSINCLUDES}
112 cross-env:
113         @echo ${CROSSENV} MACHINE=${TARGET} \
114             MACHINE_ARCH=`cat ${CROSSDIR}/TARGET_ARCH` \
115             MACHINE_CPU=`cat ${CROSSDIR}/TARGET_CPU` \
116             BSDOBJDIR=${CROSSDIR}/usr/obj \
117             BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET}
119 ${CROSSDIRS}:
120 .if ${TARGET_ARCH} == "arm" &&  ${MACHINE_IS_LP64} == "yes"
121         # this config is allowed
122 .elif ${TARGET_IS_LP64} != ${MACHINE_IS_LP64}
123         @echo "host and target have different size longs"
124         @echo "cross compiler generates bad code; aborting"; exit 1
125 .endif
126         @-mkdir -p ${CROSSDIR}
127         @echo ${TARGET_ARCH} > ${CROSSDIR}/TARGET_ARCH
128         @echo TARGET_ARCH is `cat ${CROSSDIR}/TARGET_ARCH`
129         @echo ${TARGET_CPU} > ${CROSSDIR}/TARGET_CPU
130         @echo TARGET_CPU is `cat ${CROSSDIR}/TARGET_CPU`
131         @eval `grep '^osr=' sys/conf/newvers.sh`; \
132            echo ${TARGET_ARCH}-unknown-bitrig$$osr > \
133            ${CROSSDIR}/TARGET_CANON
134         @-mkdir -p ${CROSSDIR}
135         @-mkdir -p ${CROSSDIR}/usr/${TARGET_CANON}
136         @ln -sf ${CROSSDIR}/usr/include \
137             ${CROSSDIR}/usr/${TARGET_CANON}/include
138         @ln -sf ${CROSSDIR}/usr/lib \
139             ${CROSSDIR}/usr/${TARGET_CANON}/lib
140         @-mkdir -p ${CROSSDIR}/usr/${TARGET_CANON}/bin
141         @(cd ${.CURDIR}/etc && DESTDIR=${CROSSDIR} ${MAKE} distrib-dirs)
142         @touch ${CROSSDIRS}
144 ${CROSSOBJ}:    ${CROSSDIRS}
145         @-mkdir -p ${CROSSDIR}/usr/obj
146         @(cd ${.CURDIR} && \
147             BSDOBJDIR=${CROSSDIR}/usr/obj \
148             COMPILER_VERSION=${COMPILER_VERSION} \
149             MACHINE=${TARGET} \
150             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
151             BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
152             ${MAKE} obj)
153         @touch ${CROSSOBJ}
155 ${CROSSINCLUDES}:       ${CROSSOBJ}
156         @-mkdir -p ${CROSSDIR}/usr/include
157         @(cd ${.CURDIR}/include && \
158             COMPILER_VERSION=${COMPILER_VERSION} \
159             MACHINE=${TARGET} \
160             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
161             MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
162             TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
163             ${MAKE} prereq && \
164             COMPILER_VERSION=${COMPILER_VERSION} \
165             MACHINE=${TARGET} \
166             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
167             MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
168             TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
169             ${MAKE} DESTDIR=${CROSSDIR} includes)
170         @touch ${CROSSINCLUDES}
172 ${CROSSBUILDENV}:       ${CROSSINCLUDES}
173 #        XXX for now assumes the build env is in place 
174         a=${TARGET_CANON} ; \
175         l=$$(echo /usr/local/bin/$${a}-* ) ; \
176         for file in $${l} ; \
177         do \
178                 echo file $${file} ; \
179                 ln -sf $${file} ${CROSSDIR}/usr/bin/$$(basename $${file}) ;\
180         done ;
181         mkdir -p ${CROSSDIR}/usr/${TARGET_CANON}/bin
182         a=${TARGET_CANON} ; \
183         l=$$(echo /usr/local/$${a}/bin/* ) ; \
184         echo l $${l} ;\
185         for file in $${l} ; \
186         do \
187                 echo linking $${file}; \
188                 ln -sf $${file} ${CROSSDIR}/usr/$${a}/bin/$$(basename $${file}) ;\
189         done ;\
190         rm -f ${CROSSDIR}/usr/bin/$${a}-clang; \
191         cp /usr/bin/clang ${CROSSDIR}/usr/bin/$${a}-cross-clang; \
192         echo  "#! /bin/sh\n${CROSSDIR}/usr/bin/$${a}-cross-clang -target $${a} --sysroot ${CROSSDIR} ${CCCROSSOPTS} \"$$""@\"" > ${CROSSDIR}/usr/bin/$${a}-clang; \
193         chmod +x ${CROSSDIR}/usr/bin/$${a}-clang; \
194         echo  "#! /bin/sh\n${CROSSDIR}/usr/bin/$${a}-cross-clang -ccc-cxx -target $${a} --sysroot ${CROSSDIR} ${CCCROSSOPTS} \"$$""@\"" > ${CROSSDIR}/usr/bin/$${a}-clang++; \
195         chmod +x ${CROSSDIR}/usr/bin/$${a}-clang++; \
196         rm -f ${CROSSDIR}/usr/bin/$${a}-cpp ${CROSSDIR}/usr/$${a}/bin/cpp; \
197         cp usr.bin/cpp/cpp_clang.sh ${CROSSDIR}/usr/bin/$${a}-cpp; \
198         chmod +x ${CROSSDIR}/usr/bin/$${a}-cpp; \
199         cp ${CROSSDIR}/usr/bin/$${a}-cpp ${CROSSDIR}/usr/$${a}/bin/cpp ; \
200         mv ${CROSSDIR}/usr/bin/$${a}-ld ${CROSSDIR}/usr/bin/$${a}-cross-ld ; \
201         echo "#!/bin/sh\n${CROSSDIR}/usr/bin/$${a}-cross-ld \"$$""@\" -L ${CROSSDIR}/usr/lib" > ${CROSSDIR}/usr/bin/$${a}-ld ;\
202         chmod +x ${CROSSDIR}/usr/bin/$${a}-ld 
203         cp libclang_rt.${TARGET_ARCH}.a ${CROSSDIR}/usr/lib
204         @touch ${CROSSBUILDENV}
207 # XXX MAKEOBJDIR maybe should be obj.${TARGET} here, revisit later
208 cross-lib:      ${CROSSGCC}
209         MACHINE=${TARGET} \
210             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU}; \
211         export MACHINE MACHINE_ARCH MACHINE_CPU; \
212         (cd ${.CURDIR}/lib; \
213             for lib in csu libc; do \
214             (cd $$lib; \
215                 eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
216                     ${MAKE} WANTLINT=no depend all ;\
217                 eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} DESTDIR=${CROSSDIR} \
218                     ${MAKE} WANTLINT=no install); \
219             done; \
220             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
221                 SKIPDIR=\"${NO_CROSS} libocurses/PSD.doc\" \
222                 ${MAKE} WANTLINT=no depend all ; \
223             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} DESTDIR=${CROSSDIR} \
224                 SKIPDIR=\"${NO_CROSS} libocurses/PSD.doc\" \
225                 ${MAKE} WANTLINT=no install)
227 cross-bin:      ${CROSSOBJ}
228         MACHINE=${TARGET} \
229             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU}; \
230         export MACHINE MACHINE_ARCH MACHINE_CPU; \
231         for i in libexec bin sbin usr.bin usr.sbin; do \
232         (cd ${.CURDIR}/$$i; \
233             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
234                 SKIPDIR=\"${BINUTILS} ${NO_CROSS}\" \
235                 ${MAKE} depend all ; \
236             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} DESTDIR=${CROSSDIR} \
237                 SKIPDIR=\"${BINUTILS} ${NO_CROSS}\" \
238                 ${MAKE} install); \
239         done
241 cross-gnu:      ${CROSSOBJ}
242         MACHINE=${TARGET} \
243             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU}; \
244         export MACHINE MACHINE_ARCH MACHINE_CPU; \
245         for i in gnu/lib gnu/usr.sbin gnu/usr.bin ; do \
246         (cd ${.CURDIR}/$$i; \
247             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
248                 SKIPDIR=\"${NO_CROSS}\" \
249                 ${MAKE} depend all ; \
250             eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} DESTDIR=${CROSSDIR} \
251                 SKIPDIR=\"${NO_CROSS}\" \
252                 ${MAKE} install); \
253         done
255 cross-share:   ${CROSSOBJ}
256         MACHINE=${TARGET} \
257             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU}; \
258         export MACHINE MACHINE_ARCH MACHINE_CPU; \
259         for i in share; do \
260             (cd ${.CURDIR}/$$i; \
261                 eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
262                 SKIPDIR=\"${NO_CROSS}\" \
263                 ${MAKE} depend all install); \
264         done
266 cross-sys:   ${CROSSOBJ}
267         MACHINE=${TARGET} \
268             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU}; \
269         export MACHINE MACHINE_ARCH MACHINE_CPU; \
270         for i in sys; do \
271             (cd ${.CURDIR}/$$i; \
272                 eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
273                 SKIPDIR=\"${NO_CROSS}\" \
274                 ${MAKE} depend all install); \
275         done
277 cross-etc-root-var:     ${CROSSOBJ}
278         (cd ${.CURDIR}/etc && \
279             MACHINE=${TARGET} \
280             MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
281             DESTDIR=${CROSSDIR} \
282             ${MAKE} distribution-etc-root-var)
284 cross-depend:
285         @(cd ${.CURDIR} && \
286             BSDOBJDIR=${CROSSDIR}/usr/obj \
287             BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
288             SKIPDIR="${NO_CROSS}" \
289             ${MAKE} depend)
291 cross-clean:
292         @(cd ${.CURDIR} && \
293             BSDOBJDIR=${CROSSDIR}/usr/obj \
294             BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
295             SKIPDIR="${NO_CROSS}" \
296             ${MAKE} clean)
298 cross-cleandir:
299         @(cd ${.CURDIR} && \
300             BSDOBJDIR=${CROSSDIR}/usr/obj \
301             BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
302             SKIPDIR="${NO_CROSS}" \
303             ${MAKE} cleandir)