1 # This file is part of the OpenADK project. OpenADK is copyrighted
2 # material, please see the LICENCE file in the top-level directory.
5 INSTALL_DIR
= install -d
-m0755
6 INSTALL_DATA
= install -m0644
7 INSTALL_BIN
= install -m0755
8 INSTALL_SCRIPT
= install -m0755
9 MAKEFLAGS
= $(EXTRA_MAKEFLAGS
)
10 BUILD_USER
= $(shell id
-un
)
11 BUILD_GROUP
= $(shell id
-gn
)
12 ifeq ($(ADK_TARGET_ABI
),)
13 ADK_SUFFIX
:= _
${ADK_TARGET_SYSTEM}_
${ADK_TARGET_LIBC}_
${ADK_TARGET_CPU_ARCH}
15 ADK_SUFFIX
:= _
${ADK_TARGET_SYSTEM}_
${ADK_TARGET_LIBC}_
${ADK_TARGET_CPU_ARCH}_
${ADK_TARGET_ABI}
19 BASE_DIR
:= $(ADK_TOPDIR
)
21 DL_DIR?
= $(BASE_DIR
)/dl
23 DL_DIR?
= $(ADK_DL_DIR
)
25 SCRIPT_DIR
:= $(BASE_DIR
)/scripts
26 STAGING_HOST_DIR
:= ${BASE_DIR}/host_
${GNU_HOST_NAME}
27 HOST_BUILD_DIR
:= ${BASE_DIR}/host_build_
${GNU_HOST_NAME}
28 TOOLCHAIN_DIR
:= ${BASE_DIR}/toolchain
${ADK_SUFFIX}
31 FW_DIR_PFX
:= $(BASE_DIR
)/firmware
32 BUILD_DIR_PFX
:= $(BASE_DIR
)/build_
*
33 STAGING_PKG_DIR_PFX
:= ${BASE_DIR}/pkg_
*
34 STAGING_TARGET_DIR_PFX
:=${BASE_DIR}/target_
*
35 TOOLCHAIN_DIR_PFX
= $(BASE_DIR
)/toolchain_
*
36 STAGING_HOST_DIR_PFX
:= ${BASE_DIR}/host_
*
37 TARGET_DIR_PFX
:= $(BASE_DIR
)/root_
*
39 TARGET_DIR
:= $(BASE_DIR
)/root
${ADK_SUFFIX}
40 FW_DIR
:= $(BASE_DIR
)/firmware
/${ADK_TARGET_SYSTEM}_
${ADK_TARGET_LIBC}
41 BUILD_DIR
:= ${BASE_DIR}/build
${ADK_SUFFIX}
42 STAGING_TARGET_DIR
:= ${BASE_DIR}/target
${ADK_SUFFIX}
43 STAGING_PKG_DIR
:= ${BASE_DIR}/pkg
${ADK_SUFFIX}
44 STAGING_HOST2TARGET
:= ..
/..
/target
${ADK_SUFFIX}
45 TOOLCHAIN_BUILD_DIR
= $(BASE_DIR
)/toolchain_build
${ADK_SUFFIX}
46 PACKAGE_DIR
:= $(FW_DIR
)/packages
47 SCRIPT_TARGET_DIR
:= ${STAGING_TARGET_DIR}/scripts
50 TARGET_PATH
= ${SCRIPT_DIR}:${STAGING_TARGET_DIR}/scripts
:${TOOLCHAIN_DIR}/usr
/bin
:${STAGING_HOST_DIR}/usr
/bin
:${_PATH}
51 HOST_PATH
= ${SCRIPT_DIR}:${TOOLCHAIN_DIR}/usr
/bin
:${STAGING_HOST_DIR}/usr
/bin
:${_PATH}
52 AUTOTOOL_PATH
= ${TOOLCHAIN_DIR}/usr
/bin
:${STAGING_HOST_DIR}/usr
/bin
:${STAGING_TARGET_DIR}/scripts
:${_PATH}
54 ifeq ($(ADK_DISABLE_HONOUR_CFLAGS
),)
55 GCC_CHECK
:= GCC_HONOUR_COPTS
=2
60 ifeq ($(ADK_TARGET_UCLINUX
),y
)
61 ADK_TARGET_LINUXTYPE
:= uclinux
63 ADK_TARGET_LINUXTYPE
:= linux
66 GNU_TARGET_NAME
:= $(ADK_TARGET_CPU_ARCH
)-$(ADK_VENDOR
)-$(ADK_TARGET_LINUXTYPE
)-$(ADK_TARGET_SUFFIX
)
67 ifeq ($(ADK_TARGET_ARCH_C6X
),y
)
68 GNU_TARGET_NAME
:= $(ADK_TARGET_CPU_ARCH
)-$(ADK_TARGET_LINUXTYPE
)
70 TARGET_CROSS
:= $(TOOLCHAIN_DIR
)/usr
/bin
/$(GNU_TARGET_NAME
)-
71 TARGET_COMPILER_PREFIX?
=${TARGET_CROSS}
72 CONFIGURE_TRIPLE
:= --build
=${GNU_HOST_NAME} \
73 --host
=${GNU_TARGET_NAME} \
74 --target
=${GNU_TARGET_NAME}
76 ifneq ($(strip ${ADK_USE_CCACHE}),)
77 TARGET_COMPILER_PREFIX
=$(STAGING_HOST_DIR
)/usr
/bin
/ccache
${TARGET_CROSS}
81 TARGET_CC
:= ${TARGET_COMPILER_PREFIX}gcc
83 # use a gcc wrapper for coldfire/arm uclinux support
84 ifeq ($(ADK_TARGET_UCLINUX
),y
)
85 ifeq ($(ADK_TARGET_ARCH_M68K
),y
)
86 TARGET_CC
:= adk-uclinux-gcc
88 ifeq ($(ADK_TARGET_ARCH_ARM
),y
)
89 TARGET_CC
:= adk-uclinux-gcc
93 TARGET_CXX
:= ${TARGET_COMPILER_PREFIX}g
++
94 TARGET_LD
:= ${TARGET_COMPILER_PREFIX}ld
95 TARGET_AR
:= ${TARGET_COMPILER_PREFIX}ar
96 TARGET_RANLIB
:= ${TARGET_COMPILER_PREFIX}ranlib
98 ifneq ($(ADK_TARGET_ABI_CFLAGS
),)
99 TARGET_CC
+= $(ADK_TARGET_ABI_CFLAGS
)
100 TARGET_CXX
+= $(ADK_TARGET_ABI_CFLAGS
)
104 TARGET_CFLAGS
:= $(ADK_TARGET_CFLAGS
) -fwrapv
-fno-ident
-fhonour-copts
105 TARGET_CXXFLAGS
:= $(ADK_TARGET_CFLAGS
) -fwrapv
-fno-ident
-fhonour-copts
106 TARGET_LDFLAGS
:= -L
$(STAGING_TARGET_DIR
)/lib
-L
$(STAGING_TARGET_DIR
)/usr
/lib \
107 -Wl
,-O1
-Wl
,-rpath
-Wl
,/usr
/lib \
108 -Wl
,-rpath-link
-Wl
,${STAGING_TARGET_DIR}/usr
/lib
110 ifeq ($(ADK_TARGET_BINFMT_FLAT
),y
)
111 TARGET_LDFLAGS
+= -elf2flt
114 ifeq ($(ADK_TARGET_ARCH_M68K
),y
)
115 ifeq ($(ADK_TARGET_BINFMT_FLAT_SEP_DATA
),y
)
116 TARGET_CFLAGS
+= -msep-data
117 TARGET_CXXFLAGS
+= -msep-data
121 ifeq ($(ADK_TARGET_LIB_MUSL
),y
)
122 # use -static-libgcc by default only for musl
123 TARGET_CFLAGS
+= -static-libgcc
124 TARGET_CXXFLAGS
+= -static-libgcc
125 TARGET_LDFLAGS
+= -static-libgcc
128 # security optimization, see http://www.akkadia.org/drepper/dsohowto.pdf
129 ifneq ($(ADK_TARGET_USE_LD_RELRO
),)
130 TARGET_LDFLAGS
+= -Wl
,-z
,relro
132 ifneq ($(ADK_TARGET_USE_LD_BIND_NOW
),)
133 TARGET_LDFLAGS
+= -Wl
,-z
,now
136 # needed for musl ppc
137 ifeq ($(ADK_TARGET_ARCH_PPC
),y
)
138 ifeq ($(ADK_TARGET_LIB_MUSL
),y
)
139 TARGET_LDFLAGS
+= -Wl
,--secure-plt
143 ifeq ($(ADK_TARGET_USE_STATIC_LIBS
),y
)
144 TARGET_CFLAGS
+= -static
145 TARGET_CXXFLAGS
+= -static
146 TARGET_LDFLAGS
+= -static
149 ifneq ($(ADK_TARGET_USE_SSP
),)
150 TARGET_CFLAGS
+= -fstack-protector-all
--param
=ssp-buffer-size
=4
151 TARGET_CXXFLAGS
+= -fstack-protector-all
--param
=ssp-buffer-size
=4
152 TARGET_LDFLAGS
+= -fstack-protector-all
155 ifneq ($(ADK_TARGET_USE_LD_GC
),)
156 TARGET_CFLAGS
+= -fdata-sections
-ffunction-sections
157 TARGET_CXXFLAGS
+= -fdata-sections
-ffunction-sections
158 TARGET_LDFLAGS
+= -Wl
,--gc-sections
161 ifneq ($(ADK_TARGET_USE_LTO
),)
162 TARGET_CFLAGS
+= -flto
163 TARGET_CXXFLAGS
+= -flto
164 TARGET_LDFLAGS
+= -flto
167 # performance optimization, see http://www.akkadia.org/drepper/dsohowto.pdf
168 ifneq ($(ADK_TARGET_USE_GNU_HASHSTYLE
),)
169 TARGET_LDFLAGS
+= -Wl
,--hash-style
=gnu
172 ifeq ($(ADK_TARGET_ARCH_MICROBLAZE
),y
)
173 TARGET_CFLAGS
+= -mxl-barrel-shift
174 TARGET_CXXFLAGS
+= -mxl-barrel-shift
176 ifeq ($(ADK_TARGET_ARCH_XTENSA
),y
)
177 TARGET_CFLAGS
+= -mlongcalls
-mtext-section-literals
178 TARGET_CXXFLAGS
+= -mlongcalls
-mtext-section-literals
181 # add configured cflags for optimization
182 TARGET_CFLAGS
+= $(ADK_TARGET_CFLAGS_OPT
)
183 TARGET_CXXFLAGS
+= $(ADK_TARGET_CFLAGS_OPT
)
184 # always add debug information
186 TARGET_CXXFLAGS
+= -g3
188 ifneq ($(ADK_DEBUG
),)
189 TARGET_CFLAGS
+= -fno-omit-frame-pointer
190 TARGET_CXXFLAGS
+= -fno-omit-frame-pointer
191 TARGET_CFLAGS
+= -funwind-tables
-fasynchronous-unwind-tables
192 TARGET_CXXFLAGS
+= -funwind-tables
-fasynchronous-unwind-tables
194 TARGET_CPPFLAGS
+= -DNDEBUG
195 TARGET_CFLAGS
+= -fomit-frame-pointer
196 TARGET_CXXFLAGS
+= -fomit-frame-pointer
197 # stop generating eh_frame stuff
198 TARGET_CFLAGS
+= -fno-unwind-tables
-fno-asynchronous-unwind-tables
199 TARGET_CXXFLAGS
+= -fno-unwind-tables
-fno-asynchronous-unwind-tables
202 ifeq ($(ADK_TARGET_ARCH_ARM
),y
)
203 ifeq ($(ADK_TARGET_ARCH_ARM_WITH_THUMB
),y
)
204 TARGET_CFLAGS
+= -mthumb
-Wa
,-mimplicit-it
=thumb
205 TARGET_CXXFLAGS
+= -mthumb
-Wa
,-mimplicit-it
=thumb
207 TARGET_CFLAGS
+= -marm
208 TARGET_CXXFLAGS
+= -marm
212 # host compiler and linker flags
213 HOST_CPPFLAGS
:= -I
$(STAGING_HOST_DIR
)/usr
/include
214 HOST_CFLAGS
:= -O0
-g0
215 HOST_CXXFLAGS
:= -O0
-g0
216 HOST_LDFLAGS
:= -L
$(STAGING_HOST_DIR
)/usr
/lib
-Wl
,-rpath
-Wl
,${STAGING_HOST_DIR}/usr
/lib
218 PATCH
= PATH
='${HOST_PATH}' ${BASH} $(SCRIPT_DIR
)/patch.sh
219 PATCHP0
= PATH
='${HOST_PATH}' patch
-p0
221 ifeq ($(ADK_STATIC_TOOLCHAIN
),y
)
222 HOST_STATIC_CFLAGS
:= -static
-Wl
,-static
223 HOST_STATIC_CXXFLAGS
:= -static
-Wl
,-static
224 HOST_STATIC_LDFLAGS
:= -Wl
,-static
225 HOST_STATIC_LLDFLAGS
:= -all-static
228 SED
:= PATH
='${HOST_PATH}' sed
-i
-e
229 XZ
:= PATH
='${HOST_PATH}' xz
230 LINUX_DIR
:= $(BUILD_DIR
)/linux
231 KERNEL_MODULE_FLAGS
:= ARCH
=${ADK_TARGET_ARCH} \
233 KERNEL_PATH
=${LINUX_DIR} \
234 KERNELDIR
=${LINUX_DIR} \
235 KERNEL_DIR
=${LINUX_DIR} \
236 CROSS_COMPILE
="${TARGET_CROSS}" \
237 CFLAGS_MODULE
="-fhonour-copts" \
240 COMMON_ENV
= CONFIG_SHELL
='$(strip ${SHELL})' \
241 AUTOM4TE
='${STAGING_HOST_DIR}/usr/bin/autom4te' \
242 M4
='${STAGING_HOST_DIR}/usr/bin/m4' \
243 LIBTOOLIZE
='${STAGING_HOST_DIR}/usr/bin/libtoolize -q' \
246 TARGET_ENV
= AR
='$(TARGET_CROSS)ar' \
247 AS
='$(TARGET_CROSS)as' \
248 LD
='$(TARGET_CROSS)ld' \
249 NM
='$(TARGET_CROSS)nm' \
250 RANLIB
='$(TARGET_CROSS)ranlib' \
251 STRIP
='$(TARGET_CROSS)strip' \
252 OBJCOPY
='$(TARGET_CROSS)objcopy' \
255 CXX
='$(TARGET_CXX)' \
256 CROSS
='$(TARGET_CROSS)' \
257 CROSS_COMPILE
='$(TARGET_CROSS)' \
258 CFLAGS
='$(TARGET_CFLAGS)' \
259 CXXFLAGS
='$(TARGET_CXXFLAGS)' \
260 CPPFLAGS
='$(TARGET_CPPFLAGS)' \
261 LDFLAGS
='$(TARGET_LDFLAGS)' \
262 CC_FOR_BUILD
='$(HOST_CC)' \
263 CXX_FOR_BUILD
='$(HOST_CXX)' \
264 CPPFLAGS_FOR_BUILD
='$(HOST_CPPFLAGS)' \
265 CFLAGS_FOR_BUILD
='$(HOST_CFLAGS)' \
266 CXXFLAGS_FOR_BUILD
='$(HOST_CXXFLAGS)' \
267 LDFLAGS_FOR_BUILD
='$(HOST_LDFLAGS)' \
268 LIBS_FOR_BUILD
='$(HOST_LIBS)'
270 HOST_ENV
= CC
='$(HOST_CC)' \
272 CPPFLAGS
='$(HOST_CPPFLAGS)' \
273 CFLAGS
='$(HOST_CFLAGS)' \
274 CXXFLAGS
='$(HOST_CXXFLAGS)' \
275 LDFLAGS
='$(HOST_LDFLAGS)'
277 PKG_SUFFIX
:= $(strip $(subst ",, $(ADK_PACKAGE_SUFFIX)))
279 ifeq ($(ADK_TARGET_PACKAGE_IPKG),y)
280 PKG_BUILD:= PATH='${HOST_PATH}' \
281 ${BASH} ${SCRIPT_DIR}/ipkg-build
282 PKG_INSTALL:= PATH='${HOST_PATH}' \
283 IPKG_TMP=$(BUILD_DIR)/tmp \
284 IPKG_INSTROOT=$(TARGET_DIR) \
285 IPKG_CONF_DIR=$(STAGING_TARGET_DIR)/etc \
286 IPKG_OFFLINE_ROOT=$(TARGET_DIR) \
287 BIN_DIR=$(STAGING_HOST_DIR)/usr/bin \
288 ${BASH} ${SCRIPT_DIR}/ipkg \
289 -force-defaults -force-depends install
290 PKG_STATE_DIR:= $(TARGET_DIR)/usr/lib/ipkg
293 ifeq ($(ADK_TARGET_PACKAGE_OPKG),y)
294 PKG_BUILD:= PATH='${HOST_PATH}' \
295 ${BASH} ${SCRIPT_DIR}/ipkg-build
296 PKG_INSTALL:= PATH='${HOST_PATH}' \
297 IPKG_TMP=$(BUILD_DIR)/tmp \
298 IPKG_INSTROOT=$(TARGET_DIR) \
299 IPKG_CONF_DIR=$(STAGING_TARGET_DIR)/etc \
300 IPKG_OFFLINE_ROOT=$(TARGET_DIR) \
301 BIN_DIR=$(STAGING_HOST_DIR)/usr/bin \
302 ${BASH} ${SCRIPT_DIR}/ipkg \
303 -force-defaults -force-depends install
304 PKG_STATE_DIR:= $(TARGET_DIR)/usr/lib/opkg
307 ifeq ($(ADK_TARGET_PACKAGE_TXZ),y)
308 PKG_BUILD:= PATH='${HOST_PATH}' ${BASH} ${SCRIPT_DIR}/tarpkg build
309 PKG_INSTALL:= PKG_INSTROOT='$(TARGET_DIR)' \
310 PATH='${HOST_PATH}' ${BASH} ${SCRIPT_DIR}/tarpkg install
311 PKG_STATE_DIR:= $(TARGET_DIR)/usr/lib/pkg
314 RSTRIP:= PATH="$(TARGET_PATH
)" prefix='${TARGET_CROSS}' ${BASH} ${SCRIPT_DIR}/rstrip.sh
316 STATCMD:=$(shell if stat -qs .>/dev/null 2>&1; then echo 'stat -f %z';else echo 'stat -c %s';fi)
318 EXTRACT_CMD= PATH='${HOST_PATH}'; mkdir -p ${WRKDIR}; \
320 for file in ${FULLDISTFILES}; do case $$file in \
322 cat $$file | cpio -i -d ;; \
325 *.cpio.Z | *.cpio.gz | *.cgz | *.mcz) \
326 gzip -dc $$file | cpio -i -d ;; \
328 xz -dc $$file | tar -xf - ;; \
329 *.tar.Z | *.tar.gz | *.taz | *.tgz) \
330 gzip -dc $$file | tar -xf - ;; \
331 *.cpio.bz2 | *.cbz) \
332 bzip2 -dc $$file | cpio -i -d ;; \
333 *.tar.bz2 | *.tbz | *.tbz2) \
334 bzip2 -dc $$file | tar -xf - ;; \
336 cat $$file | cpio -id -H zip ;; \
337 *.arm|*.jar|*.ids.gz) \
338 mkdir ${WRKBUILD}; cp $$file ${WRKBUILD} ;; \
340 sh $$file --force --auto-accept ;; \
342 echo "Cannot extract
'$$file'" >&2; \
346 ifeq ($(ADK_VERBOSE),1)
351 FETCH_CMD?= wget --timeout=$(ADK_WGET_TIMEOUT) -t 3 --no-check-certificate $(QUIET)
353 ifeq ($(ADK_HOST_CYGWIN),y)
357 include $(ADK_TOPDIR)/mk/mirrors.mk