mirror of
https://git.yoctoproject.org/poky
synced 2026-02-09 02:03:04 +01:00
The gnu tar versions less than 1.24 pose a problem with the SDK extraction. A typical SDK will have hard links. The SDK is created with a newer version of tar but extracted with the host version of tar which may be much older. The specific defect is that older version of gnu tar do not properly handle the "--strip-components=" argument when processing hard links and the paths do not get properly truncated and hooked up with the corresponding real file payloads. This leads to errors like the following during the SDK install: tar: sysroots/qemux86-yocto-linux/usr/bin/getconf: Cannot hard link to `./opt/yocto/SDK-qemux86/sysroots/qemux86-yocto-linux/usr/bin/POSIX_V6_ILP32_OFFBIG': No such file or directory The simple way to work around the problem is to just not save the path information that is going to get chopped off anyway. This has the added benefit that it saves a small amount of space in the tar archive as well. (From OE-Core rev: 0f4112016bac07f0294f2a4d0fde4659c0fed2d2) Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
287 lines
9.3 KiB
Plaintext
287 lines
9.3 KiB
Plaintext
inherit meta toolchain-scripts
|
|
inherit populate_sdk_${IMAGE_PKGTYPE}
|
|
|
|
IMAGETESTCLASS = "${@oe.utils.ifelse(d.getVar('IMAGETEST'),'imagetest-' + (d.getVar('IMAGETEST') or ""),'')}"
|
|
inherit ${IMAGETESTCLASS}
|
|
|
|
SDK_DIR = "${WORKDIR}/sdk"
|
|
SDK_OUTPUT = "${SDK_DIR}/image"
|
|
SDK_DEPLOY = "${TMPDIR}/deploy/sdk"
|
|
|
|
SDKTARGETSYSROOT = "${SDKPATH}/sysroots/${MULTIMACH_TARGET_SYS}"
|
|
|
|
TOOLCHAIN_HOST_TASK ?= "nativesdk-packagegroup-sdk-host packagegroup-cross-canadian-${@' packagegroup-cross-canadian-'.join(all_multilib_tune_values(d, 'TRANSLATED_TARGET_ARCH').split())}"
|
|
TOOLCHAIN_HOST_TASK_ATTEMPTONLY ?= ""
|
|
TOOLCHAIN_TARGET_TASK ?= "packagegroup-core-standalone-sdk-target packagegroup-core-standalone-sdk-target-dbg"
|
|
TOOLCHAIN_TARGET_TASK_ATTEMPTONLY ?= ""
|
|
TOOLCHAIN_OUTPUTNAME ?= "${SDK_NAME}-toolchain-${DISTRO_VERSION}"
|
|
|
|
SDK_RDEPENDS = "${TOOLCHAIN_TARGET_TASK} ${TOOLCHAIN_HOST_TASK}"
|
|
SDK_DEPENDS = "virtual/fakeroot-native sed-native"
|
|
|
|
# We want the MULTIARCH_TARGET_SYS to point to the TUNE_PKGARCH, not PACKAGE_ARCH as it
|
|
# could be set to the MACHINE_ARCH
|
|
REAL_MULTIMACH_TARGET_SYS = "${TUNE_PKGARCH}${TARGET_VENDOR}-${TARGET_OS}"
|
|
|
|
PID = "${@os.getpid()}"
|
|
|
|
EXCLUDE_FROM_WORLD = "1"
|
|
|
|
SDK_PACKAGING_FUNC ?= "create_shar"
|
|
|
|
python () {
|
|
# If we don't do this we try and run the mapping hooks while parsing which is slow
|
|
# bitbake should really provide something to let us know this...
|
|
if bb.data.getVar('BB_WORKERCONTEXT', d, True) is not None:
|
|
runtime_mapping_rename("TOOLCHAIN_TARGET_TASK", d)
|
|
}
|
|
|
|
fakeroot python do_populate_sdk() {
|
|
bb.build.exec_func("populate_sdk_image", d)
|
|
|
|
# Handle multilibs in the SDK environment, siteconfig, etc files...
|
|
localdata = bb.data.createCopy(d)
|
|
|
|
# make sure we only use the WORKDIR value from 'd', or it can change
|
|
localdata.setVar('WORKDIR', d.getVar('WORKDIR', True))
|
|
|
|
# make sure we only use the SDKTARGETSYSROOT value from 'd'
|
|
localdata.setVar('SDKTARGETSYSROOT', d.getVar('SDKTARGETSYSROOT', True))
|
|
|
|
# Process DEFAULTTUNE
|
|
bb.build.exec_func("create_sdk_files", localdata)
|
|
|
|
variants = d.getVar("MULTILIB_VARIANTS", True) or ""
|
|
for item in variants.split():
|
|
# Load overrides from 'd' to avoid having to reset the value...
|
|
overrides = d.getVar("OVERRIDES", False) + ":virtclass-multilib-" + item
|
|
localdata.setVar("OVERRIDES", overrides)
|
|
bb.data.update_data(localdata)
|
|
bb.build.exec_func("create_sdk_files", localdata)
|
|
|
|
bb.build.exec_func("tar_sdk", d)
|
|
|
|
bb.build.exec_func(d.getVar("SDK_PACKAGING_FUNC", True), d)
|
|
}
|
|
|
|
fakeroot populate_sdk_image() {
|
|
rm -rf ${SDK_OUTPUT}
|
|
mkdir -p ${SDK_OUTPUT}
|
|
|
|
# populate_sdk_<image> is required to construct two images:
|
|
# SDK_ARCH-nativesdk - contains the cross compiler and associated tooling
|
|
# target - contains a target rootfs configured for the SDK usage
|
|
#
|
|
# the output of populate_sdk_<image> should end up in ${SDK_OUTPUT} it is made
|
|
# up of:
|
|
# ${SDK_OUTPUT}/<sdk_arch-nativesdk pkgs>
|
|
# ${SDK_OUTPUT}/${SDKTARGETSYSROOT}/<target pkgs>
|
|
|
|
populate_sdk_${IMAGE_PKGTYPE}
|
|
|
|
# Don't ship any libGL in the SDK
|
|
rm -rf ${SDK_OUTPUT}/${SDKPATHNATIVE}${libdir_nativesdk}/libGL*
|
|
|
|
# Can copy pstage files here
|
|
# target_pkgs=`cat ${SDK_OUTPUT}/${SDKTARGETSYSROOT}/var/lib/opkg/status | grep Package: | cut -f 2 -d ' '`
|
|
|
|
# Fix or remove broken .la files
|
|
#rm -f ${SDK_OUTPUT}/${SDKPATHNATIVE}/lib/*.la
|
|
rm -f ${SDK_OUTPUT}/${SDKPATHNATIVE}${libdir_nativesdk}/*.la
|
|
|
|
# Link the ld.so.cache file into the hosts filesystem
|
|
ln -s /etc/ld.so.cache ${SDK_OUTPUT}/${SDKPATHNATIVE}/etc/ld.so.cache
|
|
}
|
|
|
|
fakeroot create_sdk_files() {
|
|
# Setup site file for external use
|
|
toolchain_create_sdk_siteconfig ${SDK_OUTPUT}/${SDKPATH}/site-config-${REAL_MULTIMACH_TARGET_SYS}
|
|
|
|
toolchain_create_sdk_env_script ${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}
|
|
|
|
# Add version information
|
|
toolchain_create_sdk_version ${SDK_OUTPUT}/${SDKPATH}/version-${REAL_MULTIMACH_TARGET_SYS}
|
|
|
|
cp ${COREBASE}/scripts/relocate_sdk.py ${SDK_OUTPUT}/${SDKPATH}/
|
|
|
|
# Replace the ##DEFAULT_INSTALL_DIR## with the correct pattern.
|
|
# Escape special characters like '+' and '.' in the SDKPATH
|
|
escaped_sdkpath=$(echo ${SDKPATH} |sed -e "s:[\+\.]:\\\\\\\\\0:g")
|
|
sed -i -e "s:##DEFAULT_INSTALL_DIR##:$escaped_sdkpath:" ${SDK_OUTPUT}/${SDKPATH}/relocate_sdk.py
|
|
}
|
|
|
|
fakeroot tar_sdk() {
|
|
# Package it up
|
|
mkdir -p ${SDK_DEPLOY}
|
|
cd ${SDK_OUTPUT}/${SDKPATH}
|
|
tar --owner=root --group=root -cj --file=${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.tar.bz2 .
|
|
}
|
|
|
|
fakeroot create_shar() {
|
|
cat << "EOF" > ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh
|
|
#!/bin/bash
|
|
|
|
INST_ARCH=$(uname -m | sed -e "s/i[3-6]86/ix86/" -e "s/x86[-_]64/x86_64/")
|
|
SDK_ARCH=$(echo ${SDK_ARCH} | sed -e "s/i[5-6]86/ix86/")
|
|
|
|
if [ "$INST_ARCH" != "$SDK_ARCH" ]; then
|
|
echo "Error: Installation machine not supported!"
|
|
exit 1
|
|
fi
|
|
|
|
DEFAULT_INSTALL_DIR="${SDKPATH}"
|
|
SUDO_EXEC=""
|
|
target_sdk_dir=""
|
|
answer=""
|
|
while getopts ":yd:" OPT; do
|
|
case $OPT in
|
|
y)
|
|
answer="Y"
|
|
[ "$target_sdk_dir" = "" ] && target_sdk_dir=$DEFAULT_INSTALL_DIR
|
|
;;
|
|
d)
|
|
target_sdk_dir=$OPTARG
|
|
;;
|
|
*)
|
|
echo "Usage: $(basename $0) [-y] [-d <dir>]"
|
|
echo " -y Automatic yes to all prompts"
|
|
echo " -d <dir> Install the SDK to <dir>"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
printf "Enter target directory for SDK (default: $DEFAULT_INSTALL_DIR): "
|
|
if [ "$target_sdk_dir" = "" ]; then
|
|
read target_sdk_dir
|
|
[ "$target_sdk_dir" = "" ] && target_sdk_dir=$DEFAULT_INSTALL_DIR
|
|
else
|
|
echo "$target_sdk_dir"
|
|
fi
|
|
|
|
eval target_sdk_dir=$target_sdk_dir
|
|
if [ -d $target_sdk_dir ]; then
|
|
target_sdk_dir=$(cd $target_sdk_dir; pwd)
|
|
else
|
|
target_sdk_dir=$(readlink -m $target_sdk_dir)
|
|
fi
|
|
|
|
if [ -e "$target_sdk_dir/environment-setup-${REAL_MULTIMACH_TARGET_SYS}" ]; then
|
|
echo "The directory \"$target_sdk_dir\" already contains a SDK for this architecture."
|
|
printf "If you continue, existing files will be overwritten! Proceed[y/N]?"
|
|
|
|
default_answer="n"
|
|
else
|
|
printf "You are about to install the SDK to \"$target_sdk_dir\". Proceed[Y/n]?"
|
|
|
|
default_answer="y"
|
|
fi
|
|
|
|
if [ "$answer" = "" ]; then
|
|
read answer
|
|
[ "$answer" = "" ] && answer="$default_answer"
|
|
else
|
|
echo $answer
|
|
fi
|
|
|
|
if [ "$answer" != "Y" -a "$answer" != "y" ]; then
|
|
echo "Installation aborted!"
|
|
exit 1
|
|
fi
|
|
|
|
# Try to create the directory (this will not succeed if user doesn't have rights)
|
|
mkdir -p $target_sdk_dir >/dev/null 2>&1
|
|
|
|
# if don't have the right to access dir, gain by sudo
|
|
if [ ! -x $target_sdk_dir -o ! -w $target_sdk_dir -o ! -r $target_sdk_dir ]; then
|
|
SUDO_EXEC=$(which "sudo")
|
|
if [ -z $SUDO_EXEC ]; then
|
|
echo "No command 'sudo' found, please install sudo first. Abort!"
|
|
exit 1
|
|
fi
|
|
|
|
# test sudo could gain root right
|
|
$SUDO_EXEC pwd >/dev/null 2>&1
|
|
[ $? -ne 0 ] && echo "Sorry, you are not allowed to execute as root." && exit 1
|
|
|
|
# now that we have sudo rights, create the directory
|
|
$SUDO_EXEC mkdir -p $target_sdk_dir >/dev/null 2>&1
|
|
fi
|
|
|
|
payload_offset=$(($(grep -na -m1 "^MARKER:$" $0|cut -d':' -f1) + 1))
|
|
|
|
printf "Extracting SDK..."
|
|
tail -n +$payload_offset $0| $SUDO_EXEC tar xj -C $target_sdk_dir
|
|
echo "done"
|
|
|
|
printf "Setting it up..."
|
|
# fix environment paths
|
|
for env_setup_script in `ls $target_sdk_dir/environment-setup-*`; do
|
|
$SUDO_EXEC sed -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:g" -i $env_setup_script
|
|
done
|
|
|
|
# fix dynamic loader paths in all ELF SDK binaries
|
|
native_sysroot=$($SUDO_EXEC cat $env_setup_script |grep OECORE_NATIVE_SYSROOT|cut -d'=' -f2|tr -d '"')
|
|
dl_path=$($SUDO_EXEC find $native_sysroot/lib -name "ld-linux*")
|
|
if [ "$dl_path" = "" ] ; then
|
|
echo "SDK could not be set up. Relocate script unable to find ld-linux.so. Abort!"
|
|
exit 1
|
|
fi
|
|
executable_files=$($SUDO_EXEC find $native_sysroot -type f -perm +111)
|
|
$SUDO_EXEC ${env_setup_script%/*}/relocate_sdk.py $target_sdk_dir $dl_path $executable_files
|
|
if [ $? -ne 0 ]; then
|
|
echo "SDK could not be set up. Relocate script failed. Abort!"
|
|
exit 1
|
|
fi
|
|
|
|
# replace ${SDKPATH} with the new prefix in all text files: configs/scripts/etc
|
|
$SUDO_EXEC find $native_sysroot -type f -exec file '{}' \;|grep ":.*\(ASCII\|script\|source\).*text"|cut -d':' -f1|$SUDO_EXEC xargs sed -i -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:g"
|
|
|
|
# change all symlinks pointing to ${SDKPATH}
|
|
for l in $($SUDO_EXEC find $native_sysroot -type l); do
|
|
$SUDO_EXEC ln -sfn $(readlink $l|$SUDO_EXEC sed -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:") $l
|
|
done
|
|
|
|
echo done
|
|
|
|
# delete the relocating script, so that user is forced to re-run the installer
|
|
# if he/she wants another location for the sdk
|
|
$SUDO_EXEC rm ${env_setup_script%/*}/relocate_sdk.py
|
|
|
|
echo "SDK has been successfully set up and is ready to be used."
|
|
|
|
exit 0
|
|
|
|
MARKER:
|
|
EOF
|
|
# append the SDK tarball
|
|
cat ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.tar.bz2 >> ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.sh
|
|
|
|
# delete the old tarball, we don't need it anymore
|
|
rm ${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.tar.bz2
|
|
}
|
|
|
|
populate_sdk_log_check() {
|
|
for target in $*
|
|
do
|
|
lf_path="`dirname ${BB_LOGFILE}`/log.do_$target.${PID}"
|
|
|
|
echo "log_check: Using $lf_path as logfile"
|
|
|
|
if test -e "$lf_path"
|
|
then
|
|
${IMAGE_PKGTYPE}_log_check $target $lf_path
|
|
else
|
|
echo "Cannot find logfile [$lf_path]"
|
|
fi
|
|
echo "Logfile is clean"
|
|
done
|
|
}
|
|
|
|
do_populate_sdk[dirs] = "${TOPDIR}"
|
|
do_populate_sdk[nostamp] = "1"
|
|
do_populate_sdk[depends] += "${@' '.join([x + ':do_populate_sysroot' for x in d.getVar('SDK_DEPENDS', True).split()])}"
|
|
do_populate_sdk[rdepends] = "${@' '.join([x + ':do_populate_sysroot' for x in d.getVar('SDK_RDEPENDS', True).split()])}"
|
|
do_populate_sdk[recrdeptask] = "do_package_write"
|
|
addtask populate_sdk
|