From 17eb38b9ae87af5c71fb5baeed50a8d0b5b2da8c Mon Sep 17 00:00:00 2001 From: "faqiang.zhu" Date: Wed, 8 Jun 2022 17:01:54 +0800 Subject: [PATCH] Determine build tools & args based on yocto sdk env setup script Previously, the yocto SDK for i.MX 8M devices of version 5.10-hardknott is the only one to be supported, the build tools and arguments are hard-coded. Now to support different versions of SDKs for different devices, read from the SDK env setup script to get info about build tools and arguments. env PKG_CONFIG_PATH is removed because with the gn arg sysroot correctly set the package config path info can be retrieved automatically in the build system. For debug build, to eliminate warnings, optimize_debug is set. With this patch applied, example commands to build the binaries are: export IMX_SDK_ROOT=/opt/fsl-imx-xwayland/5.15-kirkstone source scripts/activate.sh ./scripts/build/build_examples.py --target imx-all-clusters-app build ./scripts/build/build_examples.py --target \ imx-all-clusters-app-release build ./scripts/examples/imxlinux_example.sh \ examples/all-clusters-app/linux \ examples/all-clusters-app/linux/out/aarch64 ./scripts/examples/imxlinux_example.sh \ examples/all-clusters-app/linux \ examples/all-clusters-app/linux/out/aarch64 debug Change-Id: I3e2a30f56a95bb13cbf43855c8edeeb9e63469eb Signed-off-by: faqiang.zhu Restyled by shellharden Restyled by shfmt Restyled by autopep8 --- scripts/build/builders/imx.py | 91 +++++++++++++++++++++++----- scripts/examples/imxlinux_example.sh | 88 ++++++++++++++++++++++++--- 2 files changed, 158 insertions(+), 21 deletions(-) diff --git a/scripts/build/builders/imx.py b/scripts/build/builders/imx.py index 9118066f5d0d05..f1f063b1e56230 100644 --- a/scripts/build/builders/imx.py +++ b/scripts/build/builders/imx.py @@ -13,6 +13,8 @@ # limitations under the License. import os +import re +import shlex from enum import Enum, auto from .gn import GnBuilder @@ -74,30 +76,91 @@ def __init__(self, self.release = release self.app = app - def GnBuildEnv(self): - return { - 'PKG_CONFIG_PATH': self.SysRootPath('IMX_SDK_ROOT') + '/sysroots/cortexa53-crypto-poky-linux/lib/aarch64-linux-gnu/pkgconfig', - } - def GnBuildArgs(self): + try: + entries = os.listdir(self.SysRootPath('IMX_SDK_ROOT')) + except FileNotFoundError: + raise Exception('the value of env IMX_SDK_ROOT is not a valid path.') + else: + for entry in entries: + if re.match(r'^environment-setup-', entry): + env_setup_script = entry + break + + try: + env_setup_script + except NameError: + raise Exception('The SDK environment setup script is not found, make sure the env IMX_SDK_ROOT is correctly set.') + + with open(os.path.join(self.SysRootPath('IMX_SDK_ROOT'), env_setup_script), 'r') as env_setup_script_fd: + lines = env_setup_script_fd.readlines() + for line in lines: + line = line.strip('\n') + m = re.match(r'^\s*export\s+SDKTARGETSYSROOT=(.*)', line) + if m: + sdk_target_sysroot = shlex.split(m.group(1))[0] + + m = re.match(r'^\s*export\s+CC=(.*)', line) + if m: + cc = shlex.split(m.group(1))[0] + m = re.match(r'^\s*export\s+CXX=(.*)', line) + if m: + cxx = shlex.split(m.group(1))[0] + + m = re.match(r'^\s*export\s+ARCH=(.*)', line) + if m: + target_cpu = shlex.split(m.group(1))[0] + if target_cpu == 'arm64': + arm_arch = 'armv8-a' + elif target_cpu == 'arm': + arm_arch = 'armv7ve' + else: + raise Exception('ARCH should be arm64 or arm in the SDK environment setup script.') + + m = re.match(r'^\s*export\s+CROSS_COMPILE=(.*)', line) + if m: + cross_compile = shlex.split(m.group(1))[0][:-1] + + try: + sdk_target_sysroot + except NameError: + raise Exception('SDKTARGETSYSROOT is not found in the SDK environment setup script.') + else: + try: + cc + cxx + except NameError: + raise Exception('CC and/or CXX are not found in the SDK environment setup script.') + else: + cc = cc.replace('$SDKTARGETSYSROOT', sdk_target_sysroot) + cxx = cxx.replace('$SDKTARGETSYSROOT', sdk_target_sysroot) + try: + target_cpu + cross_compile + except NameError: + raise Exception('ARCH and/or CROSS_COMPILE are not found in the SDK environment setup script.') + args = [ + 'treat_warnings_as_errors=false', 'target_os="linux"', - 'target_cpu="arm64"', - 'arm_arch="armv8-a"', + 'target_cpu="%s"' % target_cpu, + 'arm_arch="%s"' % arm_arch, 'import(\"//build_overrides/build.gni\")', 'custom_toolchain=\"${build_root}/toolchain/custom\"', - 'sysroot="%s/sysroots/cortexa53-crypto-poky-linux"' % self.SysRootPath('IMX_SDK_ROOT'), + 'sysroot="%s"' % sdk_target_sysroot, 'target_cflags=[ "-DCHIP_DEVICE_CONFIG_WIFI_STATION_IF_NAME=\\"mlan0\\"", "-DCHIP_DEVICE_CONFIG_LINUX_DHCPC_CMD=\\"udhcpc -b -i %s \\"" ]', - 'target_cc="%s/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc"' % self.SysRootPath( - 'IMX_SDK_ROOT'), - 'target_cxx="%s/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++"' % self.SysRootPath( - 'IMX_SDK_ROOT'), - 'target_ar="%s/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-ar"' % self.SysRootPath( - 'IMX_SDK_ROOT'), + 'target_cc="%s/sysroots/x86_64-pokysdk-linux/usr/bin/%s/%s"' % (self.SysRootPath('IMX_SDK_ROOT'), cross_compile, + cc), + 'target_cxx="%s/sysroots/x86_64-pokysdk-linux/usr/bin/%s/%s"' % (self.SysRootPath('IMX_SDK_ROOT'), cross_compile, + cxx), + 'target_ar="%s/sysroots/x86_64-pokysdk-linux/usr/bin/%s/%s-ar"' % (self.SysRootPath('IMX_SDK_ROOT'), cross_compile, + cross_compile), ] if self.release: args.append('is_debug=false') + else: + args.append('optimize_debug=true') return args diff --git a/scripts/examples/imxlinux_example.sh b/scripts/examples/imxlinux_example.sh index e0ac39bd13c289..cb8d2e6d38a9af 100755 --- a/scripts/examples/imxlinux_example.sh +++ b/scripts/examples/imxlinux_example.sh @@ -18,7 +18,7 @@ set -e set -x -if [ "$#" != 2 ]; then +if [ "$#" != 2 && "$#" != 3 ]; then exit -1 fi @@ -30,15 +30,89 @@ if [ "$IMX_SDK_ROOT" = "" ]; then fi env +for entry in $(ls "$IMX_SDK_ROOT"); do + if [ "$(echo "$entry" | grep -E "^environment-setup-")" != "" ]; then + env_setup_script=$entry + break + fi +done + +if [ -z "$env_setup_script" ]; then + echo "The SDK environment setup script is not found, make sure the env IMX_SDK_ROOT is correctly set." + exit 1 +fi + +while read line; do + # trim the potential whitespaces + line=$(echo "$line" | xargs) + + if [ "$(echo "$line" | grep -E "^export SDKTARGETSYSROOT=")" != "" ]; then + sdk_target_sysroot=${line#"export SDKTARGETSYSROOT="} + fi + + if [ "$(echo "$line" | grep -E "^export CC=")" != "" ]; then + cc=${line#"export CC="} + cc=${cc#"\""} + cc=${cc%"\""} + cc=${cc/"\$SDKTARGETSYSROOT"/$sdk_target_sysroot} + fi + + if [ "$(echo "$line" | grep -E "^export CXX=")" != "" ]; then + cxx=${line#"export CXX="} + cxx=${cxx#"\""} + cxx=${cxx%"\""} + cxx=${cxx/"\$SDKTARGETSYSROOT"/$sdk_target_sysroot} + fi + + if [ "$(echo "$line" | grep -E "^export ARCH=")" != "" ]; then + target_cpu=${line#"export ARCH="} + + if [ "$target_cpu" = "arm64" ]; then + arm_arch="armv8-a" + elif [ "$target_cpu" = "arm" ]; then + arm_arch="armv7ve" + else + echo "ARCH should be arm64 or arm in the SDK environment setup script." + exit 1 + fi + fi + + if [ "$(echo "$line" | grep -E "^export CROSS_COMPILE=")" != "" ]; then + cross_compile=${line#"export CROSS_COMPILE="} + cross_compile=${cross_compile%"-"} + fi +done <"$IMX_SDK_ROOT/$env_setup_script" + +if [ -z "$sdk_target_sysroot" ]; then + echo "SDKTARGETSYSROOT is not found in the SDK environment setup script." + exit 1 +fi + +if [ -z "$cc" -o -z "$cxx" ]; then + echo "CC and/or CXX are not found in the SDK environment setup script." + exit 1 +fi + +if [ -z "$target_cpu" -o -z "$cross_compile" ]; then + echo "ARCH and/or CROSS_COMPILE are not found in the SDK environment setup script." + exit 1 +fi + +release_build=true +if [ "$3" = "debug" ]; then + release_build=false +fi + PLATFORM_CFLAGS='-DCHIP_DEVICE_CONFIG_WIFI_STATION_IF_NAME=\"mlan0\"", "-DCHIP_DEVICE_CONFIG_LINUX_DHCPC_CMD=\"udhcpc -b -i %s \"' -PKG_CONFIG_PATH=$IMX_SDK_ROOT/sysroots/cortexa53-crypto-poky-linux/lib/aarch64-linux-gnu/pkgconfig \ - gn gen --check --fail-on-unused-args --root="$1" "$2" --args="target_os=\"linux\" target_cpu=\"arm64\" arm_arch=\"armv8-a\" +gn gen --check --fail-on-unused-args --root="$1" "$2" --args="target_os=\"linux\" target_cpu=\"$target_cpu\" arm_arch=\"$arm_arch\" +treat_warnings_as_errors=false import(\"//build_overrides/build.gni\") -sysroot=\"$IMX_SDK_ROOT/sysroots/cortexa53-crypto-poky-linux\" +sysroot=\"$sdk_target_sysroot\" target_cflags=[ \"$PLATFORM_CFLAGS\" ] custom_toolchain=\"\${build_root}/toolchain/custom\" -target_cc=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc\" -target_cxx=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++\" -target_ar=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-ar\"" +target_cc=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/$cross_compile/$cc\" +target_cxx=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/$cross_compile/$cxx\" +target_ar=\"$IMX_SDK_ROOT/sysroots/x86_64-pokysdk-linux/usr/bin/$cross_compile/$cross_compile-ar\" +$(if [ "$release_build" = "true" ]; then echo "is_debug=false"; else echo "optimize_debug=true"; fi)" ninja -C "$2"