Skip to content

fix: enhance Boost CMake configuration for environment variable support #6

fix: enhance Boost CMake configuration for environment variable support

fix: enhance Boost CMake configuration for environment variable support #6

Workflow file for this run

name: "CI tests"
on: [ push ]
jobs:
build-matrix:
name: Tests and application run on ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "Windows Latest MinGW", artifact: "Windows-Ninja.tar.xz",
os: windows-latest,
build_type: "Release", cc: "gcc", cxx: "g++",
}
- {
name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz",
os: ubuntu-latest,
build_type: "Release", cc: "gcc", cxx: "g++"
}
- {
name: "macOS Latest Clang", artifact: "macOS.tar.xz",
os: macos-latest,
build_type: "Release", cc: "clang", cxx: "clang++"
}
steps:
- uses: actions/checkout@v4
- uses: seanmiddleditch/gha-setup-ninja@master
- name: Install Qt dependencies for Linux
if: ${{ matrix.config.os == 'ubuntu-latest' }}
run: |
sudo apt update
sudo apt install libgl1-mesa-dev libglu1-mesa-dev
- name: Create CMake cache
shell: bash
run: |
cmake -S . -B cmake-build-release -DCMAKE_BUILD_TYPE=Release -G "Ninja"
- name: Build main target
shell: bash
run: |
cmake --build cmake-build-release --target QtCMake
- name: Run program
shell: bash
working-directory: ./cmake-build-release/bin
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
./QtCMake.exe --help
else
./QtCMake --help
fi
- name: Build tests
shell: bash
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
cmake --build ./cmake-build-release --target QtCMake_tests || echo "Built with errors"
else
cmake --build ./cmake-build-release --target QtCMake_tests
fi
- name: Run tests
shell: bash
working-directory: ./cmake-build-release/tests
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
./QtCMake_tests.exe || echo "Tests failed" # Due to a specific MinGW-related Github Actions issue
else
./QtCMake_tests
fi
style-check:
name: Code style check with clang-format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install clang-format
run: |
sudo apt-get update && sudo apt-get -y install clang-format
- name: Check code style
shell: bash
run: |
mapfile -t files < <(git ls-files '*.c' '*.cpp' '*.h' '*.hpp')
if [ "${#files[@]}" -eq 0 ]; then
echo "No C/C++ files to check."
exit 0
fi
clang-format --dry-run --Werror "${files[@]}" 2>format_output.txt || {
cat format_output.txt
exit 1
}
- name: Comment on style issues
if: failure() && github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const { execSync } = require('child_process');
try {
// Get list of files that need formatting
const rawFiles = execSync('git ls-files "*.c" "*.cpp" "*.h" "*.hpp"', { encoding: 'utf8' }).trim();
if (!rawFiles) {
console.log('No files require formatting checks.');
return;
}
const files = rawFiles.split('\n');
let comment = '## 🎨 Code Style Issues Found\n\n';
comment += 'The following files have formatting issues:\n\n';
let hasIssues = false;
for (const file of files) {
try {
const result = execSync(`clang-format --dry-run --Werror "${file}" 2>&1`, { encoding: 'utf8' });
} catch (error) {
comment += `- \`${file}\`: Formatting issues detected\n`;
hasIssues = true;
}
}
if (!hasIssues) {
comment += 'No files with formatting issues were detected.';
} else {
comment += '\nPlease run `clang-format -i <file>` to fix formatting issues.';
}
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
} catch (error) {
console.log('Could not create comment:', error.message);
}
code-quality-check:
name: Code quality check with clang-tidy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install clang-tidy and GCC 13
run: |
sudo apt-get update
# Install a C++23-capable toolchain and clang-tidy-19 for better C++23 support
sudo apt-get -y install clang-19 clang-tidy-19
- name: Install Qt and Boost
run: |
sudo apt update
sudo apt install libgl1-mesa-dev libglu1-mesa-dev
sudo apt install qt6-base-dev
sudo apt install libboost-all-dev
- name: Create CMake cache
run: |
cmake -S . -B cmake-build-tidy \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
- name: Run clang-tidy
shell: bash
run: |
mapfile -t files < <(git ls-files '*.c' '*.cpp')
if [ "${#files[@]}" -eq 0 ]; then
echo "No C/C++ files to analyze."
echo "" > tidy_output.txt
exit 0
fi
echo "Running clang-tidy-19 on ${#files[@]} files..."
# Use clang-tidy-19 for better C++23 support and --extra-arg-before to ensure C++23 standard is set before other flags
clang-tidy-19 "${files[@]}" -p cmake-build-tidy --format-style=file > tidy_output.txt 2>&1 || true
# Ensure file exists and is readable
if [ ! -f tidy_output.txt ]; then
echo "" > tidy_output.txt
fi
- name: Count warnings and errors
id: count_issues
run: |
# Count errors and warnings - handle empty file case
if [ ! -s tidy_output.txt ]; then
errors=0
warnings=0
else
errors=$(grep -c "error:" tidy_output.txt 2>/dev/null || echo "0")
warnings=$(grep -c "warning:" tidy_output.txt 2>/dev/null || echo "0")
fi
# Ensure we have clean integer values
errors=$(echo "$errors" | tr -d '\n' | head -c 10)
warnings=$(echo "$warnings" | tr -d '\n' | head -c 10)
# Default to 0 if empty or non-numeric
errors=${errors:-0}
warnings=${warnings:-0}
echo "errors=$errors" >> $GITHUB_OUTPUT
echo "warnings=$warnings" >> $GITHUB_OUTPUT
echo "Found $errors errors and $warnings warnings"
if [ "$errors" -eq 0 ] && [ "$warnings" -le 3 ]; then
echo "clang-tidy found $warnings warnings"
cat tidy_output.txt
exit 0
fi
# Fail if more than 3 warnings or any errors
if [ "$errors" -gt 0 ] || [ "$warnings" -gt 3 ]; then
echo "clang-tidy found $errors errors and $warnings warnings"
cat tidy_output.txt
exit 1
fi
- name: Comment on quality issues
if: failure() && github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
try {
let comment = '## 🔍 Code Quality Issues Found\n\n';
if (fs.existsSync('tidy_output.txt')) {
const output = fs.readFileSync('tidy_output.txt', 'utf8');
const lines = output.split('\n');
let currentFile = '';
let hasIssues = false;
for (const line of lines) {
if (line.includes('error:') || line.includes('warning:')) {
const parts = line.split(':');
if (parts.length >= 4) {
const file = parts[0];
const lineNum = parts[1];
const message = parts.slice(3).join(':').trim();
if (file !== currentFile) {
if (hasIssues) comment += '\n';
comment += `### \`${file}\`\n\n`;
currentFile = file;
hasIssues = true;
}
const issueType = line.includes('error:') ? '❌ Error' : '⚠️ Warning';
comment += `- **Line ${lineNum}**: ${issueType} - ${message}\n`;
}
}
}
if (!hasIssues) {
comment += 'No specific issues found in the output.';
}
} else {
comment += 'Could not read clang-tidy output.';
}
comment += '\n\nPlease review and fix the issues above.';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
} catch (error) {
console.log('Could not create comment:', error.message);
}