From f27335ee7f028e69b8b1323983680f7b2e8726ba Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Wed, 18 Oct 2023 16:00:17 -0400 Subject: [PATCH] [test] CI for Linux, MacOS, and Windows! Entirely cribbed from https://github.com/alexreinking/so69978314/ --- .github/workflows/build-and-run-tests.yml | 79 +++++++++++------------ CMakeLists.txt | 66 +++++++++++-------- test/CMakeLists.txt | 68 ++++++++++++------- 3 files changed, 117 insertions(+), 96 deletions(-) diff --git a/.github/workflows/build-and-run-tests.yml b/.github/workflows/build-and-run-tests.yml index 822c85e..107c127 100644 --- a/.github/workflows/build-and-run-tests.yml +++ b/.github/workflows/build-and-run-tests.yml @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index ad9cb84..272a0c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) @@ -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() @@ -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() @@ -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 - $ - $ -) +## 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(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}" +) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3d34322..a0f1379 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -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 $ $ + 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()