|
@@ -8,7 +8,7 @@ env:
|
|
|
jobs:
|
|
jobs:
|
|
|
# run tests
|
|
# run tests
|
|
|
test:
|
|
test:
|
|
|
- runs-on: ubuntu-18.04
|
|
|
|
|
|
|
+ runs-on: ubuntu-20.04
|
|
|
strategy:
|
|
strategy:
|
|
|
fail-fast: false
|
|
fail-fast: false
|
|
|
matrix:
|
|
matrix:
|
|
@@ -18,11 +18,11 @@ jobs:
|
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/checkout@v2
|
|
|
- name: install
|
|
- name: install
|
|
|
run: |
|
|
run: |
|
|
|
- # need toml, also pip3 isn't installed by default?
|
|
|
|
|
|
|
+ # need a few additional tools
|
|
|
sudo apt-get update -qq
|
|
sudo apt-get update -qq
|
|
|
sudo apt-get install -qq python3 python3-pip lcov
|
|
sudo apt-get install -qq python3 python3-pip lcov
|
|
|
sudo pip3 install toml
|
|
sudo pip3 install toml
|
|
|
- gcc --version
|
|
|
|
|
|
|
+ python3 --version
|
|
|
|
|
|
|
|
# setup a ram-backed disk to speed up reentrant tests
|
|
# setup a ram-backed disk to speed up reentrant tests
|
|
|
mkdir disks
|
|
mkdir disks
|
|
@@ -36,41 +36,49 @@ jobs:
|
|
|
|
|
|
|
|
echo "TESTFLAGS=$TESTFLAGS" >> $GITHUB_ENV
|
|
echo "TESTFLAGS=$TESTFLAGS" >> $GITHUB_ENV
|
|
|
|
|
|
|
|
|
|
+ # we're not cross-compiling with x86, but we do need the newest
|
|
|
|
|
+ # version of gcc for the -fcallgraph-info=su flag
|
|
|
|
|
+ - name: install-x86_64
|
|
|
|
|
+ if: ${{matrix.arch == 'x86_64'}}
|
|
|
|
|
+ run: |
|
|
|
|
|
+ sudo apt-get install -qq gcc-10
|
|
|
|
|
+ echo "CC=gcc-10" >> $GITHUB_ENV
|
|
|
|
|
+ gcc-10 --version
|
|
|
# cross-compile with ARM Thumb (32-bit, little-endian)
|
|
# cross-compile with ARM Thumb (32-bit, little-endian)
|
|
|
- name: install-thumb
|
|
- name: install-thumb
|
|
|
if: ${{matrix.arch == 'thumb'}}
|
|
if: ${{matrix.arch == 'thumb'}}
|
|
|
run: |
|
|
run: |
|
|
|
sudo apt-get install -qq \
|
|
sudo apt-get install -qq \
|
|
|
- gcc-arm-linux-gnueabi \
|
|
|
|
|
|
|
+ gcc-10-arm-linux-gnueabi \
|
|
|
libc6-dev-armel-cross \
|
|
libc6-dev-armel-cross \
|
|
|
qemu-user
|
|
qemu-user
|
|
|
- echo "CC=arm-linux-gnueabi-gcc -mthumb --static" >> $GITHUB_ENV
|
|
|
|
|
|
|
+ echo "CC=arm-linux-gnueabi-gcc-10 -mthumb --static" >> $GITHUB_ENV
|
|
|
echo "EXEC=qemu-arm" >> $GITHUB_ENV
|
|
echo "EXEC=qemu-arm" >> $GITHUB_ENV
|
|
|
- arm-linux-gnueabi-gcc --version
|
|
|
|
|
|
|
+ arm-linux-gnueabi-gcc-10 --version
|
|
|
qemu-arm -version
|
|
qemu-arm -version
|
|
|
# cross-compile with MIPS (32-bit, big-endian)
|
|
# cross-compile with MIPS (32-bit, big-endian)
|
|
|
- name: install-mips
|
|
- name: install-mips
|
|
|
if: ${{matrix.arch == 'mips'}}
|
|
if: ${{matrix.arch == 'mips'}}
|
|
|
run: |
|
|
run: |
|
|
|
sudo apt-get install -qq \
|
|
sudo apt-get install -qq \
|
|
|
- gcc-mips-linux-gnu \
|
|
|
|
|
|
|
+ gcc-10-mips-linux-gnu \
|
|
|
libc6-dev-mips-cross \
|
|
libc6-dev-mips-cross \
|
|
|
qemu-user
|
|
qemu-user
|
|
|
- echo "CC=mips-linux-gnu-gcc --static" >> $GITHUB_ENV
|
|
|
|
|
|
|
+ echo "CC=mips-linux-gnu-gcc-10 --static" >> $GITHUB_ENV
|
|
|
echo "EXEC=qemu-mips" >> $GITHUB_ENV
|
|
echo "EXEC=qemu-mips" >> $GITHUB_ENV
|
|
|
- mips-linux-gnu-gcc --version
|
|
|
|
|
|
|
+ mips-linux-gnu-gcc-10 --version
|
|
|
qemu-mips -version
|
|
qemu-mips -version
|
|
|
# cross-compile with PowerPC (32-bit, big-endian)
|
|
# cross-compile with PowerPC (32-bit, big-endian)
|
|
|
- name: install-powerpc
|
|
- name: install-powerpc
|
|
|
if: ${{matrix.arch == 'powerpc'}}
|
|
if: ${{matrix.arch == 'powerpc'}}
|
|
|
run: |
|
|
run: |
|
|
|
sudo apt-get install -qq \
|
|
sudo apt-get install -qq \
|
|
|
- gcc-powerpc-linux-gnu \
|
|
|
|
|
|
|
+ gcc-10-powerpc-linux-gnu \
|
|
|
libc6-dev-powerpc-cross \
|
|
libc6-dev-powerpc-cross \
|
|
|
qemu-user
|
|
qemu-user
|
|
|
- echo "CC=powerpc-linux-gnu-gcc --static" >> $GITHUB_ENV
|
|
|
|
|
|
|
+ echo "CC=powerpc-linux-gnu-gcc-10 --static" >> $GITHUB_ENV
|
|
|
echo "EXEC=qemu-ppc" >> $GITHUB_ENV
|
|
echo "EXEC=qemu-ppc" >> $GITHUB_ENV
|
|
|
- powerpc-linux-gnu-gcc --version
|
|
|
|
|
|
|
+ powerpc-linux-gnu-gcc-10 --version
|
|
|
qemu-ppc -version
|
|
qemu-ppc -version
|
|
|
|
|
|
|
|
# make sure example can at least compile
|
|
# make sure example can at least compile
|
|
@@ -148,102 +156,108 @@ jobs:
|
|
|
retention-days: 1
|
|
retention-days: 1
|
|
|
|
|
|
|
|
# update results
|
|
# update results
|
|
|
- - name: results-code
|
|
|
|
|
|
|
+ - name: results
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p results
|
|
mkdir -p results
|
|
|
make clean
|
|
make clean
|
|
|
- make code \
|
|
|
|
|
|
|
+ make lfs.csv \
|
|
|
CFLAGS+=" \
|
|
CFLAGS+=" \
|
|
|
-DLFS_NO_ASSERT \
|
|
-DLFS_NO_ASSERT \
|
|
|
-DLFS_NO_DEBUG \
|
|
-DLFS_NO_DEBUG \
|
|
|
-DLFS_NO_WARN \
|
|
-DLFS_NO_WARN \
|
|
|
- -DLFS_NO_ERROR" \
|
|
|
|
|
- CODEFLAGS+="-o results/code-${{matrix.arch}}.csv"
|
|
|
|
|
- - name: results-code-readonly
|
|
|
|
|
|
|
+ -DLFS_NO_ERROR"
|
|
|
|
|
+ cp lfs.csv results/${{matrix.arch}}.csv
|
|
|
|
|
+ ./scripts/summary.py results/${{matrix.arch}}.csv
|
|
|
|
|
+ - name: results-readonly
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p results
|
|
mkdir -p results
|
|
|
make clean
|
|
make clean
|
|
|
- make code \
|
|
|
|
|
|
|
+ make lfs.csv \
|
|
|
CFLAGS+=" \
|
|
CFLAGS+=" \
|
|
|
-DLFS_NO_ASSERT \
|
|
-DLFS_NO_ASSERT \
|
|
|
-DLFS_NO_DEBUG \
|
|
-DLFS_NO_DEBUG \
|
|
|
-DLFS_NO_WARN \
|
|
-DLFS_NO_WARN \
|
|
|
-DLFS_NO_ERROR \
|
|
-DLFS_NO_ERROR \
|
|
|
- -DLFS_READONLY" \
|
|
|
|
|
- CODEFLAGS+="-o results/code-${{matrix.arch}}-readonly.csv"
|
|
|
|
|
- - name: results-code-threadsafe
|
|
|
|
|
|
|
+ -DLFS_READONLY"
|
|
|
|
|
+ cp lfs.csv results/${{matrix.arch}}-readonly.csv
|
|
|
|
|
+ ./scripts/summary.py results/${{matrix.arch}}-readonly.csv
|
|
|
|
|
+ - name: results-threadsafe
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p results
|
|
mkdir -p results
|
|
|
make clean
|
|
make clean
|
|
|
- make code \
|
|
|
|
|
|
|
+ make lfs.csv \
|
|
|
CFLAGS+=" \
|
|
CFLAGS+=" \
|
|
|
-DLFS_NO_ASSERT \
|
|
-DLFS_NO_ASSERT \
|
|
|
-DLFS_NO_DEBUG \
|
|
-DLFS_NO_DEBUG \
|
|
|
-DLFS_NO_WARN \
|
|
-DLFS_NO_WARN \
|
|
|
-DLFS_NO_ERROR \
|
|
-DLFS_NO_ERROR \
|
|
|
- -DLFS_THREADSAFE" \
|
|
|
|
|
- CODEFLAGS+="-o results/code-${{matrix.arch}}-threadsafe.csv"
|
|
|
|
|
- - name: results-code-migrate
|
|
|
|
|
|
|
+ -DLFS_THREADSAFE"
|
|
|
|
|
+ cp lfs.csv results/${{matrix.arch}}-threadsafe.csv
|
|
|
|
|
+ ./scripts/summary.py results/${{matrix.arch}}-threadsafe.csv
|
|
|
|
|
+ - name: results-migrate
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p results
|
|
mkdir -p results
|
|
|
make clean
|
|
make clean
|
|
|
- make code \
|
|
|
|
|
|
|
+ make lfs.csv \
|
|
|
CFLAGS+=" \
|
|
CFLAGS+=" \
|
|
|
-DLFS_NO_ASSERT \
|
|
-DLFS_NO_ASSERT \
|
|
|
-DLFS_NO_DEBUG \
|
|
-DLFS_NO_DEBUG \
|
|
|
-DLFS_NO_WARN \
|
|
-DLFS_NO_WARN \
|
|
|
-DLFS_NO_ERROR \
|
|
-DLFS_NO_ERROR \
|
|
|
- -DLFS_MIGRATE" \
|
|
|
|
|
- CODEFLAGS+="-o results/code-${{matrix.arch}}-migrate.csv"
|
|
|
|
|
- - name: results-code-error-asserts
|
|
|
|
|
|
|
+ -DLFS_MIGRATE"
|
|
|
|
|
+ cp lfs.csv results/${{matrix.arch}}-migrate.csv
|
|
|
|
|
+ ./scripts/summary.py results/${{matrix.arch}}-migrate.csv
|
|
|
|
|
+ - name: results-error-asserts
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p results
|
|
mkdir -p results
|
|
|
make clean
|
|
make clean
|
|
|
- make code \
|
|
|
|
|
|
|
+ make lfs.csv \
|
|
|
CFLAGS+=" \
|
|
CFLAGS+=" \
|
|
|
-DLFS_NO_DEBUG \
|
|
-DLFS_NO_DEBUG \
|
|
|
-DLFS_NO_WARN \
|
|
-DLFS_NO_WARN \
|
|
|
-DLFS_NO_ERROR \
|
|
-DLFS_NO_ERROR \
|
|
|
- -D'LFS_ASSERT(test)=do {if(!(test)) {return -1;}} while(0)'" \
|
|
|
|
|
- CODEFLAGS+="-o results/code-${{matrix.arch}}-error-asserts.csv"
|
|
|
|
|
|
|
+ -D'LFS_ASSERT(test)=do {if(!(test)) {return -1;}} while(0)'"
|
|
|
|
|
+ cp lfs.csv results/${{matrix.arch}}-error-asserts.csv
|
|
|
|
|
+ ./scripts/summary.py results/${{matrix.arch}}-error-asserts.csv
|
|
|
- name: upload-results
|
|
- name: upload-results
|
|
|
uses: actions/upload-artifact@v2
|
|
uses: actions/upload-artifact@v2
|
|
|
with:
|
|
with:
|
|
|
name: results
|
|
name: results
|
|
|
path: results
|
|
path: results
|
|
|
- # limit reporting to Thumb, otherwise there would be too many numbers
|
|
|
|
|
- # flying around for the results to be easily readable
|
|
|
|
|
|
|
+
|
|
|
|
|
+ # create statuses with results
|
|
|
- name: collect-status
|
|
- name: collect-status
|
|
|
- if: ${{matrix.arch == 'thumb'}}
|
|
|
|
|
run: |
|
|
run: |
|
|
|
mkdir -p status
|
|
mkdir -p status
|
|
|
- for f in $(shopt -s nullglob ; echo results/code*.csv)
|
|
|
|
|
|
|
+ for f in $(shopt -s nullglob ; echo results/*.csv)
|
|
|
do
|
|
do
|
|
|
- export STEP="results-code$(
|
|
|
|
|
- echo $f | sed -n 's/.*code-.*-\(.*\).csv/-\1/p')"
|
|
|
|
|
- export CONTEXT="results / code$(
|
|
|
|
|
- echo $f | sed -n 's/.*code-.*-\(.*\).csv/ (\1)/p')"
|
|
|
|
|
- export PREV="$(curl -sS \
|
|
|
|
|
- "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master" \
|
|
|
|
|
- | jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
|
|
|
|
|
- | select(.context == env.CONTEXT).description
|
|
|
|
|
- | capture("Code size is (?<result>[0-9]+)").result' \
|
|
|
|
|
- || echo 0)"
|
|
|
|
|
- export DESCRIPTION="$(./scripts/code.py -u $f --summary | awk '
|
|
|
|
|
- NR==2 {printf "Code size is %d B",$2}
|
|
|
|
|
- NR==2 && ENVIRON["PREV"]+0 != 0 {
|
|
|
|
|
- printf " (%+.1f%%)",100*($2-ENVIRON["PREV"])/ENVIRON["PREV"]}')"
|
|
|
|
|
- jq -n '{
|
|
|
|
|
- state: "success",
|
|
|
|
|
- context: env.CONTEXT,
|
|
|
|
|
- description: env.DESCRIPTION,
|
|
|
|
|
- target_job: "${{github.job}} (${{matrix.arch}})",
|
|
|
|
|
- target_step: env.STEP}' \
|
|
|
|
|
- | tee status/code$(
|
|
|
|
|
- echo $f | sed -n 's/.*code-.*-\(.*\).csv/-\1/p').json
|
|
|
|
|
|
|
+ export STEP="results$(
|
|
|
|
|
+ echo $f | sed -n 's/[^-]*-\(.*\).csv/-\1/p')"
|
|
|
|
|
+ for r in code stack structs
|
|
|
|
|
+ do
|
|
|
|
|
+ export CONTEXT="results (${{matrix.arch}}$(
|
|
|
|
|
+ echo $f | sed -n 's/[^-]*-\(.*\).csv/, \1/p')) / $r"
|
|
|
|
|
+ export PREV="$(curl -sS \
|
|
|
|
|
+ "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master?per_page=100" \
|
|
|
|
|
+ | jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
|
|
|
|
|
+ | select(.context == env.CONTEXT).description
|
|
|
|
|
+ | capture("(?<result>[0-9∞]+)").result' \
|
|
|
|
|
+ || echo 0)"
|
|
|
|
|
+ export DESCRIPTION="$(./scripts/summary.py $f -f $r -Y | awk '
|
|
|
|
|
+ NR==2 {printf "%s B",$2}
|
|
|
|
|
+ NR==2 && ENVIRON["PREV"]+0 != 0 {
|
|
|
|
|
+ printf " (%+.1f%%)",100*($2-ENVIRON["PREV"])/ENVIRON["PREV"]}')"
|
|
|
|
|
+ jq -n '{
|
|
|
|
|
+ state: "success",
|
|
|
|
|
+ context: env.CONTEXT,
|
|
|
|
|
+ description: env.DESCRIPTION,
|
|
|
|
|
+ target_job: "${{github.job}} (${{matrix.arch}})",
|
|
|
|
|
+ target_step: env.STEP}' \
|
|
|
|
|
+ | tee status/$r-${{matrix.arch}}$(
|
|
|
|
|
+ echo $f | sed -n 's/[^-]*-\(.*\).csv/-\1/p').json
|
|
|
|
|
+ done
|
|
|
done
|
|
done
|
|
|
- name: upload-status
|
|
- name: upload-status
|
|
|
- if: ${{matrix.arch == 'thumb'}}
|
|
|
|
|
uses: actions/upload-artifact@v2
|
|
uses: actions/upload-artifact@v2
|
|
|
with:
|
|
with:
|
|
|
name: status
|
|
name: status
|
|
@@ -252,7 +266,7 @@ jobs:
|
|
|
|
|
|
|
|
# run under Valgrind to check for memory errors
|
|
# run under Valgrind to check for memory errors
|
|
|
valgrind:
|
|
valgrind:
|
|
|
- runs-on: ubuntu-18.04
|
|
|
|
|
|
|
+ runs-on: ubuntu-20.04
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/checkout@v2
|
|
|
- name: install
|
|
- name: install
|
|
@@ -272,7 +286,7 @@ jobs:
|
|
|
|
|
|
|
|
# self-host with littlefs-fuse for a fuzz-like test
|
|
# self-host with littlefs-fuse for a fuzz-like test
|
|
|
fuse:
|
|
fuse:
|
|
|
- runs-on: ubuntu-18.04
|
|
|
|
|
|
|
+ runs-on: ubuntu-20.04
|
|
|
if: ${{!endsWith(github.ref, '-prefix')}}
|
|
if: ${{!endsWith(github.ref, '-prefix')}}
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/checkout@v2
|
|
@@ -318,7 +332,7 @@ jobs:
|
|
|
|
|
|
|
|
# test migration using littlefs-fuse
|
|
# test migration using littlefs-fuse
|
|
|
migrate:
|
|
migrate:
|
|
|
- runs-on: ubuntu-18.04
|
|
|
|
|
|
|
+ runs-on: ubuntu-20.04
|
|
|
if: ${{!endsWith(github.ref, '-prefix')}}
|
|
if: ${{!endsWith(github.ref, '-prefix')}}
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/checkout@v2
|
|
@@ -385,7 +399,7 @@ jobs:
|
|
|
|
|
|
|
|
# collect coverage info
|
|
# collect coverage info
|
|
|
coverage:
|
|
coverage:
|
|
|
- runs-on: ubuntu-18.04
|
|
|
|
|
|
|
+ runs-on: ubuntu-20.04
|
|
|
needs: [test]
|
|
needs: [test]
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/checkout@v2
|
|
@@ -421,14 +435,14 @@ jobs:
|
|
|
export STEP="results-coverage"
|
|
export STEP="results-coverage"
|
|
|
export CONTEXT="results / coverage"
|
|
export CONTEXT="results / coverage"
|
|
|
export PREV="$(curl -sS \
|
|
export PREV="$(curl -sS \
|
|
|
- "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master" \
|
|
|
|
|
|
|
+ "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/status/master?per_page=100" \
|
|
|
| jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
|
|
| jq -re 'select(.sha != env.GITHUB_SHA) | .statuses[]
|
|
|
| select(.context == env.CONTEXT).description
|
|
| select(.context == env.CONTEXT).description
|
|
|
- | capture("Coverage is (?<result>[0-9\\.]+)").result' \
|
|
|
|
|
|
|
+ | capture("(?<result>[0-9\\.]+)").result' \
|
|
|
|| echo 0)"
|
|
|| echo 0)"
|
|
|
export DESCRIPTION="$(
|
|
export DESCRIPTION="$(
|
|
|
- ./scripts/coverage.py -u results/coverage.csv --summary | awk -F '[ /%]+' '
|
|
|
|
|
- NR==2 {printf "Coverage is %.1f%% of %d lines",$4,$3}
|
|
|
|
|
|
|
+ ./scripts/coverage.py -u results/coverage.csv -Y | awk -F '[ /%]+' '
|
|
|
|
|
+ NR==2 {printf "%.1f%% of %d lines",$4,$3}
|
|
|
NR==2 && ENVIRON["PREV"]+0 != 0 {
|
|
NR==2 && ENVIRON["PREV"]+0 != 0 {
|
|
|
printf " (%+.1f%%)",$4-ENVIRON["PREV"]}')"
|
|
printf " (%+.1f%%)",$4-ENVIRON["PREV"]}')"
|
|
|
jq -n '{
|
|
jq -n '{
|