Skip to content

#25 fixing build after restructure #128

#25 fixing build after restructure

#25 fixing build after restructure #128

name: Main flow
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
CMAKE_VERSION: 3.21.1
NINJA_VERSION: 1.10.2
QT_VERSION : "5.15.2"
BUILD_TYPE: Release
CCACHE_VERSION: 4.4
jobs:
build:
name: Building the binaries for ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "Windows Latest MinGW", artifact: "Windows-MinGW.7z",
os: windows-latest,
cc: "gcc", cxx: "g++"
}
- {
name: "Ubuntu Latest GCC", artifact: "Linux.7z",
os: ubuntu-latest,
cc: "gcc", cxx: "g++"
}
# commented to reduce billed execution time
#- {
# name: "macOS Latest Clang", artifact: "macOS.7z",
# os: macos-latest,
# cc: "clang", cxx: "clang++"
# }
steps:
# TODO to update the name of build dir
#- name : Clean up before build (Linux only)
# if: matrix.config.os == 'ubuntu-latest'
# run: |
# rm -rf build
#- name: Clean up before build (Windows only)
# if: matrix.config.os == 'windows-latest'
# run: |
# cmd /c "rmdir /s /q build"
- name: Checkout FVA repository
uses: actions/checkout@v3
with: #to checkout submodules as well
submodules: 'true'
- name: Download and configure Ninja and CMake.
shell: cmake -P {0}
run: |
set(cmake_version $ENV{CMAKE_VERSION})
set(ninja_version $ENV{NINJA_VERSION})
message(STATUS "Using host CMake version: ${CMAKE_VERSION}")
if ("${{ runner.os }}" STREQUAL "Windows")
set(ninja_suffix "win.zip")
set(cmake_suffix "windows-x86_64.zip")
set(cmake_dir "cmake-${cmake_version}-windows-x86_64/bin")
elseif ("${{ runner.os }}" STREQUAL "Linux")
set(ninja_suffix "linux.zip")
set(cmake_suffix "linux-x86_64.tar.gz")
set(cmake_dir "cmake-${cmake_version}-linux-x86_64/bin")
elseif ("${{ runner.os }}" STREQUAL "macOS")
set(ninja_suffix "mac.zip")
set(cmake_suffix "macos-universal.tar.gz")
set(cmake_dir "cmake-${cmake_version}-macos-universal/CMake.app/Contents/bin")
endif()
set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}")
file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS)
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ninja.zip)
set(cmake_url "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-${cmake_suffix}")
file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS)
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./cmake.zip)
# Add to PATH environment variable
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir)
set(path_separator ":")
if ("${{ runner.os }}" STREQUAL "Windows")
set(path_separator ";")
endif()
file(APPEND "$ENV{GITHUB_PATH}" "$ENV{GITHUB_WORKSPACE}${path_separator}${cmake_dir}")
if (NOT "${{ runner.os }}" STREQUAL "Windows")
execute_process(
COMMAND chmod +x ninja
COMMAND chmod +x ${cmake_dir}/cmake
)
endif()
- name: Download the ccache
id: ccache
shell: cmake -P {0}
run: |
set(ccache_url "https://github.com/cristianadam/ccache/releases/download/v$ENV{CCACHE_VERSION}/${{ runner.os }}.tar.xz")
file(DOWNLOAD "${ccache_url}" ./ccache.tar.xz SHOW_PROGRESS)
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ccache.tar.xz)
- name: Prepare the ccache timestamp
id: ccache_cache_timestamp
shell: cmake -P {0}
run: |
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC)
message("::set-output name=timestamp::${current_date}")
- name: install GoogleTest
if: ${{ steps.cache.output.cache-hit != 'true' }}
run: |
git clone https://github.com/google/googletest.git --branch release-1.12.1
cd googletest
cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/.local" -Dgtest_force_shared_crt=1
cmake --build build --config Release
cmake --build build --target install --config Release
cd ..
- name: Call the ccache to cache files
uses: actions/cache@v3
with:
path: .ccache
key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}
restore-keys: |
${{ matrix.config.name }}-ccache-
- name: Download and install QT
uses: jurplel/install-qt-action@v3
#with: TODO uncoment
# version: ${{ env.QT_VERSION }}
# target: 'desktop'
# arch: 'win64_mingw81'
# setup-python : 'false'
- name: Configure make files by CMake
shell: cmake -P {0}
env:
CMAKE_PREFIX_PATH: ${{env.Qt5_Dir}}
run: |
set(ENV{CC} ${{ matrix.config.cc }})
set(ENV{CXX} ${{ matrix.config.cxx }})
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x")
execute_process(
COMMAND "${{ matrix.config.environment_script }}" && set
OUTPUT_FILE environment_script_output.txt
)
file(STRINGS environment_script_output.txt output_lines)
foreach(line IN LISTS output_lines)
if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}")
endif()
endforeach()
endif()
set(path_separator ":")
if ("${{ runner.os }}" STREQUAL "Windows")
set(path_separator ";")
endif()
set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}")
execute_process(
COMMAND cmake
-S .
-B build
-D CMAKE_BUILD_TYPE=$ENV{BUILD_TYPE}
-G Ninja
-D CMAKE_MAKE_PROGRAM=ninja
-D CMAKE_C_COMPILER_LAUNCHER=ccache
-D CMAKE_CXX_COMPILER_LAUNCHER=ccache
RESULT_VARIABLE result
)
if (NOT result EQUAL 0)
message(FATAL_ERROR "Bad exit status")
endif()
- name: Build the sources
shell: cmake -P {0}
run: |
set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ")
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x")
file(STRINGS environment_script_output.txt output_lines)
foreach(line IN LISTS output_lines)
if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}")
endif()
endforeach()
endif()
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir)
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}")
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache")
set(ENV{CCACHE_COMPRESS} "true")
set(ENV{CCACHE_COMPRESSLEVEL} "6")
set(ENV{CCACHE_MAXSIZE} "400M")
if ("${{ matrix.config.cxx }}" STREQUAL "cl")
set(ENV{CCACHE_MAXSIZE} "600M")
endif()
execute_process(COMMAND ccache -p)
execute_process(COMMAND ccache -z)
execute_process(
COMMAND cmake --build build
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE output
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE
)
if (NOT result EQUAL 0)
string(REGEX MATCH "FAILED:.*$" error_message "${output}")
string(REPLACE "\n" "%0A" error_message "${error_message}")
message("::error::${error_message}")
message(FATAL_ERROR "Build failed")
endif()
- name: Make the ccache statistics
shell: cmake -P {0}
run: |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir)
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}")
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache")
execute_process(COMMAND ccache -s)
- name: Run unit tests based on CTests
shell: cmake -P {0}
run: |
include(ProcessorCount)
ProcessorCount(N)
set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON")
execute_process(
COMMAND ctest -j ${N}
WORKING_DIRECTORY build
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE output
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE
)
if (NOT result EQUAL 0)
string(REGEX MATCH "[0-9]+% tests.*[0-9.]+ sec.*$" test_results "${output}")
string(REPLACE "\n" "%0A" test_results "${test_results}")
message("::error::${test_results}")
message(FATAL_ERROR "Running tests failed!")
endif()
- name: Code coverage using Codecov
if: matrix.config.os == 'ubuntu-latest'
run: |
echo "==================Installing coverage tool====================================="
sudo apt-get update
sudo apt-get -y install lcov
echo "==================Run capture for coverage====================================="
lcov --capture --directory ./build --output-file ./build/coverage.info --ignore-errors mismatch
echo "==================Filtering coverage====================================="
lcov --remove ./build/coverage.info --directory ./build -o ./build/filtered_coverage.info \
'/usr/include/*' \
'/include/gtest/*' \
'*/tests/*' \
'*/googletest/*'
echo "================================= Conversion coverage====================================="
genhtml ./build/filtered_coverage.info --output-directory coverage_report
echo "=========================================================================================="
- name: Install binaries to instdir and stripping them to make binaries smaller by CMake
run: cmake --install build --prefix instdir --strip
- name: Pack the binaries by 7zip
working-directory: instdir
run: cmake -E tar cfv ../${{ matrix.config.artifact }} --format=7zip .
- name: Upload artifact to git hub storage to use later
uses: actions/upload-artifact@v4
with:
path: ./${{ matrix.config.artifact }}
name: ${{ matrix.config.artifact }}
- name: Setup MSBuild
if: matrix.config.os == 'windows-latest'
uses: microsoft/setup-msbuild@v1.3.1
- name: MS package build
if: matrix.config.os == 'windows-latest'
run: >
msbuild ./packaging/ms.wixproj
- name: Upload win pkg to git hub storage
if: matrix.config.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
path: ./packaging/bin/ms.msi
name: ms.msi
- name: Upload LastTest.log to git hub storage
if: matrix.config.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
path: ./build/Testing/Temporary/LastTest.log
name: LastTest.log
- name: Upload CTestCostData.txt to git hub storage
if: matrix.config.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
path: ./build/Testing/Temporary/CTestCostData.txt
name: CTestCostData.txt
- name: Pack Coverage Info by 7zip
if: matrix.config.os == 'ubuntu-latest'
working-directory: coverage_report
run: cmake -E tar cfv ../coverage_report.zip --format=7zip .
- name: Upload Coverage Info to github storage
if: matrix.config.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
path: ./coverage_report.zip
name: coverage_report.zip