xref: /OK3568_Linux_fs/yocto/poky/meta/classes/toolchain-scripts.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyuninherit toolchain-scripts-base siteinfo kernel-arch
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun# We want to be able to change the value of MULTIMACH_TARGET_SYS, because it
4*4882a593Smuzhiyun# doesn't always match our expectations... but we default to the stock value
5*4882a593SmuzhiyunREAL_MULTIMACH_TARGET_SYS ?= "${MULTIMACH_TARGET_SYS}"
6*4882a593SmuzhiyunTARGET_CC_ARCH:append:libc-musl = " -mmusl"
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun# default debug prefix map isn't valid in the SDK
9*4882a593SmuzhiyunDEBUG_PREFIX_MAP = ""
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunEXPORT_SDK_PS1 = "${@ 'export PS1=\\"%s\\"' % d.getVar('SDK_PS1') if d.getVar('SDK_PS1') else ''}"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun# This function creates an environment-setup-script for use in a deployable SDK
14*4882a593Smuzhiyuntoolchain_create_sdk_env_script () {
15*4882a593Smuzhiyun	# Create environment setup script.  Remember that $SDKTARGETSYSROOT should
16*4882a593Smuzhiyun	# only be expanded on the target at runtime.
17*4882a593Smuzhiyun	base_sbindir=${10:-${base_sbindir_nativesdk}}
18*4882a593Smuzhiyun	base_bindir=${9:-${base_bindir_nativesdk}}
19*4882a593Smuzhiyun	sbindir=${8:-${sbindir_nativesdk}}
20*4882a593Smuzhiyun	sdkpathnative=${7:-${SDKPATHNATIVE}}
21*4882a593Smuzhiyun	prefix=${6:-${prefix_nativesdk}}
22*4882a593Smuzhiyun	bindir=${5:-${bindir_nativesdk}}
23*4882a593Smuzhiyun	libdir=${4:-${libdir}}
24*4882a593Smuzhiyun	sysroot=${3:-${SDKTARGETSYSROOT}}
25*4882a593Smuzhiyun	multimach_target_sys=${2:-${REAL_MULTIMACH_TARGET_SYS}}
26*4882a593Smuzhiyun	script=${1:-${SDK_OUTPUT}/${SDKPATH}/environment-setup-$multimach_target_sys}
27*4882a593Smuzhiyun	rm -f $script
28*4882a593Smuzhiyun	touch $script
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun	echo '# Check for LD_LIBRARY_PATH being set, which can break SDK and generally is a bad practice' >> $script
31*4882a593Smuzhiyun	echo '# http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80' >> $script
32*4882a593Smuzhiyun	echo '# http://xahlee.info/UnixResource_dir/_/ldpath.html' >> $script
33*4882a593Smuzhiyun	echo '# Only disable this check if you are absolutely know what you are doing!' >> $script
34*4882a593Smuzhiyun	echo 'if [ ! -z "${LD_LIBRARY_PATH:-}" ]; then' >> $script
35*4882a593Smuzhiyun	echo "    echo \"Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'\"" >> $script
36*4882a593Smuzhiyun	echo "    echo \"but please check why this was set in the first place and that it's safe to unset.\"" >> $script
37*4882a593Smuzhiyun	echo '    echo "The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set."' >> $script
38*4882a593Smuzhiyun	echo '    echo "For more references see:"' >> $script
39*4882a593Smuzhiyun	echo '    echo "  http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80"' >> $script
40*4882a593Smuzhiyun	echo '    echo "  http://xahlee.info/UnixResource_dir/_/ldpath.html"' >> $script
41*4882a593Smuzhiyun	echo '    return 1' >> $script
42*4882a593Smuzhiyun	echo 'fi' >> $script
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	echo "${EXPORT_SDK_PS1}" >> $script
45*4882a593Smuzhiyun	echo 'export SDKTARGETSYSROOT='"$sysroot" >> $script
46*4882a593Smuzhiyun	EXTRAPATH=""
47*4882a593Smuzhiyun	for i in ${CANADIANEXTRAOS}; do
48*4882a593Smuzhiyun		EXTRAPATH="$EXTRAPATH:$sdkpathnative$bindir/${TARGET_ARCH}${TARGET_VENDOR}-$i"
49*4882a593Smuzhiyun	done
50*4882a593Smuzhiyun	echo "export PATH=$sdkpathnative$bindir:$sdkpathnative$sbindir:$sdkpathnative$base_bindir:$sdkpathnative$base_sbindir:$sdkpathnative$bindir/../${HOST_SYS}/bin:$sdkpathnative$bindir/${TARGET_SYS}"$EXTRAPATH':"$PATH"' >> $script
51*4882a593Smuzhiyun	echo 'export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT' >> $script
52*4882a593Smuzhiyun	echo 'export PKG_CONFIG_PATH=$SDKTARGETSYSROOT'"$libdir"'/pkgconfig:$SDKTARGETSYSROOT'"$prefix"'/share/pkgconfig' >> $script
53*4882a593Smuzhiyun	echo 'export CONFIG_SITE=${SDKPATH}/site-config-'"${multimach_target_sys}" >> $script
54*4882a593Smuzhiyun	echo "export OECORE_NATIVE_SYSROOT=\"$sdkpathnative\"" >> $script
55*4882a593Smuzhiyun	echo 'export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"' >> $script
56*4882a593Smuzhiyun	echo "export OECORE_ACLOCAL_OPTS=\"-I $sdkpathnative/usr/share/aclocal\"" >> $script
57*4882a593Smuzhiyun	echo 'export OECORE_BASELIB="${baselib}"' >> $script
58*4882a593Smuzhiyun	echo 'export OECORE_TARGET_ARCH="${TARGET_ARCH}"' >>$script
59*4882a593Smuzhiyun	echo 'export OECORE_TARGET_OS="${TARGET_OS}"' >>$script
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun	echo 'unset command_not_found_handle' >> $script
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	toolchain_shared_env_script
64*4882a593Smuzhiyun}
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun# This function creates an environment-setup-script in the TMPDIR which enables
67*4882a593Smuzhiyun# a OE-core IDE to integrate with the build tree
68*4882a593Smuzhiyun# Caller must ensure CONFIG_SITE is setup
69*4882a593Smuzhiyuntoolchain_create_tree_env_script () {
70*4882a593Smuzhiyun	script=${TMPDIR}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}
71*4882a593Smuzhiyun	rm -f $script
72*4882a593Smuzhiyun	touch $script
73*4882a593Smuzhiyun	echo 'orig=`pwd`; cd ${COREBASE}; . ./oe-init-build-env ${TOPDIR}; cd $orig' >> $script
74*4882a593Smuzhiyun	echo 'export PATH=${STAGING_DIR_NATIVE}/usr/bin:${STAGING_BINDIR_TOOLCHAIN}:$PATH' >> $script
75*4882a593Smuzhiyun	echo 'export PKG_CONFIG_SYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR}' >> $script
76*4882a593Smuzhiyun	echo 'export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}' >> $script
77*4882a593Smuzhiyun	echo 'export CONFIG_SITE="${CONFIG_SITE}"' >> $script
78*4882a593Smuzhiyun	echo 'export SDKTARGETSYSROOT=${STAGING_DIR_TARGET}' >> $script
79*4882a593Smuzhiyun	echo 'export OECORE_NATIVE_SYSROOT="${STAGING_DIR_NATIVE}"' >> $script
80*4882a593Smuzhiyun	echo 'export OECORE_TARGET_SYSROOT="${STAGING_DIR_TARGET}"' >> $script
81*4882a593Smuzhiyun	echo 'export OECORE_ACLOCAL_OPTS="-I ${STAGING_DIR_NATIVE}/usr/share/aclocal"' >> $script
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun	toolchain_shared_env_script
84*4882a593Smuzhiyun}
85*4882a593Smuzhiyun
86*4882a593Smuzhiyuntoolchain_shared_env_script () {
87*4882a593Smuzhiyun	echo 'export CC="${TARGET_PREFIX}gcc ${TARGET_CC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
88*4882a593Smuzhiyun	echo 'export CXX="${TARGET_PREFIX}g++ ${TARGET_CC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
89*4882a593Smuzhiyun	echo 'export CPP="${TARGET_PREFIX}gcc -E ${TARGET_CC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
90*4882a593Smuzhiyun	echo 'export AS="${TARGET_PREFIX}as ${TARGET_AS_ARCH}"' >> $script
91*4882a593Smuzhiyun	echo 'export LD="${TARGET_PREFIX}ld ${TARGET_LD_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
92*4882a593Smuzhiyun	echo 'export GDB=${TARGET_PREFIX}gdb' >> $script
93*4882a593Smuzhiyun	echo 'export STRIP=${TARGET_PREFIX}strip' >> $script
94*4882a593Smuzhiyun	echo 'export RANLIB=${TARGET_PREFIX}ranlib' >> $script
95*4882a593Smuzhiyun	echo 'export OBJCOPY=${TARGET_PREFIX}objcopy' >> $script
96*4882a593Smuzhiyun	echo 'export OBJDUMP=${TARGET_PREFIX}objdump' >> $script
97*4882a593Smuzhiyun	echo 'export READELF=${TARGET_PREFIX}readelf' >> $script
98*4882a593Smuzhiyun	echo 'export AR=${TARGET_PREFIX}ar' >> $script
99*4882a593Smuzhiyun	echo 'export NM=${TARGET_PREFIX}nm' >> $script
100*4882a593Smuzhiyun	echo 'export M4=m4' >> $script
101*4882a593Smuzhiyun	echo 'export TARGET_PREFIX=${TARGET_PREFIX}' >> $script
102*4882a593Smuzhiyun	echo 'export CONFIGURE_FLAGS="--target=${TARGET_SYS} --host=${TARGET_SYS} --build=${SDK_ARCH}-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"' >> $script
103*4882a593Smuzhiyun	echo 'export CFLAGS="${TARGET_CFLAGS}"' >> $script
104*4882a593Smuzhiyun	echo 'export CXXFLAGS="${TARGET_CXXFLAGS}"' >> $script
105*4882a593Smuzhiyun	echo 'export LDFLAGS="${TARGET_LDFLAGS}"' >> $script
106*4882a593Smuzhiyun	echo 'export CPPFLAGS="${TARGET_CPPFLAGS}"' >> $script
107*4882a593Smuzhiyun	echo 'export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"' >> $script
108*4882a593Smuzhiyun	echo 'export OECORE_DISTRO_VERSION="${DISTRO_VERSION}"' >> $script
109*4882a593Smuzhiyun	echo 'export OECORE_SDK_VERSION="${SDK_VERSION}"' >> $script
110*4882a593Smuzhiyun	echo 'export ARCH=${ARCH}' >> $script
111*4882a593Smuzhiyun	echo 'export CROSS_COMPILE=${TARGET_PREFIX}' >> $script
112*4882a593Smuzhiyun	echo 'export OECORE_TUNE_CCARGS="${TUNE_CCARGS}"' >> $script
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun    cat >> $script <<EOF
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun# Append environment subscripts
117*4882a593Smuzhiyunif [ -d "\$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
118*4882a593Smuzhiyun    for envfile in \$OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
119*4882a593Smuzhiyun	    . \$envfile
120*4882a593Smuzhiyun    done
121*4882a593Smuzhiyunfi
122*4882a593Smuzhiyunif [ -d "\$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
123*4882a593Smuzhiyun    for envfile in \$OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
124*4882a593Smuzhiyun	    . \$envfile
125*4882a593Smuzhiyun    done
126*4882a593Smuzhiyunfi
127*4882a593SmuzhiyunEOF
128*4882a593Smuzhiyun}
129*4882a593Smuzhiyun
130*4882a593Smuzhiyuntoolchain_create_post_relocate_script() {
131*4882a593Smuzhiyun	relocate_script=$1
132*4882a593Smuzhiyun	env_dir=$2
133*4882a593Smuzhiyun	rm -f $relocate_script
134*4882a593Smuzhiyun	touch $relocate_script
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	cat >> $relocate_script <<EOF
137*4882a593Smuzhiyunif [ -d "${SDKPATHNATIVE}/post-relocate-setup.d/" ]; then
138*4882a593Smuzhiyun	# Source top-level SDK env scripts in case they are needed for the relocate
139*4882a593Smuzhiyun	# scripts.
140*4882a593Smuzhiyun	for env_setup_script in ${env_dir}/environment-setup-*; do
141*4882a593Smuzhiyun		. \$env_setup_script
142*4882a593Smuzhiyun		status=\$?
143*4882a593Smuzhiyun		if [ \$status != 0 ]; then
144*4882a593Smuzhiyun			echo "\$0: Failed to source \$env_setup_script with status \$status"
145*4882a593Smuzhiyun			exit \$status
146*4882a593Smuzhiyun		fi
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun		for s in ${SDKPATHNATIVE}/post-relocate-setup.d/*; do
149*4882a593Smuzhiyun			if [ ! -x \$s ]; then
150*4882a593Smuzhiyun				continue
151*4882a593Smuzhiyun			fi
152*4882a593Smuzhiyun			\$s "\$1"
153*4882a593Smuzhiyun			status=\$?
154*4882a593Smuzhiyun			if [ \$status != 0 ]; then
155*4882a593Smuzhiyun				echo "post-relocate command \"\$s \$1\" failed with status \$status" >&2
156*4882a593Smuzhiyun				exit \$status
157*4882a593Smuzhiyun			fi
158*4882a593Smuzhiyun		done
159*4882a593Smuzhiyun	done
160*4882a593Smuzhiyun	rm -rf "${SDKPATHNATIVE}/post-relocate-setup.d"
161*4882a593Smuzhiyunfi
162*4882a593SmuzhiyunEOF
163*4882a593Smuzhiyun}
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun#we get the cached site config in the runtime
166*4882a593SmuzhiyunTOOLCHAIN_CONFIGSITE_NOCACHE = "${@' '.join(siteinfo_get_files(d)[0])}"
167*4882a593SmuzhiyunTOOLCHAIN_CONFIGSITE_SYSROOTCACHE = "${STAGING_DIR}/${MLPREFIX}${MACHINE}/${target_datadir}/${TARGET_SYS}_config_site.d"
168*4882a593SmuzhiyunTOOLCHAIN_NEED_CONFIGSITE_CACHE ??= "virtual/${MLPREFIX}libc ncurses"
169*4882a593SmuzhiyunDEPENDS += "${TOOLCHAIN_NEED_CONFIGSITE_CACHE}"
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun#This function create a site config file
172*4882a593Smuzhiyuntoolchain_create_sdk_siteconfig () {
173*4882a593Smuzhiyun	local siteconfig=$1
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun	rm -f $siteconfig
176*4882a593Smuzhiyun	touch $siteconfig
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	for sitefile in ${TOOLCHAIN_CONFIGSITE_NOCACHE} ; do
179*4882a593Smuzhiyun		cat $sitefile >> $siteconfig
180*4882a593Smuzhiyun	done
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun	#get cached site config
183*4882a593Smuzhiyun	for sitefile in ${TOOLCHAIN_NEED_CONFIGSITE_CACHE}; do
184*4882a593Smuzhiyun		# Resolve virtual/* names to the real recipe name using sysroot-providers info
185*4882a593Smuzhiyun		case $sitefile in virtual/*)
186*4882a593Smuzhiyun			sitefile=`echo $sitefile | tr / _`
187*4882a593Smuzhiyun			sitefile=`cat ${STAGING_DIR_TARGET}/sysroot-providers/$sitefile`
188*4882a593Smuzhiyun		esac
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun		if [ -r ${TOOLCHAIN_CONFIGSITE_SYSROOTCACHE}/${sitefile}_config ]; then
191*4882a593Smuzhiyun			cat ${TOOLCHAIN_CONFIGSITE_SYSROOTCACHE}/${sitefile}_config >> $siteconfig
192*4882a593Smuzhiyun		fi
193*4882a593Smuzhiyun	done
194*4882a593Smuzhiyun}
195*4882a593Smuzhiyun# The immediate expansion above can result in unwanted path dependencies here
196*4882a593Smuzhiyuntoolchain_create_sdk_siteconfig[vardepsexclude] = "TOOLCHAIN_CONFIGSITE_SYSROOTCACHE"
197*4882a593Smuzhiyun
198*4882a593Smuzhiyunpython __anonymous () {
199*4882a593Smuzhiyun    import oe.classextend
200*4882a593Smuzhiyun    deps = ""
201*4882a593Smuzhiyun    for dep in (d.getVar('TOOLCHAIN_NEED_CONFIGSITE_CACHE') or "").split():
202*4882a593Smuzhiyun        deps += " %s:do_populate_sysroot" % dep
203*4882a593Smuzhiyun        for variant in (d.getVar('MULTILIB_VARIANTS') or "").split():
204*4882a593Smuzhiyun            clsextend = oe.classextend.ClassExtender(variant, d)
205*4882a593Smuzhiyun            newdep = clsextend.extend_name(dep)
206*4882a593Smuzhiyun            deps += " %s:do_populate_sysroot" % newdep
207*4882a593Smuzhiyun    d.appendVarFlag('do_configure', 'depends', deps)
208*4882a593Smuzhiyun}
209