Merge branch '2020-04-11-CI-further-improvements' into next

- Further clean up and improve our Azure/GitLab/Travis CI loops
This commit is contained in:
Tom Rini
2020-04-11 11:18:14 -04:00
14 changed files with 280 additions and 261 deletions

View File

@@ -52,7 +52,7 @@ jobs:
image: $(ci_runner_image)
options: $(container_option)
steps:
- script: cppcheck --force --quiet --inline-suppr .
- script: cppcheck -j$(nproc) --force --quiet --inline-suppr .
- job: htmldocs
displayName: 'Build HTML documentation'
@@ -136,10 +136,10 @@ jobs:
virtualenv -p /usr/bin/python3 /tmp/venv
. /tmp/venv/bin/activate
pip install pyelftools pytest
export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/sandbox_spl
export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl
export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt
export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}
./tools/buildman/buildman -o /tmp -P sandbox_spl
./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl
./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test
./tools/buildman/buildman -t
./tools/dtoc/dtoc -t
@@ -159,102 +159,78 @@ jobs:
matrix:
sandbox:
TEST_PY_BD: "sandbox"
BUILDMAN: "^sandbox$"
sandbox_clang:
TEST_PY_BD: "sandbox"
BUILDMAN: "^sandbox$"
OVERRIDE: "-O clang-7"
sandbox_spl:
TEST_PY_BD: "sandbox_spl"
TEST_PY_TEST_SPEC: "test_ofplatdata"
BUILDMAN: "^sandbox_spl$"
TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff"
sandbox_flattree:
TEST_PY_BD: "sandbox_flattree"
BUILDMAN: "^sandbox_flattree$"
evb_ast2500:
TEST_PY_BD: "evb-ast2500"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^evb-ast2500$"
vexpress_ca15_tc2:
TEST_PY_BD: "vexpress_ca15_tc2"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^vexpress_ca15_tc2$"
vexpress_ca9x4:
TEST_PY_BD: "vexpress_ca9x4"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^vexpress_ca9x4$"
integratorcp_cm926ejs:
TEST_PY_BD: "integratorcp_cm926ejs"
TEST_PY_ID: "--id qemu"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^integratorcp_cm926ejs$"
qemu_arm:
TEST_PY_BD: "qemu_arm"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_arm$"
qemu_arm64:
TEST_PY_BD: "qemu_arm64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_arm64$"
qemu_mips:
TEST_PY_BD: "qemu_mips"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips$"
qemu_mipsel:
TEST_PY_BD: "qemu_mipsel"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mipsel$"
qemu_mips64:
TEST_PY_BD: "qemu_mips64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips64$"
qemu_mips64el:
TEST_PY_BD: "qemu_mips64el"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips64el$"
qemu_ppce500:
TEST_PY_BD: "qemu-ppce500"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-ppce500$"
qemu_riscv32:
TEST_PY_BD: "qemu-riscv32"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv32$"
qemu_riscv64:
TEST_PY_BD: "qemu-riscv64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv64$"
qemu_riscv32_spl:
TEST_PY_BD: "qemu-riscv32_spl"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv32_spl$"
qemu_riscv64_spl:
TEST_PY_BD: "qemu-riscv64_spl"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv64_spl$"
qemu_x86:
TEST_PY_BD: "qemu-x86"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-x86$"
qemu_x86_64:
TEST_PY_BD: "qemu-x86_64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-x86_64$"
xilinx_zynq_virt:
TEST_PY_BD: "xilinx_zynq_virt"
TEST_PY_ID: "--id qemu"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^xilinx_zynq_virt$"
xilinx_versal_virt:
TEST_PY_BD: "xilinx_versal_virt"
TEST_PY_ID: "--id qemu"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^xilinx_versal_virt$"
xtfpga:
TEST_PY_BD: "xtfpga"
TEST_PY_ID: "--id qemu"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^xtfpga$"
steps:
- script: |
cat << EOF > test.sh
@@ -264,7 +240,6 @@ jobs:
export TEST_PY_BD="${TEST_PY_BD}"
export TEST_PY_ID="${TEST_PY_ID}"
export TEST_PY_TEST_SPEC="${TEST_PY_TEST_SPEC}"
export BUILDMAN="${BUILDMAN}"
export OVERRIDE="${OVERRIDE}"
EOF
cat << "EOF" >> test.sh
@@ -289,27 +264,15 @@ jobs:
fi
# the below corresponds to .gitlab-ci.yml "script"
cd ${WORK_DIR}
if [[ "${BUILDMAN}" != "" ]]; then
ret=0;
tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE} || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
exit $ret;
fi;
fi
export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD};
tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e --board ${TEST_PY_BD} ${OVERRIDE}
virtualenv -p /usr/bin/python3 /tmp/venv
. /tmp/venv/bin/activate
pip install -r test/py/requirements.txt
export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/${TEST_PY_BD};
export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
if [[ "${TEST_PY_BD}" != "" ]]; then
./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID} -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}" --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
ret=$?;
if [[ $ret -ne 0 ]]; then
exit $ret;
fi;
fi
# "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"} --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
# the below corresponds to .gitlab-ci.yml "after_script"
rm -rf /tmp/uboot-test-hooks /tmp/venv
EOF
@@ -443,9 +406,9 @@ jobs:
cat << "EOF" >> build.sh
if [[ "${BUILDMAN}" != "" ]]; then
ret=0;
tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE} || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
tools/buildman/buildman -o /tmp -P -W ${BUILDMAN} ${OVERRIDE} || ret=$?;
if [[ $ret -ne 0 ]]; then
tools/buildman/buildman -o /tmp -seP ${BUILDMAN};
exit $ret;
fi;
fi

View File

@@ -36,44 +36,28 @@ stages:
after_script:
- rm -rf /tmp/uboot-test-hooks /tmp/venv
script:
# From buildman, exit code 129 means warnings only. If we've been asked to
# use clang only do one configuration.
- if [[ "${BUILDMAN}" != "" ]]; then
ret=0;
tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE}|| ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
exit $ret;
fi;
fi
# "not a_test_which_does_not_exist" is a dummy -k parameter which will
# never prevent any test from running. That way, we can always pass
# "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
# value.
# If we've been asked to use clang only do one configuration.
- export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD}
- tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e
--board ${TEST_PY_BD} ${OVERRIDE}
- virtualenv -p /usr/bin/python3 /tmp/venv
- . /tmp/venv/bin/activate
- pip install -r test/py/requirements.txt
- export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/${TEST_PY_BD};
export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
# "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
- export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
if [[ "${TEST_PY_BD}" != "" ]]; then
./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
-k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
--build-dir "$UBOOT_TRAVIS_BUILD_DIR";
ret=$?;
if [[ $ret -ne 0 ]]; then
exit $ret;
fi;
fi;
./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
--build-dir "$UBOOT_TRAVIS_BUILD_DIR"
build all 32bit ARM platforms:
tags: [ 'all' ]
stage: world build
script:
- ret=0;
./tools/buildman/buildman -o /tmp -P -E arm -x aarch64 || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
./tools/buildman/buildman -o /tmp -sdeP;
./tools/buildman/buildman -o /tmp -P -E -W arm -x aarch64 || ret=$?;
if [[ $ret -ne 0 ]]; then
./tools/buildman/buildman -o /tmp -seP;
exit $ret;
fi;
@@ -85,9 +69,9 @@ build all 64bit ARM platforms:
- . /tmp/venv/bin/activate
- pip install pyelftools
- ret=0;
./tools/buildman/buildman -o /tmp -P -E aarch64 || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
./tools/buildman/buildman -o /tmp -sdeP;
./tools/buildman/buildman -o /tmp -P -E -W aarch64 || ret=$?;
if [[ $ret -ne 0 ]]; then
./tools/buildman/buildman -o /tmp -seP;
exit $ret;
fi;
@@ -96,9 +80,9 @@ build all PowerPC platforms:
stage: world build
script:
- ret=0;
./tools/buildman/buildman -o /tmp -P -E powerpc || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
./tools/buildman/buildman -o /tmp -sdeP;
./tools/buildman/buildman -o /tmp -P -E -W powerpc || ret=$?;
if [[ $ret -ne 0 ]]; then
./tools/buildman/buildman -o /tmp -seP;
exit $ret;
fi;
@@ -107,9 +91,9 @@ build all other platforms:
stage: world build
script:
- ret=0;
./tools/buildman/buildman -o /tmp -P -E -x arm,powerpc || ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
./tools/buildman/buildman -o /tmp -sdeP;
./tools/buildman/buildman -o /tmp -P -E -W -x arm,powerpc || ret=$?;
if [[ $ret -ne 0 ]]; then
./tools/buildman/buildman -o /tmp -seP;
exit $ret;
fi;
@@ -119,7 +103,7 @@ cppcheck:
tags: [ 'all' ]
stage: testsuites
script:
- cppcheck --force --quiet --inline-suppr .
- cppcheck -j$(nproc) --force --quiet --inline-suppr .
# search for TODO within source tree
grep TODO/FIXME/HACK:
@@ -176,10 +160,10 @@ Run binman, buildman, dtoc, Kconfig and patman testsuites:
virtualenv -p /usr/bin/python3 /tmp/venv;
. /tmp/venv/bin/activate;
pip install pyelftools pytest;
export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/sandbox_spl;
export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl;
export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
./tools/buildman/buildman -o /tmp -P sandbox_spl;
./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl;
./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test;
./tools/buildman/buildman -t;
./tools/dtoc/dtoc -t;
@@ -191,14 +175,12 @@ sandbox test.py:
tags: [ 'all' ]
variables:
TEST_PY_BD: "sandbox"
BUILDMAN: "^sandbox$"
<<: *buildman_and_testpy_dfn
sandbox with clang test.py:
tags: [ 'all' ]
variables:
TEST_PY_BD: "sandbox"
BUILDMAN: "^sandbox$"
OVERRIDE: "-O clang-7"
<<: *buildman_and_testpy_dfn
@@ -206,8 +188,7 @@ sandbox_spl test.py:
tags: [ 'all' ]
variables:
TEST_PY_BD: "sandbox_spl"
BUILDMAN: "^sandbox_spl$"
TEST_PY_TEST_SPEC: "test_ofplatdata"
TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff"
<<: *buildman_and_testpy_dfn
evb-ast2500 test.py:
@@ -215,14 +196,12 @@ evb-ast2500 test.py:
variables:
TEST_PY_BD: "evb-ast2500"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^evb-ast2500$"
<<: *buildman_and_testpy_dfn
sandbox_flattree test.py:
tags: [ 'all' ]
variables:
TEST_PY_BD: "sandbox_flattree"
BUILDMAN: "^sandbox_flattree$"
<<: *buildman_and_testpy_dfn
vexpress_ca15_tc2 test.py:
@@ -230,7 +209,6 @@ vexpress_ca15_tc2 test.py:
variables:
TEST_PY_BD: "vexpress_ca15_tc2"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^vexpress_ca15_tc2$"
<<: *buildman_and_testpy_dfn
vexpress_ca9x4 test.py:
@@ -238,7 +216,6 @@ vexpress_ca9x4 test.py:
variables:
TEST_PY_BD: "vexpress_ca9x4"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^vexpress_ca9x4$"
<<: *buildman_and_testpy_dfn
integratorcp_cm926ejs test.py:
@@ -247,7 +224,6 @@ integratorcp_cm926ejs test.py:
TEST_PY_BD: "integratorcp_cm926ejs"
TEST_PY_TEST_SPEC: "not sleep"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^integratorcp_cm926ejs$"
<<: *buildman_and_testpy_dfn
qemu_arm test.py:
@@ -255,7 +231,6 @@ qemu_arm test.py:
variables:
TEST_PY_BD: "qemu_arm"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_arm$"
<<: *buildman_and_testpy_dfn
qemu_arm64 test.py:
@@ -263,7 +238,6 @@ qemu_arm64 test.py:
variables:
TEST_PY_BD: "qemu_arm64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_arm64$"
<<: *buildman_and_testpy_dfn
qemu_mips test.py:
@@ -271,7 +245,6 @@ qemu_mips test.py:
variables:
TEST_PY_BD: "qemu_mips"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips$"
<<: *buildman_and_testpy_dfn
qemu_mipsel test.py:
@@ -279,7 +252,6 @@ qemu_mipsel test.py:
variables:
TEST_PY_BD: "qemu_mipsel"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mipsel$"
<<: *buildman_and_testpy_dfn
qemu_mips64 test.py:
@@ -287,7 +259,6 @@ qemu_mips64 test.py:
variables:
TEST_PY_BD: "qemu_mips64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips64$"
<<: *buildman_and_testpy_dfn
qemu_mips64el test.py:
@@ -295,7 +266,6 @@ qemu_mips64el test.py:
variables:
TEST_PY_BD: "qemu_mips64el"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu_mips64el$"
<<: *buildman_and_testpy_dfn
qemu-ppce500 test.py:
@@ -303,7 +273,6 @@ qemu-ppce500 test.py:
variables:
TEST_PY_BD: "qemu-ppce500"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-ppce500$"
<<: *buildman_and_testpy_dfn
qemu-riscv32 test.py:
@@ -311,7 +280,6 @@ qemu-riscv32 test.py:
variables:
TEST_PY_BD: "qemu-riscv32"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv32$"
<<: *buildman_and_testpy_dfn
qemu-riscv64 test.py:
@@ -319,7 +287,6 @@ qemu-riscv64 test.py:
variables:
TEST_PY_BD: "qemu-riscv64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv64$"
<<: *buildman_and_testpy_dfn
qemu-riscv32_spl test.py:
@@ -327,7 +294,6 @@ qemu-riscv32_spl test.py:
variables:
TEST_PY_BD: "qemu-riscv32_spl"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv32_spl$"
<<: *buildman_and_testpy_dfn
qemu-riscv64_spl test.py:
@@ -335,7 +301,6 @@ qemu-riscv64_spl test.py:
variables:
TEST_PY_BD: "qemu-riscv64_spl"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-riscv64_spl$"
<<: *buildman_and_testpy_dfn
qemu-x86 test.py:
@@ -343,7 +308,6 @@ qemu-x86 test.py:
variables:
TEST_PY_BD: "qemu-x86"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-x86$"
<<: *buildman_and_testpy_dfn
qemu-x86_64 test.py:
@@ -351,7 +315,6 @@ qemu-x86_64 test.py:
variables:
TEST_PY_BD: "qemu-x86_64"
TEST_PY_TEST_SPEC: "not sleep"
BUILDMAN: "^qemu-x86_64$"
<<: *buildman_and_testpy_dfn
xilinx_zynq_virt test.py:
@@ -360,7 +323,6 @@ xilinx_zynq_virt test.py:
TEST_PY_BD: "xilinx_zynq_virt"
TEST_PY_TEST_SPEC: "not sleep"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^xilinx_zynq_virt$"
<<: *buildman_and_testpy_dfn
xilinx_versal_virt test.py:
@@ -369,7 +331,6 @@ xilinx_versal_virt test.py:
TEST_PY_BD: "xilinx_versal_virt"
TEST_PY_TEST_SPEC: "not sleep"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^xilinx_versal_virt$"
<<: *buildman_and_testpy_dfn
xtfpga test.py:
@@ -378,5 +339,4 @@ xtfpga test.py:
TEST_PY_BD: "xtfpga"
TEST_PY_TEST_SPEC: "not sleep"
TEST_PY_ID: "--id qemu"
BUILDMAN: "^xtfpga$"
<<: *buildman_and_testpy_dfn

View File

@@ -204,46 +204,42 @@ script:
# Comments must be outside the command strings below, or the Travis parser
# will get confused.
#
# From buildman, exit code 129 means warnings only. If we've been asked to
# use clang only do one configuration.
# If we've been asked to use clang only do one configuration.
#
# Build a selection of boards if TEST_PY_BD is empty
- if [[ "${BUILDMAN}" != "" ]]; then
ret=0;
tools/buildman/buildman -P -E ${BUILDMAN} ${OVERRIDE}|| ret=$?;
if [[ $ret -ne 0 && $ret -ne 129 ]]; then
tools/buildman/buildman -sdeP ${BUILDMAN};
tools/buildman/buildman -P -E -W ${BUILDMAN} ${OVERRIDE};
if [[ $ret -ne 0 ]]; then
tools/buildman/buildman -seP ${BUILDMAN};
exit $ret;
fi;
fi
# "not a_test_which_does_not_exist" is a dummy -k parameter which will
# never prevent any test from running. That way, we can always pass
# "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
# value.
- export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/.bm-work/${TEST_PY_BD};
cp ~/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/;
cp ~/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/;
if [[ -e ~/grub_arm.efi ]]; then
cp ~/grub_arm.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_arm64.efi ]]; then
cp ~/grub_arm64.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_riscv32.efi ]]; then
cp ~/grub_riscv32.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_riscv64.efi ]]; then
cp ~/grub_riscv64.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ "${TEST_PY_BD}" != "" ]]; then
# Build just the one board needed for testing, if TEST_PY_BD is non-empty
# Note: "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
- if [[ "${TEST_PY_BD}" != "" ]]; then
export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/${TEST_PY_BD};
cp ~/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/;
cp ~/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/;
if [[ -e ~/grub_arm.efi ]]; then
cp ~/grub_arm.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_arm64.efi ]]; then
cp ~/grub_arm64.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_riscv32.efi ]]; then
cp ~/grub_riscv32.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
if [[ -e ~/grub_riscv64.efi ]]; then
cp ~/grub_riscv64.efi $UBOOT_TRAVIS_BUILD_DIR/;
fi;
tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e
--board ${TEST_PY_BD} ${OVERRIDE} || exit;
virtualenv -p /usr/bin/python3 /tmp/venv;
. /tmp/venv/bin/activate;
pip install -r test/py/requirements.txt;
./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
-k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
--build-dir "$UBOOT_TRAVIS_BUILD_DIR";
ret=$?;
if [[ $ret -ne 0 ]]; then
exit $ret;
fi;
${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
--build-dir "$UBOOT_TRAVIS_BUILD_DIR" || exit;
if [[ -n "${TEST_PY_TOOLS}" ]]; then
export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
@@ -452,7 +448,7 @@ matrix:
# static code analysis with cppcheck (we can add --enable=all later)
- name: "cppcheck"
script:
- cppcheck --force --quiet --inline-suppr .
- cppcheck -j$(nproc) --force --quiet --inline-suppr .
# build HTML documentation
- name: "htmldocs"
script:
@@ -489,131 +485,111 @@ matrix:
- name: "test/py sandbox"
env:
- TEST_PY_BD="sandbox"
BUILDMAN="^sandbox$"
TOOLCHAIN="i386"
- name: "test/py sandbox with clang"
env:
- TEST_PY_BD="sandbox"
BUILDMAN="^sandbox$"
OVERRIDE="-O clang-7"
- name: "test/py sandbox_spl"
env:
- TEST_PY_BD="sandbox_spl"
TEST_PY_TEST_SPEC="test_ofplatdata"
BUILDMAN="^sandbox$"
TEST_PY_TEST_SPEC="test_ofplatdata or test_handoff"
TOOLCHAIN="i386"
TEST_PY_TOOLS="yes"
- name: "test/py sandbox_flattree"
env:
- TEST_PY_BD="sandbox_flattree"
BUILDMAN="^sandbox_flattree$"
TOOLCHAIN="i386"
- name: "test/py evb-ast2500"
env:
- TEST_PY_BD="evb-ast2500"
TEST_PY_ID="--id qemu"
QEMU_TARGET="arm-softmmu"
BUILDMAN="^evb-ast2500$"
- name: "test/py vexpress_ca15_tc2"
env:
- TEST_PY_BD="vexpress_ca15_tc2"
TEST_PY_ID="--id qemu"
QEMU_TARGET="arm-softmmu"
BUILDMAN="^vexpress_ca15_tc2$"
- name: "test/py vexpress_ca9x4"
env:
- TEST_PY_BD="vexpress_ca9x4"
TEST_PY_ID="--id qemu"
QEMU_TARGET="arm-softmmu"
BUILDMAN="^vexpress_ca9x4$"
- name: "test/py integratorcp_cm926ejs"
env:
- TEST_PY_BD="integratorcp_cm926ejs"
TEST_PY_TEST_SPEC="not sleep"
TEST_PY_ID="--id qemu"
QEMU_TARGET="arm-softmmu"
BUILDMAN="^integratorcp_cm926ejs$"
- name: "test/py qemu_arm"
env:
- TEST_PY_BD="qemu_arm"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="arm-softmmu"
BUILDMAN="^qemu_arm$"
- name: "test/py qemu_arm64"
env:
- TEST_PY_BD="qemu_arm64"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="aarch64-softmmu"
BUILDMAN="^qemu_arm64$"
- name: "test/py qemu_mips"
env:
- TEST_PY_BD="qemu_mips"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="mips-softmmu"
BUILDMAN="^qemu_mips$"
TOOLCHAIN="mips"
- name: "test/py qemu_mipsel"
env:
- TEST_PY_BD="qemu_mipsel"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="mipsel-softmmu"
BUILDMAN="^qemu_mipsel$"
TOOLCHAIN="mips"
- name: "test/py qemu_mips64"
env:
- TEST_PY_BD="qemu_mips64"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="mips64-softmmu"
BUILDMAN="^qemu_mips64$"
TOOLCHAIN="mips"
- name: "test/py qemu_mips64el"
env:
- TEST_PY_BD="qemu_mips64el"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="mips64el-softmmu"
BUILDMAN="^qemu_mips64el$"
TOOLCHAIN="mips"
- name: "test/py qemu-ppce500"
env:
- TEST_PY_BD="qemu-ppce500"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="ppc-softmmu"
BUILDMAN="^qemu-ppce500$"
TOOLCHAIN="powerpc"
- name: "test/py qemu-riscv32"
env:
- TEST_PY_BD="qemu-riscv32"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="riscv32-softmmu"
BUILDMAN="^qemu-riscv32$"
TOOLCHAIN="riscv"
- name: "test/py qemu-riscv64"
env:
- TEST_PY_BD="qemu-riscv64"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="riscv64-softmmu"
BUILDMAN="^qemu-riscv64$"
TOOLCHAIN="riscv"
- name: "test/py qemu-riscv32_spl"
env:
- TEST_PY_BD="qemu-riscv32_spl"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="riscv32-softmmu"
BUILDMAN="^qemu-riscv32_spl$"
TOOLCHAIN="riscv"
- name: "test/py qemu-riscv64_spl"
env:
- TEST_PY_BD="qemu-riscv64_spl"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="riscv64-softmmu"
BUILDMAN="^qemu-riscv64_spl$"
TOOLCHAIN="riscv"
- name: "test/py qemu-x86"
env:
- TEST_PY_BD="qemu-x86"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="i386-softmmu"
BUILDMAN="^qemu-x86$"
TOOLCHAIN="i386"
BUILD_ROM="yes"
- name: "test/py qemu-x86_64"
@@ -621,7 +597,6 @@ matrix:
- TEST_PY_BD="qemu-x86_64"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="x86_64-softmmu"
BUILDMAN="^qemu-x86_64$"
TOOLCHAIN="i386"
BUILD_ROM="yes"
- name: "test/py xilinx_zynq_virt"
@@ -630,21 +605,18 @@ matrix:
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="arm-softmmu"
TEST_PY_ID="--id qemu"
BUILDMAN="^xilinx_zynq_virt$"
- name: "test/py xilinx_versal_virt"
env:
- TEST_PY_BD="xilinx_versal_virt"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="aarch64-softmmu"
TEST_PY_ID="--id qemu"
BUILDMAN="^xilinx_versal_virt$"
- name: "test/py xtfpga"
env:
- TEST_PY_BD="xtfpga"
TEST_PY_TEST_SPEC="not sleep"
QEMU_TARGET="xtensa-softmmu"
TEST_PY_ID="--id qemu"
BUILDMAN="^xtfpga$"
TOOLCHAIN="xtensa-dc233c-elf"
# TODO make it perfect ;-r

View File

@@ -15,11 +15,6 @@
#include <init.h>
#include <version.h>
/*
* Board-specific Platform code can reimplement show_boot_progress () if needed
*/
__weak void show_boot_progress(int val) {}
static void run_preboot_environment_command(void)
{
char *p;

View File

@@ -34,6 +34,16 @@ integers can only be built on 64-bit hosts.
Note that standalone/API support is not available at present.
Prerequisites
-------------
Here are some packages that are worth installing if you are doing sandbox or
tools development in U-Boot:
python3-pytest lzma lzma-alone lz4 python3 python3-virtualenv
libssl1.0-dev
Basic Operation
---------------

View File

@@ -138,6 +138,9 @@ command-line option; see the next section.
before running the tests. If using this option, make sure that any
environment variables required by the build process are already set, such as
`$CROSS_COMPILE`.
- `--buildman` indicates that `--build` should use buildman to build U-Boot.
There is no need to set $CROSS_COMPILE` in this case since buildman handles
it.
- `--build-dir` sets the directory containing the compiled U-Boot binaries.
If omitted, this is `${source_dir}/build-${board_type}`.
- `--result-dir` sets the directory to write results, such as log files,
@@ -333,7 +336,7 @@ PATH=$HOME/ubtest/bin:$PATH \
If you want the test script to compile U-Boot for you too, then you likely
need to set `$CROSS_COMPILE` to allow this, and invoke the test script as
follow:
follows:
```bash
CROSS_COMPILE=arm-none-eabi- \
@@ -342,6 +345,14 @@ CROSS_COMPILE=arm-none-eabi- \
./test/py/test.py --bd seaboard --build
```
or, using buildman to handle it:
```bash
PATH=$HOME/ubtest/bin:$PATH \
PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
./test/py/test.py --bd seaboard --build --buildman
```
## Writing tests
Please refer to the pytest documentation for details of writing pytest tests.

View File

@@ -70,6 +70,8 @@ def pytest_addoption(parser):
help='U-Boot board identity/instance')
parser.addoption('--build', default=False, action='store_true',
help='Compile U-Boot before running tests')
parser.addoption('--buildman', default=False, action='store_true',
help='Use buildman to build U-Boot (assuming --build is given)')
parser.addoption('--gdbserver', default=None,
help='Run sandbox under gdbserver. The argument is the channel '+
'over which gdbserver should communicate, e.g. localhost:1234')
@@ -140,16 +142,26 @@ def pytest_configure(config):
log = multiplexed_log.Logfile(result_dir + '/test-log.html')
if config.getoption('build'):
if build_dir != source_dir:
o_opt = 'O=%s' % build_dir
if config.getoption('buildman'):
if build_dir != source_dir:
dest_args = ['-o', build_dir, '-w']
else:
dest_args = ['-i']
cmds = (['buildman', '--board', board_type] + dest_args,)
name = 'buildman'
else:
o_opt = ''
cmds = (
['make', o_opt, '-s', board_type + '_defconfig'],
['make', o_opt, '-s', '-j8'],
)
with log.section('make'):
runner = log.get_runner('make', sys.stdout)
if build_dir != source_dir:
o_opt = 'O=%s' % build_dir
else:
o_opt = ''
cmds = (
['make', o_opt, '-s', board_type + '_defconfig'],
['make', o_opt, '-s', '-j8'],
)
name = 'make'
with log.section(name):
runner = log.get_runner(name, sys.stdout)
for cmd in cmds:
runner.run(cmd, cwd=source_dir)
runner.close()

View File

@@ -1056,19 +1056,46 @@ toolchain. For example:
buildman -O clang-7 --board sandbox
Doing a simple build
====================
In some cases you just want to build a single board and get the full output, use
the -w option, for example:
buildman -o /tmp/build --board sandbox -w
This will write the full build into /tmp/build including object files.
Other options
=============
Buildman has various other command line options. Try --help to see them.
Buildman has various other command-line options. Try --help to see them.
To find out what architecture or toolchain prefix buildman will use for a build,
see the -a and -A options.
To find out what toolchain prefix buildman will use for a build, use the -A
option.
To request that compiler warnings be promoted to errors, use -E. This passes the
-Werror flag to the compiler. Note that the build can still produce warnings
with -E, e.g. the migration warnings:
===================== WARNING ======================
This board does not use CONFIG_DM_MMC. Please update
...
====================================================
When doing builds, Buildman's return code will reflect the overall result:
0 (success) No errors or warnings found
128 Errors found
129 Warnings found
129 Warnings found (only if no -W)
You can use -W to tell Buildman to return 0 (success) instead of 129 when
warnings are found. Note that it can be useful to combine -E and -W. This means
that all compiler warnings will produce failures (code 128) and all other
warnings will produce success (since 129 is changed to 0).
If there are both warnings and errors, errors win, so buildman returns 128.
How to change from MAKEALL

View File

@@ -174,6 +174,8 @@ class Builder:
in_tree: Build U-Boot in-tree instead of specifying an output
directory separate from the source code. This option is really
only useful for testing in-tree builds.
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
Private members:
_base_board_dict: Last-summarised Dict of boards
@@ -224,7 +226,7 @@ class Builder:
no_subdirs=False, full_path=False, verbose_build=False,
incremental=False, per_board_out_dir=False,
config_only=False, squash_config_y=False,
warnings_as_errors=False):
warnings_as_errors=False, work_in_output=False):
"""Create a new Builder object
Args:
@@ -250,10 +252,15 @@ class Builder:
config_only: Only configure each build, don't build it
squash_config_y: Convert CONFIG options with the value 'y' to '1'
warnings_as_errors: Treat all compiler warnings as errors
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
"""
self.toolchains = toolchains
self.base_dir = base_dir
self._working_dir = os.path.join(base_dir, '.bm-work')
if work_in_output:
self._working_dir = base_dir
else:
self._working_dir = os.path.join(base_dir, '.bm-work')
self.threads = []
self.do_make = self.Make
self.gnu_make = gnu_make
@@ -280,6 +287,7 @@ class Builder:
self.config_only = config_only
self.squash_config_y = squash_config_y
self.config_filenames = BASE_CONFIG_FILENAMES
self.work_in_output = work_in_output
if not self.squash_config_y:
self.config_filenames += EXTRA_CONFIG_FILENAMES
@@ -329,7 +337,7 @@ class Builder:
show_errors: True to show summarised error/warning info
show_sizes: Show size deltas
show_detail: Show detail for each board
show_detail: Show size delta detail for each board if show_sizes
show_bloat: Show detail for each function
list_error_boards: Show the boards which caused each error/warning
show_config: Show config deltas
@@ -477,6 +485,7 @@ class Builder:
if self.commits:
commit = self.commits[commit_upto]
subject = commit.subject.translate(trans_valid_chars)
# See _GetOutputSpaceRemovals() which parses this name
commit_dir = ('%02d_of_%02d_g%s_%s' % (commit_upto + 1,
self.commit_count, commit.hash, subject[:20]))
elif not self.no_subdirs:
@@ -992,7 +1001,7 @@ class Builder:
board.target
board_dict: Dict containing boards for which we built this
commit, keyed by board.target. The value is an Outcome object.
show_detail: Show detail for each board
show_detail: Show size delta detail for each board
show_bloat: Show detail for each function
"""
arch_list = {}
@@ -1109,7 +1118,7 @@ class Builder:
environment: Dictionary keyed by environment variable, Each
value is the value of environment variable.
show_sizes: Show image size deltas
show_detail: Show detail for each board
show_detail: Show size delta detail for each board if show_sizes
show_bloat: Show detail for each function
show_config: Show config changes
show_environment: Show environment changes
@@ -1474,6 +1483,8 @@ class Builder:
Args:
thread_num: Number of thread to check.
"""
if self.work_in_output:
return self._working_dir
return os.path.join(self._working_dir, '%02d' % thread_num)
def _PrepareThread(self, thread_num, setup_git):
@@ -1515,12 +1526,15 @@ class Builder:
for thread in range(max_threads):
self._PrepareThread(thread, setup_git)
def _PrepareOutputSpace(self):
def _GetOutputSpaceRemovals(self):
"""Get the output directories ready to receive files.
We delete any output directories which look like ones we need to
create. Having left over directories is confusing when the user wants
to check the output manually.
Figure out what needs to be deleted in the output directory before it
can be used. We only delete old buildman directories which have the
expected name pattern. See _GetOutputDir().
Returns:
List of full paths of directories to remove
"""
if not self.commits:
return
@@ -1531,12 +1545,26 @@ class Builder:
to_remove = []
for dirname in glob.glob(os.path.join(self.base_dir, '*')):
if dirname not in dir_list:
to_remove.append(dirname)
leaf = dirname[len(self.base_dir) + 1:]
m = re.match('[0-9]+_of_[0-9]+_g[0-9a-f]+_.*', leaf)
if m:
to_remove.append(dirname)
return to_remove
def _PrepareOutputSpace(self):
"""Get the output directories ready to receive files.
We delete any output directories which look like ones we need to
create. Having left over directories is confusing when the user wants
to check the output manually.
"""
to_remove = self._GetOutputSpaceRemovals()
if to_remove:
Print('Removing %d old build directories' % len(to_remove),
Print('Removing %d old build directories...' % len(to_remove),
newline=False)
for dirname in to_remove:
shutil.rmtree(dirname)
Print('done')
def BuildBoards(self, commits, board_selected, keep_outputs, verbose):
"""Build all commits for a list of boards
@@ -1571,6 +1599,7 @@ class Builder:
job.board = brd
job.commits = commits
job.keep_outputs = keep_outputs
job.work_in_output = self.work_in_output
job.step = self._step
self.queue.put(job)

View File

@@ -39,11 +39,18 @@ class BuilderJob:
Members:
board: Board object to build
commits: List of commit options to build.
commits: List of Commit objects to build
keep_outputs: True to save build output files
step: 1 to process every commit, n to process every nth commit
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
"""
def __init__(self):
self.board = None
self.commits = []
self.keep_outputs = False
self.step = 1
self.work_in_output = False
class ResultThread(threading.Thread):
@@ -114,7 +121,7 @@ class BuilderThread(threading.Thread):
**kwargs)
def RunCommit(self, commit_upto, brd, work_dir, do_config, config_only,
force_build, force_build_failures):
force_build, force_build_failures, work_in_output):
"""Build a particular commit.
If the build is already done, and we are not forcing a build, we skip
@@ -129,6 +136,8 @@ class BuilderThread(threading.Thread):
force_build: Force a build even if one was previously done
force_build_failures: Force a bulid if the previous result showed
failure
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
Returns:
tuple containing:
@@ -139,7 +148,7 @@ class BuilderThread(threading.Thread):
# self.Make() below, in the event that we do a build.
result = command.CommandResult()
result.return_code = 0
if self.builder.in_tree:
if work_in_output or self.builder.in_tree:
out_dir = work_dir
else:
if self.per_board_out_dir:
@@ -261,14 +270,18 @@ class BuilderThread(threading.Thread):
result.out_dir = out_dir
return result, do_config
def _WriteResult(self, result, keep_outputs):
def _WriteResult(self, result, keep_outputs, work_in_output):
"""Write a built result to the output directory.
Args:
result: CommandResult object containing result to write
keep_outputs: True to store the output binaries, False
to delete them
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
"""
if work_in_output:
return
# Fatal error
if result.return_code < 0:
return
@@ -430,7 +443,8 @@ class BuilderThread(threading.Thread):
result, request_config = self.RunCommit(commit_upto, brd,
work_dir, do_config, self.builder.config_only,
force_build or self.builder.force_build,
self.builder.force_build_failures)
self.builder.force_build_failures,
work_in_output=job.work_in_output)
failed = result.return_code or result.stderr
did_config = do_config
if failed and not do_config:
@@ -438,7 +452,8 @@ class BuilderThread(threading.Thread):
# with a reconfig.
if self.builder.force_config_on_failure:
result, request_config = self.RunCommit(commit_upto,
brd, work_dir, True, False, True, False)
brd, work_dir, True, False, True, False,
work_in_output=job.work_in_output)
did_config = True
if not self.builder.force_reconfig:
do_config = request_config
@@ -477,15 +492,16 @@ class BuilderThread(threading.Thread):
raise ValueError('Interrupt')
# We have the build results, so output the result
self._WriteResult(result, job.keep_outputs)
self._WriteResult(result, job.keep_outputs, job.work_in_output)
self.builder.out_queue.put(result)
else:
# Just build the currently checked-out build
result, request_config = self.RunCommit(None, brd, work_dir, True,
self.builder.config_only, True,
self.builder.force_build_failures)
self.builder.force_build_failures,
work_in_output=job.work_in_output)
result.commit_upto = 0
self._WriteResult(result, job.keep_outputs)
self._WriteResult(result, job.keep_outputs, job.work_in_output)
self.builder.out_queue.put(result)
def run(self):

View File

@@ -13,8 +13,6 @@ def ParseArgs():
args: command lin arguments
"""
parser = OptionParser()
parser.add_option('-a', '--print-arch', action='store_true',
help='Print the architecture for a board (ARCH=)')
parser.add_option('-A', '--print-prefix', action='store_true',
help='Print the tool-chain prefix for a board (CROSS_COMPILE=)')
parser.add_option('-b', '--branch', type='string',
@@ -31,7 +29,7 @@ def ParseArgs():
help='Reconfigure for every commit (disable incremental build)')
parser.add_option('-d', '--detail', dest='show_detail',
action='store_true', default=False,
help='Show detailed information for each board in summary')
help='Show detailed size delta for each board in the -S summary')
parser.add_option('-D', '--config-only', action='store_true', default=False,
help="Don't build, just configure each commit")
parser.add_option('-e', '--show_errors', action='store_true',
@@ -106,6 +104,10 @@ def ParseArgs():
default=False, help='Show build results while the build progresses')
parser.add_option('-V', '--verbose-build', action='store_true',
default=False, help='Run make with V=1, logging all output')
parser.add_option('-w', '--work-in-output', action='store_true',
default=False, help='Use the output directory as the work directory')
parser.add_option('-W', '--ignore-warnings', action='store_true',
default=False, help='Return success even if there are warnings')
parser.add_option('-x', '--exclude', dest='exclude',
type='string', action='append',
help='Specify a list of boards to exclude, separated by comma')

View File

@@ -85,38 +85,15 @@ def ShowActions(series, why_selected, boards_selected, builder, options,
for warning in board_warnings:
print(col.Color(col.YELLOW, warning))
def CheckOutputDir(output_dir):
"""Make sure that the output directory is not within the current directory
If we try to use an output directory which is within the current directory
(which is assumed to hold the U-Boot source) we may end up deleting the
U-Boot source code. Detect this and print an error in this case.
Args:
output_dir: Output directory path to check
"""
path = os.path.realpath(output_dir)
cwd_path = os.path.realpath('.')
while True:
if os.path.realpath(path) == cwd_path:
Print("Cannot use output directory '%s' since it is within the current directory '%s'" %
(path, cwd_path))
sys.exit(1)
parent = os.path.dirname(path)
if parent == path:
break
path = parent
def ShowToolchainInfo(boards, toolchains, print_arch, print_prefix):
def ShowToolchainPrefix(boards, toolchains):
"""Show information about a the tool chain used by one or more boards
The function checks that all boards use the same toolchain.
The function checks that all boards use the same toolchain, then prints
the correct value for CROSS_COMPILE.
Args:
boards: Boards object containing selected boards
toolchains: Toolchains object containing available toolchains
print_arch: True to print ARCH value
print_prefix: True to print CROSS_COMPILE value
Return:
None on success, string error message otherwise
@@ -129,10 +106,7 @@ def ShowToolchainInfo(boards, toolchains, print_arch, print_prefix):
return 'Supplied boards must share one toolchain'
return False
tc = tc_set.pop()
if print_arch:
print(tc.GetEnvArgs(toolchain.VAR_ARCH))
if print_prefix:
print(tc.GetEnvArgs(toolchain.VAR_CROSS_COMPILE))
print(tc.GetEnvArgs(toolchain.VAR_CROSS_COMPILE))
return None
def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
@@ -228,9 +202,8 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
if not len(selected):
sys.exit(col.Color(col.RED, 'No matching boards found'))
if options.print_arch or options.print_prefix:
err = ShowToolchainInfo(boards, toolchains, options.print_arch,
options.print_prefix)
if options.print_prefix:
err = ShowToolchainInfo(boards, toolchains)
if err:
sys.exit(col.Color(col.RED, err))
return 0
@@ -263,6 +236,13 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
str = ("No commits found to process in branch '%s': "
"set branch's upstream or use -c flag" % options.branch)
sys.exit(col.Color(col.RED, str))
if options.work_in_output:
if len(selected) != 1:
sys.exit(col.Color(col.RED,
'-w can only be used with a single board'))
if count != 1:
sys.exit(col.Color(col.RED,
'-w can only be used with a single commit'))
# Read the metadata from the commits. First look at the upstream commit,
# then the ones in the branch. We would like to do something like
@@ -324,7 +304,6 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
output_dir = os.path.join(options.output_dir, dirname)
if clean_dir and os.path.exists(output_dir):
shutil.rmtree(output_dir)
CheckOutputDir(output_dir)
builder = Builder(toolchains, output_dir, options.git_dir,
options.threads, options.jobs, gnu_make=gnu_make, checkout=True,
show_unknown=options.show_unknown, step=options.step,
@@ -334,7 +313,8 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
per_board_out_dir=options.per_board_out_dir,
config_only=options.config_only,
squash_config_y=not options.preserve_config_y,
warnings_as_errors=options.warnings_as_errors)
warnings_as_errors=options.warnings_as_errors,
work_in_output=options.work_in_output)
builder.force_config_on_failure = not options.quick
if make_func:
builder.do_make = make_func
@@ -378,6 +358,6 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
options.keep_outputs, options.verbose)
if fail:
return 128
elif warned:
elif warned and not options.ignore_warnings:
return 129
return 0

View File

@@ -16,6 +16,7 @@ import control
import gitutil
import terminal
import toolchain
import tools
settings_data = '''
# Buildman settings file
@@ -208,7 +209,7 @@ class TestFunctional(unittest.TestCase):
def tearDown(self):
shutil.rmtree(self._base_dir)
shutil.rmtree(self._output_dir)
#shutil.rmtree(self._output_dir)
def setupToolchains(self):
self._toolchains = toolchain.Toolchains()
@@ -218,12 +219,12 @@ class TestFunctional(unittest.TestCase):
return command.RunPipe([[self._buildman_pathname] + list(args)],
capture=True, capture_stderr=True)
def _RunControl(self, *args, **kwargs):
def _RunControl(self, *args, clean_dir=False, boards=None):
sys.argv = [sys.argv[0]] + list(args)
options, args = cmdline.ParseArgs()
result = control.DoBuildman(options, args, toolchains=self._toolchains,
make_func=self._HandleMake, boards=self._boards,
clean_dir=kwargs.get('clean_dir', True))
make_func=self._HandleMake, boards=boards or self._boards,
clean_dir=clean_dir)
self._builder = control.builder
return result
@@ -397,6 +398,12 @@ class TestFunctional(unittest.TestCase):
combined='Test configuration complete')
elif stage == 'build':
stderr = ''
out_dir = ''
for arg in args:
if arg.startswith('O='):
out_dir = arg[2:]
fname = os.path.join(cwd or '', out_dir, 'u-boot')
tools.WriteFile(fname, b'U-Boot')
if type(commit) is not str:
stderr = self._error.get((brd.target, commit.sequence))
if stderr:
@@ -527,11 +534,26 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(self._builder.count, self._total_builds)
self.assertEqual(self._builder.fail, 0)
def testBadOutputDir(self):
"""Test building with an output dir the same as out current dir"""
self._test_branch = '/__dev/__testbranch'
with self.assertRaises(SystemExit):
self._RunControl('-b', self._test_branch, '-o', os.getcwd())
with self.assertRaises(SystemExit):
self._RunControl('-b', self._test_branch, '-o',
os.path.join(os.getcwd(), 'test'))
def testWorkInOutput(self):
"""Test the -w option which should write directly to the output dir"""
board_list = board.Boards()
board_list.AddBoard(board.Board(*boards[0]))
self._RunControl('-o', self._output_dir, '-w', clean_dir=False,
boards=board_list)
self.assertTrue(
os.path.exists(os.path.join(self._output_dir, 'u-boot')))
def testWorkInOutputFail(self):
"""Test the -w option failures"""
with self.assertRaises(SystemExit) as e:
self._RunControl('-o', self._output_dir, '-w', clean_dir=False)
self.assertIn("single board", str(e.exception))
self.assertFalse(
os.path.exists(os.path.join(self._output_dir, 'u-boot')))
board_list = board.Boards()
board_list.AddBoard(board.Board(*boards[0]))
with self.assertRaises(SystemExit) as e:
self._RunControl('-b', self._test_branch, '-o', self._output_dir,
'-w', clean_dir=False, boards=board_list)
self.assertIn("single commit", str(e.exception))

View File

@@ -22,6 +22,7 @@ import commit
import terminal
import test_util
import toolchain
import tools
use_network = True
@@ -469,6 +470,25 @@ class TestBuild(unittest.TestCase):
self.assertEqual('HOSTCC=clang CC=clang',
tc.GetEnvArgs(toolchain.VAR_MAKE_ARGS))
def testPrepareOutputSpace(self):
def _Touch(fname):
tools.WriteFile(os.path.join(base_dir, fname), b'')
base_dir = tempfile.mkdtemp()
# Add various files that we want removed and left alone
to_remove = ['01_of_22_g0982734987_title', '102_of_222_g92bf_title',
'01_of_22_g2938abd8_title']
to_leave = ['something_else', '01-something.patch', '01_of_22_another']
for name in to_remove + to_leave:
_Touch(name)
build = builder.Builder(self.toolchains, base_dir, None, 1, 2)
build.commits = self.commits
build.commit_count = len(commits)
result = set(build._GetOutputSpaceRemovals())
expected = set([os.path.join(base_dir, f) for f in to_remove])
self.assertEqual(expected, result)
if __name__ == "__main__":
unittest.main()