respect TARGET_LDFLAGS
[openadk.git] / mk / vars.mk
blobd95caaa822a54841fac21b10c3623112cdbee418
1 # This file is part of the OpenADK project. OpenADK is copyrighted
2 # material, please see the LICENCE file in the top-level directory.
4 CP= cp -fpR
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}
14 else
15 ADK_SUFFIX:= _${ADK_TARGET_SYSTEM}_${ADK_TARGET_LIBC}_${ADK_TARGET_CPU_ARCH}_${ADK_TARGET_ABI}
16 endif
18 # some global dirs
19 BASE_DIR:= $(ADK_TOPDIR)
20 ifeq ($(ADK_DL_DIR),)
21 DL_DIR?= $(BASE_DIR)/dl
22 else
23 DL_DIR?= $(ADK_DL_DIR)
24 endif
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}
30 # dirs for cleandir
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
49 # PATH variables
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
56 else
57 GCC_CHECK:=
58 endif
60 ifeq ($(ADK_TARGET_UCLINUX),y)
61 ADK_TARGET_LINUXTYPE:= uclinux
62 else
63 ADK_TARGET_LINUXTYPE:= linux
64 endif
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)
69 endif
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}
78 endif
80 # target tools
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
87 endif
88 ifeq ($(ADK_TARGET_ARCH_ARM),y)
89 TARGET_CC:= adk-uclinux-gcc
90 endif
91 endif
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)
101 endif
103 TARGET_CPPFLAGS:=
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
112 endif
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
118 endif
119 endif
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
126 endif
128 # security optimization, see http://www.akkadia.org/drepper/dsohowto.pdf
129 ifneq ($(ADK_TARGET_USE_LD_RELRO),)
130 TARGET_LDFLAGS+= -Wl,-z,relro
131 endif
132 ifneq ($(ADK_TARGET_USE_LD_BIND_NOW),)
133 TARGET_LDFLAGS+= -Wl,-z,now
134 endif
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
140 endif
141 endif
143 ifeq ($(ADK_TARGET_USE_STATIC_LIBS),y)
144 TARGET_CFLAGS+= -static
145 TARGET_CXXFLAGS+= -static
146 TARGET_LDFLAGS+= -static
147 endif
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
153 endif
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
159 endif
161 ifneq ($(ADK_TARGET_USE_LTO),)
162 TARGET_CFLAGS+= -flto
163 TARGET_CXXFLAGS+= -flto
164 TARGET_LDFLAGS+= -flto
165 endif
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
170 endif
172 ifeq ($(ADK_TARGET_ARCH_MICROBLAZE),y)
173 TARGET_CFLAGS+= -mxl-barrel-shift
174 TARGET_CXXFLAGS+= -mxl-barrel-shift
175 endif
176 ifeq ($(ADK_TARGET_ARCH_XTENSA),y)
177 TARGET_CFLAGS+= -mlongcalls -mtext-section-literals
178 TARGET_CXXFLAGS+= -mlongcalls -mtext-section-literals
179 endif
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
185 TARGET_CFLAGS+= -g3
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
193 else
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
200 endif
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
206 else
207 TARGET_CFLAGS+= -marm
208 TARGET_CXXFLAGS+= -marm
209 endif
210 endif
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
226 endif
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} \
232 PREFIX=/usr \
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' \
244 VERBOSE=1
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' \
253 CC='$(TARGET_CC)' \
254 GCC='$(TARGET_CC)' \
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)' \
271 CXX='$(HOST_CXX)' \
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
291 endif
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
305 endif
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
312 endif
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}; \
319 cd ${WRKDIR} && \
320 for file in ${FULLDISTFILES}; do case $$file in \
321 *.cpio) \
322 cat $$file | cpio -i -d ;; \
323 *.tar) \
324 tar -xf $$file ;; \
325 *.cpio.Z | *.cpio.gz | *.cgz | *.mcz) \
326 gzip -dc $$file | cpio -i -d ;; \
327 *.tar.xz | *.txz) \
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 - ;; \
335 *.zip) \
336 cat $$file | cpio -id -H zip ;; \
337 *.arm|*.jar|*.ids.gz) \
338 mkdir ${WRKBUILD}; cp $$file ${WRKBUILD} ;; \
339 *.bin) \
340 sh $$file --force --auto-accept ;; \
341 *) \
342 echo "Cannot extract '$$file'" >&2; \
343 false ;; \
344 esac; done
346 ifeq ($(ADK_VERBOSE),1)
347 QUIET:=
348 else
349 QUIET:= --quiet
350 endif
351 FETCH_CMD?= wget --timeout=$(ADK_WGET_TIMEOUT) -t 3 --no-check-certificate $(QUIET)
353 ifeq ($(ADK_HOST_CYGWIN),y)
354 EXEEXT:= .exe
355 endif
357 include $(ADK_TOPDIR)/mk/mirrors.mk