Skip to content

Commit

Permalink
[test] CI for Linux, MacOS, and Windows!
Browse files Browse the repository at this point in the history
  • Loading branch information
Quuxplusone committed Oct 19, 2023
1 parent a5e9aef commit f27335e
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 96 deletions.
79 changes: 36 additions & 43 deletions .github/workflows/build-and-run-tests.yml
Original file line number Diff line number Diff line change
@@ -1,49 +1,42 @@
name: Build and run tests

on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]

on: [ 'push' ]
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
build:
test:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true

fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
build_type: [Debug, RelWithDebInfo, Release]
cpp_compiler: [g++, clang++]
cpp_standard: [14, 17, 20, 23]
os: [ windows-latest, macos-latest, ubuntu-latest ]
build_type: [Debug]
cxx_standard: [14, 17, 20, 23]
exclude:
- os: ubuntu-latest
cpp_compiler: clang++
cpp_standard: 20
- os: ubuntu-latest
cpp_compiler: clang++
cpp_standard: 23
- os: windows-latest
cpp_compiler: clang++
- os: windows-latest
cpp_compiler: g++

runs-on: ${{ matrix.os }}

- os: macos-latest
cxx_standard: 23
env:
PREFIX: ${{ github.workspace }}/_local
steps:
- uses: actions/checkout@v3

- name: Install Google Test (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get install libgtest-dev
- name: Build and Test
run: |
cmake -S ${{ github.workspace }} -B ${{ github.workspace }}/build \
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} \
-DCMAKE_CXX_STANDARD=${{ matrix.cpp_standard }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
cd ${{ github.workspace }}/build
make
./bin/utest
# Check out project
- uses: actions/checkout@v3
# Check out dependencies
- uses: actions/checkout@v3
with:
repository: google/googletest
ref: 8d51dc50eb7e7698427fed81b85edad0e032112e
path: googletest
# Manually install dependencies
- name: Install Google Test
run: |
cmake -S googletest -B build/deps/googletest -DCMAKE_BUILD_TYPE=RelWithDebInfo '-DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }}' -DBUILD_GMOCK=OFF -DBUILD_SHARED_LIBS=ON
cmake --build build/deps/googletest --config RelWithDebInfo --target install
# Build and test project
- name: CMake Configure
run: >
cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo '-DCMAKE_PREFIX_PATH=${{ env.PREFIX }}' -DCMAKE_CXX_STANDARD=${{ matrix.cxx_standard }}
- name: CMake Build
run: cmake --build build --config RelWithDebInfo
- name: CTest
run: ctest --test-dir build --config RelWithDebInfo
66 changes: 38 additions & 28 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
cmake_minimum_required(VERSION 3.10)
cmake_minimum_required(VERSION 3.22)
project(sg14 CXX)

include(CheckCXXCompilerFlag)
include(GNUInstallDirs)

find_package(Threads REQUIRED)

# C++17 by default, but allow the user to override it with -DCMAKE_CXX_STANDARD.
set(CMAKE_CXX_EXTENSIONS OFF)
if ("${CMAKE_CXX_STANDARD}" EQUAL 14)
Expand All @@ -17,7 +15,7 @@ if ("${CMAKE_CXX_STANDARD}" EQUAL 14)
elseif (HAVE_FAKEFLAG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
elseif (HAVE_MSVCFLAG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std:c++14 -permissive- -Zc:__cplusplus")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std:c++14 -Zc:__cplusplus -permissive-")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif()
Expand All @@ -30,7 +28,7 @@ elseif ("${CMAKE_CXX_STANDARD}" EQUAL 17)
elseif (HAVE_FAKEFLAG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
elseif (HAVE_MSVCFLAG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std:c++17 -permissive- -Zc:__cplusplus")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std:c++17 -Zc:__cplusplus -permissive-")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++17 support. Please use a different C++ compiler.")
endif()
Expand Down Expand Up @@ -66,38 +64,50 @@ endif()

set(SG14_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include")

# Output binary to predictable location.
set(BINARY_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
if (NOT DEFINED ENV{GITHUB_ACTIONS})
# Output all binaries to ./bin
set(BINARY_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_OUT_DIR})
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
endforeach()
endif()

foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${BINARY_OUT_DIR})
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)

##
# Project
##
add_library(${PROJECT_NAME} INTERFACE)

target_include_directories(${PROJECT_NAME} INTERFACE
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<BUILD_INTERFACE:${SG14_INCLUDE_DIRECTORY}>
)
## Benchmarks ##

# add_subdirectory(benchmarks)


## Tests ##

if (DEFINED ENV{GITHUB_ACTIONS})
include(CTest)
endif()
add_subdirectory(test)

install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}_targets)

## Packaging ##

add_library(${PROJECT_NAME} INTERFACE)

target_include_directories(${PROJECT_NAME} INTERFACE
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<BUILD_INTERFACE:${SG14_INCLUDE_DIRECTORY}>
)
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}_targets
)
install(EXPORT ${PROJECT_NAME}_targets
NAMESPACE ${PROJECT_NAME}::
FILE ${PROJECT_NAME}-config.cmake
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}"
)

install(DIRECTORY "${SG14_INCLUDE_DIRECTORY}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(DIRECTORY "${SG14_INCLUDE_DIRECTORY}"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)
68 changes: 43 additions & 25 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,35 +1,53 @@

find_package(GTest REQUIRED)
include(GoogleTest)

set(TEST_SOURCE_FILES
flat_map_test.cpp
flat_set_test.cpp
hive_test.cpp
inplace_function_test.cpp
inplace_vector_test.cpp
ring_span_test.cpp
slot_map_test.cpp
uninitialized_test.cpp
unstable_remove_test.cpp
add_executable(utest
flat_map_test.cpp
flat_set_test.cpp
hive_test.cpp
inplace_function_test.cpp
inplace_vector_test.cpp
ring_span_test.cpp
slot_map_test.cpp
uninitialized_test.cpp
unstable_remove_test.cpp
)
target_include_directories(utest PRIVATE ${SG14_INCLUDE_DIRECTORY})
target_link_libraries(utest PRIVATE GTest::gtest GTest::gtest_main)

set(TEST_NAME utest)
add_executable(${TEST_NAME} ${TEST_SOURCE_FILES})
include_directories(${GTEST_INCLUDE_DIRS} ${SG14_INCLUDE_DIRECTORY})
target_link_libraries(${TEST_NAME} ${CMAKE_THREAD_LIBS_INIT} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
if (DEFINED ENV{GITHUB_ACTIONS})
if (WIN32)
add_custom_command(
TARGET utest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:utest> $<TARGET_FILE_DIR:utest>
COMMAND_EXPAND_LISTS
)
endif()
gtest_discover_tests(utest)
endif()

## Ad-hoc compiler options ##

# Compile options
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
target_compile_options(${TEST_NAME} PRIVATE -Wall -Wextra -Werror)
set_property(TARGET utest APPEND PROPERTY COMPILE_OPTIONS "-Wall;-Wextra;-Werror")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_compile_options(${TEST_NAME} PRIVATE -Wall -Wextra -Werror)
if (CMAKE_CXX_COMPILER_VERSION MATCHES "^7.*")
set_source_files_properties(${SG14_TEST_SOURCE_DIRECTORY}/slot_map_test.cpp PROPERTIES
COMPILE_FLAGS "-Wno-error=unused-variable -Wno-error=unused-but-set-variable") # Fix gcc7 issues with structured bindings
message("Disabled -Wunused-variable and -Wunused-but-set-variable for gcc ${CMAKE_CXX_COMPILER_VERSION}.")
endif()
set_property(TARGET utest APPEND PROPERTY COMPILE_OPTIONS "-Wall;-Wextra;-Werror")
# GCC 13 gives bogus warnings on local types with typedefs
set_property(SOURCE hive_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-Wno-unused-local-typedefs")
if (CMAKE_CXX_COMPILER_VERSION MATCHES "^7.*")
# GCC 7 gives bogus warnings on structured bindings
set_property(SOURCE slot_map_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-Wno-unused-variable;-Wno-unused-but-set-variable")
endif()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${TEST_NAME})
target_compile_options(${TEST_NAME} PRIVATE /Zc:__cplusplus /permissive- /W4 /WX)
add_definitions(-DNOMINMAX -D_SCL_SECURE_NO_WARNINGS)
set_property(TARGET utest APPEND PROPERTY COMPILE_OPTIONS "-W4;-WX;-DNOMINMAX;-D_SCL_SECURE_NO_WARNINGS")
# MSVC gives bogus "conditional expression is constant" warnings
set_property(SOURCE hive_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-wd4127")
set_property(SOURCE inplace_vector_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-wd4127")
# MSVC gives bogus "possible loss of data" warnings
set_property(SOURCE hive_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-wd4244;-wd4267")
# MSVC gives bogus "unreachable code" warnings
set_property(SOURCE hive_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-wd4702")
# std::aligned_storage_t is deprecated in C++23
set_property(SOURCE inplace_function_test.cpp APPEND PROPERTY COMPILE_OPTIONS "-D_SILENCE_ALL_CXX23_DEPRECATION_WARNINGS")
endif()

0 comments on commit f27335e

Please sign in to comment.