Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions scripts/docker-run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,21 @@ set -e

SOF_TOP="$(cd "$(dirname "$0")"/.. && /bin/pwd)"

# Log the container version. Especially useful when forgetting to update
# the 'sof' shortcut.
docker images sof
# Log container versions
for rep in sof thesofproject/sof; do
docker images --digests "$rep"
done

if tty --quiet; then
SOF_DOCKER_RUN="$SOF_DOCKER_RUN --tty"
fi

# Not fatal, just a warning to allow other "creative" solutions.
# TODO: fix this with 'adduser' like in zephyr/docker-build.sh
test "$(id -n)" = 1001 ||
>&2 printf "Warning: this script should be run as user ID 1001 to match the container\n"

set -x
docker run -i -v "${SOF_TOP}":/home/sof/work/sof.git \
-v "${SOF_TOP}":/home/sof/work/sof-bind-mount-DO-NOT-DELETE \
--env CMAKE_BUILD_TYPE \
Expand Down
50 changes: 32 additions & 18 deletions scripts/xtensa-build-zephyr.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ usage: $0 [options] [ platform(s) ] [ -- cmake arguments ]
Incompatible with -p. To stop after downloading Zephyr, do not
pass any platform or cmake argument.

-u Initial Zephyr remote for the -c option. Default value:
https://github.com/zephyrproject-rtos/zephyr

-z Initial Zephyr git ref for the -c option. Can be a branch, tag,
full SHA1 in a fork, magic pull/12345/merge,... anything as long as
it is fetchable from https://github.com/zephyrproject-rtos/zephyr/
Expand All @@ -74,6 +77,8 @@ usage: $0 [options] [ platform(s) ] [ -- cmake arguments ]
sof/ and zephyr-project/ directories are not nested in one
another.

-v Verbose Makefile log

This script supports XtensaTools but only when installed in a specific
directory structure, example:

Expand Down Expand Up @@ -111,18 +116,25 @@ zephyr_fetch_and_switch()
# link back to sof/
west_init_update()
{
local init_ref="$1"

# Or, we could have a default value:
# init_ref=${1:-811a09bd8305}

git clone --depth=5 https://github.com/zephyrproject-rtos/zephyr \
"$WEST_TOP"/zephyr
# Default Zephyr remote and branch if nothing passed on the
# command line.
local init_remote="${1:-https://github.com/thesofproject/zephyr}"

# This can be a branch, a 40-digit SHA or empty to fetch the
# default branch
local init_ref="${2:-sof/stable-v2.0}"

# git fetch accepts anything, even 40-digits SHA but git clone is
# less flexible. So we git clone the default branch first to get
# started and then we switch to any 'z_ref' thanks to git fetch.
( set -x
git clone --depth=5 "$init_remote" "$WEST_TOP"/zephyr
)

# To keep things simple, this moves to a detached HEAD even when
# init_ref is a (remote) branch.
test -z "$init_ref" ||
zephyr_fetch_and_switch origin "${init_ref}"
zephyr_fetch_and_switch "${init_remote}" "${init_ref}"

# This shows how to point CI at any Zephyr commit from anywhere
# and to run all tests on it. Simply edit remote and reference,
Expand All @@ -134,9 +146,6 @@ west_init_update()
# zephyr_fetch_and_switch origin pull/38374/head
# zephyr_fetch_and_switch origin 19d5448ec117fde8076bec4d0e61da53147f3315

# SOF2.0 release uses this commit, verified in 2021-12-03 daily test
zephyr_fetch_and_switch origin fd089b361d8aebbcb49cca989444aaeb0b6fbb4d

# SECURITY WARNING for reviewers: never allow unknown code from
# unknown submitters on any CI system.

Expand Down Expand Up @@ -244,6 +253,9 @@ build_platforms()
# show a confusing error.
/bin/pwd

local verbose
[ -z "$BUILD_VERBOSE" ] || verbose=-v

if test -e "$bdir/build.ninja" || test -e "$bdir/Makefile"; then
test -z "${CMAKE_ARGS+defined}" ||
die 'Cannot re-define CMAKE_ARGS, you must delete %s first\n' \
Expand All @@ -252,10 +264,10 @@ build_platforms()
# CMAKE_ARGS this _not_ does force CMake to re-run and passing
# a different board by mistake is very nicely caught by west.
set -x
west build --build-dir "$bdir" --board "$PLAT_CONFIG"
west $verbose build --build-dir "$bdir" --board "$PLAT_CONFIG"
else
set -x
west build --build-dir "$bdir" --board "$PLAT_CONFIG" \
west $verbose build --build-dir "$bdir" --board "$PLAT_CONFIG" \
zephyr/samples/subsys/audio/sof \
-- "${CMAKE_ARGS[@]}"
fi
Expand Down Expand Up @@ -297,18 +309,20 @@ build_platforms()
parse_args()
{
local zeproj
unset zephyr_ref
unset zephyr_remote zephyr_ref
local OPTIND=1

# Parse -options
while getopts "acz:j:k:p:" OPTION; do
while getopts "acu:z:j:k:p:v" OPTION; do
case "$OPTION" in
a) PLATFORMS=("${DEFAULT_PLATFORMS[@]}") ;;
c) DO_CLONE=yes ;;
u) zephyr_remote="$OPTARG" ;;
z) zephyr_ref="$OPTARG" ;;
j) BUILD_JOBS="$OPTARG" ;;
k) RIMAGE_KEY_OPT="$OPTARG" ;;
p) zeproj="$OPTARG" ;;
v) BUILD_VERBOSE=true ;;
*) print_usage; exit 1 ;;
esac
done
Expand All @@ -322,8 +336,8 @@ parse_args()
die 'Cannot use -p with -c, -c supports %s only' "${SOF_TOP}/zephyrproject"
fi

if [ -n "$zephyr_ref" ] && [ -z "$DO_CLONE" ]; then
die '%s' '-z without -c makes no sense'
if [ -n "$zephyr_remote" -o -n "$zephyr_ref" ] && [ -z "$DO_CLONE" ]; then
die '%s' '-u or -z without -c makes no sense'
fi

if [ -n "$zeproj" ]; then
Expand Down Expand Up @@ -401,7 +415,7 @@ see https://docs.zephyrproject.org/latest/getting_started/index.html"
# Resolve symlinks
mkdir "$zep"; WEST_TOP=$( cd "$zep" && /bin/pwd )

west_init_update "${zephyr_ref}"
west_init_update "${zephyr_remote}" "${zephyr_ref}"

else
# Look for Zephyr and define WEST_TOP
Expand Down
53 changes: 47 additions & 6 deletions zephyr/docker-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,58 @@ set -x

unset ZEPHYR_BASE

# Make sure we're in the right place; chgrp -R below.
# Make sure we're in the right place.
test -e ./scripts/xtensa-build-zephyr.sh

sudo apt-get update
sudo apt-get -y install tree


# See https://stackoverflow.com/questions/35291520/docker-and-userns-remap-how-to-manage-volume-permissions-to-share-data-betwee + many others
exec_as_sof_uid()
{
local sof_uid; sof_uid="$(stat --printf='%u' .)"
local current_uid; current_uid="$(id -u)"
if test "$current_uid" = "$sof_uid"; then
return 0
fi

# Add new container user matching the host user owning the SOF
# checkout
local sof_user; sof_user="$(id "$sof_uid")" || {
sof_user=sof_zephyr_docker_builder

local sof_guid; sof_guid="$(stat --printf='%g' .)"

getent group "$sof_guid" ||
sudo groupadd -g "$sof_guid" sof_zephyr_docker_group

sudo useradd -m -u "$sof_uid" -g "$sof_guid" "$sof_user"

local current_user; current_user="$(id -un)"

# Copy sudo permissions just in case the build needs it
sudo sed -e "s/$current_user/$sof_user/" /etc/sudoers.d/"$current_user" |
sudo tee -a /etc/sudoers.d/"$sof_user"
sudo chmod --reference=/etc/sudoers.d/"$current_user" \
/etc/sudoers.d/"$sof_user"
}

# Safety delay: slower infinite loops are much better
sleep 0.5

# Double sudo to work around some funny restriction in
# zephyr-build:/etc/sudoers: 'user' can do anything but... only as
# root.
sudo sudo -u "$sof_user" "$0" "$@"
exit "$?"
}

exec_as_sof_uid "$@"

# Work in progress: move more code to a function
# https://github.com/thesofproject/sof-test/issues/740

# As of container version 0.18.4,
# https://github.com/zephyrproject-rtos/docker-image/blob/master/Dockerfile
# installs two SDKs: ZSDK_VERSION=0.12.4 and ZSDK_ALT_VERSION=0.13.1
Expand All @@ -31,10 +77,5 @@ ln -s /opt/toolchains/zephyr-sdk-* ~/
if test -e zephyrproject; then
./scripts/xtensa-build-zephyr.sh -a "$@"
else
# Matches docker.io/zephyrprojectrtos/zephyr-build:latest gid
ls -ln | head
stat .
sudo chgrp -R 1000 .
sudo chmod -R g+rwX .
./scripts/xtensa-build-zephyr.sh -a -c "$@"
fi