Skip to content

Commit

Permalink
Determine build tools & args based on yocto sdk env setup script
Browse files Browse the repository at this point in the history
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 <[email protected]>

Restyled by shellharden

Restyled by shfmt

Restyled by autopep8
  • Loading branch information
FaqiangZhu-nxp committed Jun 14, 2022
1 parent e81917b commit d15553f
Show file tree
Hide file tree
Showing 2 changed files with 162 additions and 23 deletions.
91 changes: 77 additions & 14 deletions scripts/build/builders/imx.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
# limitations under the License.

import os
import re
import shlex
from enum import Enum, auto

from .gn import GnBuilder
Expand Down Expand Up @@ -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

Expand Down
94 changes: 85 additions & 9 deletions scripts/examples/imxlinux_example.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,103 @@

set -e
set -x
if [ "$#" != 2 ]; then
if [ "$#" != 2 && "$#" != 3 ]; then
exit -1
fi

source "$(dirname "$0")/../../scripts/activate.sh"

if [ "$IMX_SDK_ROOT" = "" ]; then
echo "the Yocto SDK path is not specified with the shell env IMX_SDK_ROOT"
if [ "$IMX_SDK_ROOT" = "" -o ! -d "$IMX_SDK_ROOT" ]; then
echo "the Yocto SDK path is not specified with the shell env IMX_SDK_ROOT or an invalid path is specified"
exit -1
fi
env

entries="$(echo "$(ls "$IMX_SDK_ROOT")" | tr -s '\n' ',')"
IFS=',' read -ra entry_array <<<"$entries"
for entry in "${entry_array[@]}"; 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"

0 comments on commit d15553f

Please sign in to comment.