Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
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
292 changes: 292 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,292 @@
name: Build and Test

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master ]

env:
# CMake configuration
CMAKE_BUILD_TYPE: Release
ENABLE_TESTS: ON
ENABLE_STATIC: ON
ENABLE_SHARED: ON

jobs:
# Linux builds
linux-x64:
name: Linux x64
runs-on: ubuntu-latest
strategy:
matrix:
compiler: [gcc, clang]
build_type: [Debug, Release]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build

- name: Set up compiler
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
sudo apt-get install -y clang
echo "CC=clang" >> $GITHUB_ENV
echo "CXX=clang++" >> $GITHUB_ENV
fi

- name: Configure and build
run: |
mkdir build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DENABLE_TESTS=${{ env.ENABLE_TESTS }} \
-DENABLE_STATIC=${{ env.ENABLE_STATIC }} \
-DENABLE_SHARED=${{ env.ENABLE_SHARED }} \
-DENABLE_SSE=ON \
-DENABLE_SSE2=ON \
-DENABLE_SSE3=ON
cmake --build . --parallel

- name: Run tests
run: |
cd build
ctest --output-on-failure --verbose

linux-arm64:
name: Linux ARM64
runs-on: ubuntu-latest
strategy:
matrix:
build_type: [Debug, Release]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build gcc-aarch64-linux-gnu g++-aarch64-linux-gnu qemu-user-static

- name: Configure and build for ARM64
run: |
mkdir build-arm64
cd build-arm64
cmake .. \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
-DENABLE_TESTS=${{ env.ENABLE_TESTS }} \
-DENABLE_STATIC=${{ env.ENABLE_STATIC }} \
-DENABLE_SHARED=${{ env.ENABLE_SHARED }} \
-DENABLE_NEON=ON
cmake --build . --parallel

- name: Test with QEMU
run: |
cd build-arm64
if [ -f bin/ffts_test ]; then
qemu-aarch64-static -L /usr/aarch64-linux-gnu bin/ffts_test
fi

# macOS builds
macos:
name: macOS
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-12, macos-13, macos-latest]
build_type: [Debug, Release]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
brew install cmake ninja

- name: Configure and build
run: |
mkdir build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DENABLE_TESTS=${{ env.ENABLE_TESTS }} \
-DENABLE_STATIC=${{ env.ENABLE_STATIC }} \
-DENABLE_SHARED=${{ env.ENABLE_SHARED }} \
-DGENERATE_POSITION_INDEPENDENT_CODE=ON
cmake --build . --parallel

- name: Run tests
run: |
cd build
ctest --output-on-failure --verbose

# Windows builds
windows:
name: Windows
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-2019, windows-2022]
build_type: [Debug, Release]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
choco install cmake ninja

- name: Configure and build
run: |
mkdir build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DENABLE_TESTS=${{ env.ENABLE_TESTS }} \
-DENABLE_STATIC=${{ env.ENABLE_STATIC }} \
-DENABLE_SHARED=${{ env.ENABLE_SHARED }} \
-G "Ninja"
cmake --build . --parallel

- name: Run tests
run: |
cd build
ctest --output-on-failure --verbose

# Cross-compilation tests
cross-compile:
name: Cross-compilation
runs-on: ubuntu-latest
strategy:
matrix:
target: [arm-linux-gnueabihf, aarch64-linux-gnu, riscv64-linux-gnu]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install cross-compilation toolchains
run: |
sudo apt-get update
sudo apt-get install -y gcc-multilib g++-multilib
if [ "${{ matrix.target }}" = "arm-linux-gnueabihf" ]; then
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
elif [ "${{ matrix.target }}" = "aarch64-linux-gnu" ]; then
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
elif [ "${{ matrix.target }}" = "riscv64-linux-gnu" ]; then
sudo apt-get install -y gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
fi

- name: Configure cross-compilation
run: |
mkdir build-cross
cd build-cross
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=${{ matrix.target }} \
-DCMAKE_C_COMPILER=${{ matrix.target }}-gcc \
-DCMAKE_CXX_COMPILER=${{ matrix.target }}-g++ \
-DENABLE_TESTS=OFF \
-DENABLE_STATIC=ON \
-DENABLE_SHARED=OFF \
-DDISABLE_DYNAMIC_CODE=ON
cmake --build . --parallel

# Code quality checks
code-quality:
name: Code Quality
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake clang-tidy cppcheck

- name: Configure with sanitizers
run: |
mkdir build-sanitize
cd build-sanitize
cmake .. \
-DCMAKE_BUILD_TYPE=Debug \
-DENABLE_SANITIZERS=ON \
-DENABLE_TESTS=ON \
-DENABLE_STATIC=ON \
-DENABLE_SHARED=OFF

- name: Build with sanitizers
run: |
cd build-sanitize
cmake --build . --parallel

- name: Run tests with sanitizers
run: |
cd build-sanitize
ctest --output-on-failure --verbose

- name: Static analysis with clang-tidy
run: |
cd build-sanitize
cmake --build . --target clang-tidy

- name: Static analysis with cppcheck
run: |
cppcheck --enable=all --std=c99 --error-exitcode=1 src/ include/

# Package and release
package:
name: Package
runs-on: ubuntu-latest
needs: [linux-x64, linux-arm64, macos, windows]
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build

- name: Build for packaging
run: |
mkdir build-package
cd build-package
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_TESTS=OFF \
-DENABLE_STATIC=ON \
-DENABLE_SHARED=ON \
-DENABLE_SSE=ON \
-DENABLE_SSE2=ON \
-DENABLE_SSE3=ON
cmake --build . --parallel
cmake --install . --prefix install

- name: Create package
run: |
cd build-package
tar -czf ffts-linux-x64.tar.gz -C install .

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ffts-package
path: build-package/ffts-linux-x64.tar.gz
Loading