Skip to content

Commit

Permalink
Determine build tools & args based on yocto sdk env setup script (#19369
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

if the value of shell env IMX_SDK_ROOT is "IMX_SDK_ROOT", then it is in
CI test, use the default value from 5.10 5.10-hardknott to pass the
test.

Change-Id: I3e2a30f56a95bb13cbf43855c8edeeb9e63469eb
Signed-off-by: faqiang.zhu <faqiang.zhu@nxp.com>

Restyled by shellharden

Restyled by shfmt

Restyled by autopep8
  • Loading branch information
FaqiangZhu-nxp authored and pull[bot] committed Aug 25, 2022
1 parent 278e35f commit 3264212
Show file tree
Hide file tree
Showing 3 changed files with 184 additions and 59 deletions.
101 changes: 87 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,101 @@ 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:
if self.SysRootPath('IMX_SDK_ROOT') == 'IMX_SDK_ROOT':
# CI test, use default value
target_cpu = 'arm64'
arm_arch = 'armv8-a'
sdk_target_sysroot = os.path.join(self.SysRootPath('IMX_SDK_ROOT'), 'sysroots/cortexa53-crypto-poky-linux')
cross_compile = 'aarch64-poky-linux'
cc = 'aarch64-poky-linux-gcc'
cxx = 'aarch64-poky-linux-g++'
else:
raise Exception('the value of env IMX_SDK_ROOT is not a valid path.')
else:
for entry in entries:
if entry.startswith(r'environment-setup-'):
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.')
else:

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
Loading

0 comments on commit 3264212

Please sign in to comment.