JSON support #272
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: C/C++ CI | |
on: | |
push: | |
branches: [ "main" ] | |
pull_request: | |
branches: [ "main" ] | |
jobs: | |
build-ubuntu-22_04: | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Upgrade packages | |
run: | | |
sudo apt-get update | |
sudo apt-get upgrade -y | |
- name: Install libcanth dependencies | |
run: | | |
sudo apt-get install libcjson-dev | |
echo "ncpu=$((n = $(nproc)+0, n > 0 ? n : 1))" >> "$GITHUB_ENV" | |
- name: Install Clang 11 and 12 | |
run: | | |
sudo apt-get install clang-{11,12} llvm-{11,12}-{dev,linker-tools} | |
- name: Add Ubuntu 20.04 repo (Clang 6.0 through 10, GCC 7, and GCC 8) | |
run: | | |
printf 'deb http://archive.ubuntu.com/ubuntu/ %s main restricted universe multiverse\n' focal{,-{updates,security,backports}} | sudo tee /etc/apt/sources.list.d/focal.list | |
sudo apt-get update | |
- name: Install Clang 6 through 10, GCC 7, and GCC 8 | |
run: | | |
sudo apt-get install clang-{6.0,7,8,9,10} g{cc,++}-{7,8} llvm-{6.0,7,8,9,10}-dev | |
- uses: actions/checkout@v4 | |
- name: Get available compilers, run warnings summary builds | |
run: | | |
set +e | |
uname -a | |
printf -- '\n+---------+\n|compilers|\n+---------+\n' | |
. scripts/lib.sh | |
get_compilers | |
declare -a cc_clang cc_gcc | |
declare -A cc_v | |
for _cc in "${compilers[@]}"; do | |
v=$("$_cc" --version 2>&1 | head -1) | |
case "$_cc" in | |
clang*) | |
cc_clang+=("$_cc") ;; | |
gcc*) | |
[[ ! "$v" =~ clang ]] || continue | |
cc_gcc+=("$_cc") ;; | |
esac | |
cc_v["$_cc"]="$v" | |
done | |
n=$(printf '%s\n' "${cc_v[@]}" | wc -L) | |
for _cc in "${cc_clang[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_clang | |
for _cc in "${cc_gcc[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_gcc | |
echo | |
unset compilers | |
scripts/warnings-summary.sh "${cc_clang[@]}" "${cc_gcc[@]}" | |
- name: GCC debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
ret=$? | |
if (( ret == 139 )); then | |
fmt='\n\e[1m\e[33mIgnoring SIGSEGV during %s build.\e[m\n\n' | |
fmt+='\e[33mThere is a known problem of unknown cause where\e[m\n' | |
fmt+='\e[33msome Clang builds on GitHub'"'"'s Ubuntu runners\e[m\n' | |
fmt+='\e[33msegfault during make.\e[m\n' | |
fmt+='\n\e[33mDropping %s from the test report.\e[m\n' | |
printf "$fmt" "${_dir##*/}" "${_dir##*/}" | |
rm -rf "$_dir" | |
ret=0 | |
fi | |
(( ret == 0 )) || touch "$_dir/failed" | |
done | |
- name: GCC release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
ret=$? | |
if (( ret == 139 )); then | |
fmt='\n\e[1m\e[33mIgnoring SIGSEGV during %s build.\e[m\n\n' | |
fmt+='\e[33mThere is a known problem of unknown cause where\e[m\n' | |
fmt+='\e[33msome Clang builds on GitHub'"'"'s Ubuntu runners\e[m\n' | |
fmt+='\e[33msegfault during make.\e[m\n' | |
fmt+='\n\e[33mDropping %s from the test report.\e[m\n' | |
printf "$fmt" "${_dir##*/}" "${_dir##*/}" | |
rm -rf "$_dir" | |
ret=0 | |
fi | |
(( ret == 0 )) || touch "$_dir/failed" | |
done | |
- name: Report | |
run: | | |
set +e | |
shopt -s nullglob | |
a=($(printf '%s\n' build/*/failed | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
b=($(printf '%s\n' build/*/test | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
c=($(printf '%s\n' build/*/ | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
declare -i m=${#a[@]} n=0 p=${#b[@]} q=${#c[@]} | |
x="$m/$q build failure" | |
(( m == 1 )) || x+='s' | |
(( m == 0 )) || x+=':' | |
echo "$x" | |
if (( m )); then | |
a=("${a[@]%/failed}") | |
printf '%s\n' "${a[@]/#build\//- }" | |
fi | |
if (( p )); then | |
echo 'Running tests...' | |
echo '{}' > test.json | |
for x in "${b[@]}"; do | |
y=$("$x" test.json 2>&1) | |
(( n += $? != 0 )) | |
x="${x#build/}" | |
printf -vx -- '%-13s|' "${x%/test}" | |
echo "$y" | sed "s,^,$x ," | |
done | |
x="$n/$p test failure" | |
(( n == 1 )) || x+='s' | |
echo "$x" | |
fi | |
((p = q - m - n)) | |
echo "$p/$q in the green" | |
(( p == q )) | |
build-ubuntu-24_04: | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Add apt.llvm.org | |
run: | | |
printf -- 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble%s main\n' '' '-19' | sudo tee /etc/apt/sources.list.d/apt.llvm.org.list | |
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc | |
- name: Upgrade packages | |
run: | | |
sudo apt-get update | |
sudo apt-get upgrade -y | |
- name: Install libcanth dependencies | |
run: | | |
sudo apt-get install libcjson-dev | |
echo "ncpu=$((n = $(nproc)+0, n > 0 ? n : 1))" >> "$GITHUB_ENV" | |
- name: Upgrade Clang | |
run: | | |
sudo apt-get install clang lld llvm-20-linker-tools clang-19 lld-19 llvm-19-linker-tools || true | |
- name: Add Ubuntu 22.04 and 20.04 package repos | |
run: | | |
printf 'deb http://archive.ubuntu.com/ubuntu/ %s main restricted universe multiverse\n' jammy{,-{updates,security,backports}} | sudo tee /etc/apt/sources.list.d/jammy.list | |
printf 'deb http://archive.ubuntu.com/ubuntu/ %s main restricted universe multiverse\n' focal{,-{updates,security,backports}} | sudo tee /etc/apt/sources.list.d/focal.list | |
sudo apt-get update | |
- name: Install Clang 6 through 15 and GCC 7 through 11 | |
run: | | |
sudo apt-get install clang-{6.0,7,8,9,10,11,12,13,14,15} llvm-{{6.0,7,8,9,10}-dev,{11,12,13}-linker-tools} g{cc,++}-{7,8,9,10,11} | |
- uses: actions/checkout@v4 | |
- name: Get available compilers, run warnings summary builds | |
run: | | |
set +e | |
uname -a | |
printf -- '\n+---------+\n|compilers|\n+---------+\n' | |
. scripts/lib.sh | |
get_compilers | |
declare -a cc_clang cc_gcc | |
declare -A cc_v | |
for _cc in "${compilers[@]}"; do | |
v=$("$_cc" --version 2>&1 | head -1) | |
case "$_cc" in | |
clang*) | |
cc_clang+=("$_cc") ;; | |
gcc*) | |
[[ ! "$v" =~ clang ]] || continue | |
cc_gcc+=("$_cc") ;; | |
esac | |
cc_v["$_cc"]="$v" | |
done | |
n=$(printf '%s\n' "${cc_v[@]}" | wc -L) | |
for _cc in "${cc_clang[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_clang | |
for _cc in "${cc_gcc[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_gcc | |
echo | |
unset compilers | |
scripts/warnings-summary.sh "${cc_clang[@]}" "${cc_gcc[@]}" | |
- name: GCC debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
ret=$? | |
if (( ret == 139 )); then | |
fmt='\n\e[1m\e[33mIgnoring SIGSEGV during %s build.\e[m\n\n' | |
fmt+='\e[33mThere is a known problem of unknown cause where\e[m\n' | |
fmt+='\e[33msome Clang builds on GitHub'"'"'s Ubuntu runners\e[m\n' | |
fmt+='\e[33msegfault during make.\e[m\n' | |
fmt+='\n\e[33mDropping %s from the test report.\e[m\n' | |
printf "$fmt" "${_dir##*/}" "${_dir##*/}" | |
rm -rf "$_dir" | |
ret=0 | |
fi | |
(( ret == 0 )) || touch "$_dir/failed" | |
done | |
- name: GCC release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
ret=$? | |
if (( ret == 139 )); then | |
fmt='\n\e[1m\e[33mIgnoring SIGSEGV during %s build.\e[m\n\n' | |
fmt+='\e[33mThere is a known problem of unknown cause where\e[m\n' | |
fmt+='\e[33msome Clang builds on GitHub'"'"'s Ubuntu runners\e[m\n' | |
fmt+='\e[33msegfault during make.\e[m\n' | |
fmt+='\n\e[33mDropping %s from the test report.\e[m\n' | |
printf "$fmt" "${_dir##*/}" "${_dir##*/}" | |
rm -rf "$_dir" | |
ret=0 | |
fi | |
(( ret == 0 )) || touch "$_dir/failed" | |
done | |
- name: Report | |
run: | | |
set +e | |
shopt -s nullglob | |
a=($(printf '%s\n' build/*/failed | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
b=($(printf '%s\n' build/*/test | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
c=($(printf '%s\n' build/*/ | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
declare -i m=${#a[@]} n=0 p=${#b[@]} q=${#c[@]} | |
x="$m/$q build failure" | |
(( m == 1 )) || x+='s' | |
(( m == 0 )) || x+=':' | |
echo "$x" | |
if (( m )); then | |
a=("${a[@]%/failed}") | |
printf '%s\n' "${a[@]/#build\//- }" | |
fi | |
if (( p )); then | |
echo 'Running tests...' | |
echo '{}' > test.json | |
for x in "${b[@]}"; do | |
y=$("$x" test.json 2>&1) | |
(( n += $? != 0 )) | |
x="${x#build/}" | |
printf -vx -- '%-13s|' "${x%/test}" | |
echo "$y" | sed "s,^,$x ," | |
done | |
x="$n/$p test failure" | |
(( n == 1 )) || x+='s' | |
echo "$x" | |
fi | |
((p = q - m - n)) | |
echo "$p/$q in the green" | |
(( p == q )) | |
build-macos-14: | |
runs-on: macos-14 | |
steps: | |
- name: Switch to Xcode 15.4 | |
run: | | |
sudo xcode-select -s /Applications/Xcode_15.4.app | |
- name: Install updates | |
run: | | |
set +e | |
echo "bash $BASH_VERSION" | |
brew update | |
brew upgrade | |
brew install bash | |
- name: Install dependencies | |
run: | | |
set +e | |
echo "bash $BASH_VERSION" | |
brew install binutils cjson coreutils gnu-sed make | |
if [[ -z "$HOMEBREW_PREFIX" ]]; then | |
export HOMEBREW_PREFIX="$(brew --prefix)" | |
echo 'export HOMEBREW_PREFIX="$(brew --prefix)"' >> "$HOME/.bash_profile" | |
echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> "$GITHUB_ENV" | |
fi | |
export PATH="$(brew --prefix binutils)/bin:$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$HOMEBREW_PREFIX/opt/gnu-sed/libexec/gnubin:$HOMEBREW_PREFIX/opt/make/libexec/gnubin:$PATH" | |
printf '%s\n' "alias nproc='sysctl -n hw.logicalcpu'" \ | |
"export PATH=\"$PATH\"" >> "$HOME/.bash_profile" | |
printf '%s\n' "PATH=$PATH" \ | |
"ncpu=$(sysctl -n hw.logicalcpu)" >> "$GITHUB_ENV" | |
- uses: actions/checkout@v4 | |
- name: Get available compilers, run warnings summary builds | |
shell: bash | |
run: | | |
set +e | |
uname -a | |
printf -- '\n+---------+\n|compilers|\n+---------+\n' | |
. scripts/lib.sh | |
get_compilers | |
declare -a cc_clang cc_gcc | |
declare -A cc_v | |
for _cc in "${compilers[@]}"; do | |
v=$("$_cc" --version 2>&1 | head -1) | |
case "$_cc" in | |
clang*) | |
cc_clang+=("$_cc") ;; | |
gcc*) | |
[[ ! "$v" =~ clang ]] || continue | |
cc_gcc+=("$_cc") ;; | |
esac | |
cc_v["$_cc"]="$v" | |
done | |
n=$(printf '%s\n' "${cc_v[@]}" | wc -L) | |
for _cc in "${cc_clang[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_clang | |
for _cc in "${cc_gcc[@]}"; do | |
printf "%-${n}s\t%s\n" "${cc_v[$_cc]}" "$_cc" | |
done | tee compilers_gcc | |
echo | |
unset compilers | |
scripts/warnings-summary.sh "${cc_clang[@]}" "${cc_gcc[@]}" | |
- name: GCC debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang debug builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/dbg_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" debug=1 CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: GCC release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_gcc); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#gcc/g++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Clang release builds | |
shell: bash | |
run: | | |
set +e | |
for _cc in $(cut -f2 compilers_clang); do | |
[[ -z "$_cxx" ]] || printf '\n\n========================================\n' | |
"$_cc" --version | |
_cxx="${_cc/#clang/clang++}" | |
_dir="build/rel_$_cc" | |
mkdir -p "$_dir" | |
make V=1 -j$ncpu -C src O="../$_dir" CC="$_cc" CXX="$_cxx" | |
(( $? == 0 )) || touch "$_dir/failed" | |
done | |
- name: Report | |
run: | | |
set +e | |
shopt -s nullglob | |
a=($(printf '%s\n' build/*/failed | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
b=($(printf '%s\n' build/*/test | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
c=($(printf '%s\n' build/*/ | grep -Ev '^[[:blank:]]*$' | sort -V -r)) | |
declare -i m=${#a[@]} n=0 p=${#b[@]} q=${#c[@]} | |
x="$m/$q build failure" | |
(( m == 1 )) || x+='s' | |
(( m == 0 )) || x+=':' | |
echo "$x" | |
if (( m )); then | |
a=("${a[@]%/failed}") | |
printf '%s\n' "${a[@]/#build\//- }" | |
fi | |
if (( p )); then | |
echo 'Running tests...' | |
echo '{}' > test.json | |
for x in "${b[@]}"; do | |
y=$("$x" test.json 2>&1) | |
(( n += $? != 0 )) | |
x="${x#build/}" | |
printf -vx -- '%-13s|' "${x%/test}" | |
echo "$y" | sed "s,^,$x ," | |
done | |
x="$n/$p test failure" | |
(( n == 1 )) || x+='s' | |
echo "$x" | |
fi | |
((p = q - m - n)) | |
echo "$p/$q in the green" | |
(( p == q )) |