From 0754f855c254bef86ca3bcf6af27743a32d9373d Mon Sep 17 00:00:00 2001 From: dcdemen Date: Thu, 25 Jul 2024 10:14:26 -0600 Subject: [PATCH] Rewrote cmake build system to improve organization and usability IMPORTANT CHANGES: Options have been renamed to OpenTurbine_* instead of OTURB Tests are now build by default The unit test executable now lives in tests/unit_tests, not the top level build directory The built libraries now live in src, not the top level build directory To run unit tests which use shared libraries, you must copy them into the directory where you're running your unit test executable. For example, from your build directory, run `cp src/*.dll ./` followed by `./tests/unit_tests/openturbine_unit_tests` --- .github/workflows/clang-tidy.yaml | 9 +- .github/workflows/correctness-linux.yaml | 8 +- .github/workflows/correctness-macos.yaml | 5 +- .github/workflows/cppcheck.yaml | 7 +- CMakeLists.txt | 239 +++--------------- Dependencies.cmake | 23 ++ OpenTurbineOptions.cmake | 75 ++++++ cmake/CompilerWarnings.cmake | 73 ++++++ cmake/GetGitRevisionDescription.cmake | 180 ------------- cmake/GetGitRevisionDescription.cmake.in | 48 ---- cmake/OpenTurbineConfig.cmake.in | 28 -- cmake/OpenTurbineVersion.H.in | 28 -- cmake/PreventInSourceBuilds.cmake | 16 ++ cmake/Sanitizers.cmake | 87 +++++++ cmake/StandardProjectSettings.cmake | 27 ++ cmake/StaticAnalyzers.cmake | 100 ++++++++ cmake/SystemLink.cmake | 83 ++++++ cmake/Tests.cmake | 6 + cmake/openturbine-utils.cmake | 96 ------- cmake/set_compile_flags.cmake | 54 ---- cmake/set_rpath.cmake | 16 -- src/CMakeLists.txt | 82 ++---- src/io/CMakeLists.txt | 7 +- src/restruct_poc/CMakeLists.txt | 2 +- src/utilities/CMakeLists.txt | 10 +- src/utilities/debug_utils.cpp | 4 +- .../{debug_utils.H => debug_utils.hpp} | 0 src/utilities/log.cpp | 2 +- src/utilities/{log.h => log.hpp} | 0 tests/CMakeLists.txt | 93 +------ tests/unit_tests/CMakeLists.txt | 61 ++--- tests/unit_tests/restruct_poc/CMakeLists.txt | 4 +- .../solver/test_copy_into_sparse_matrix.cpp | 2 +- tests/unit_tests/restruct_poc/test_math.cpp | 2 +- .../restruct_poc/test_utilities.hpp | 2 - tests/unit_tests/test_config.cpp | 70 ----- 36 files changed, 596 insertions(+), 953 deletions(-) create mode 100644 Dependencies.cmake create mode 100644 OpenTurbineOptions.cmake create mode 100644 cmake/CompilerWarnings.cmake delete mode 100644 cmake/GetGitRevisionDescription.cmake delete mode 100644 cmake/GetGitRevisionDescription.cmake.in delete mode 100644 cmake/OpenTurbineConfig.cmake.in delete mode 100644 cmake/OpenTurbineVersion.H.in create mode 100644 cmake/PreventInSourceBuilds.cmake create mode 100644 cmake/Sanitizers.cmake create mode 100644 cmake/StandardProjectSettings.cmake create mode 100644 cmake/StaticAnalyzers.cmake create mode 100644 cmake/SystemLink.cmake create mode 100644 cmake/Tests.cmake delete mode 100644 cmake/openturbine-utils.cmake delete mode 100644 cmake/set_compile_flags.cmake delete mode 100644 cmake/set_rpath.cmake rename src/utilities/{debug_utils.H => debug_utils.hpp} (100%) rename src/utilities/{log.h => log.hpp} (100%) delete mode 100644 tests/unit_tests/test_config.cpp diff --git a/.github/workflows/clang-tidy.yaml b/.github/workflows/clang-tidy.yaml index b1a95e4b..3c2d89be 100644 --- a/.github/workflows/clang-tidy.yaml +++ b/.github/workflows/clang-tidy.yaml @@ -6,7 +6,7 @@ jobs: ClangTidy: runs-on: ubuntu-latest env: - CMAKE_BUILD_PARALLEL_LEVEL: 1 + CMAKE_BUILD_PARALLEL_LEVEL: 4 strategy: fail-fast: false steps: @@ -39,8 +39,7 @@ jobs: mkdir build-clangtidy cd build-clangtidy cmake .. \ - -DOTURB_ENABLE_TESTS:BOOL=ON \ - -DOTURB_ENABLE_BASIC_SANITIZERS=ON \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_CXX_CLANG_TIDY="clang-tidy" + -DOpenTurbine_ENABLE_CLANG_TIDY=ON \ + -DOpenTurbine_WARNINGS_AS_ERRORS=OFF \ + -DCMAKE_BUILD_TYPE=Debug cmake --build . \ No newline at end of file diff --git a/.github/workflows/correctness-linux.yaml b/.github/workflows/correctness-linux.yaml index 5bd5135d..feaab266 100644 --- a/.github/workflows/correctness-linux.yaml +++ b/.github/workflows/correctness-linux.yaml @@ -44,8 +44,10 @@ jobs: mkdir build cd build cmake .. \ - -DOTURB_ENABLE_TESTS:BOOL=ON \ - -DOTURB_ENABLE_BASIC_SANITIZERS=ON \ + -DOpenTurbine_ENABLE_SANITIZER_ADDRESS=ON \ + -DOpenTurbine_ENABLE_SANITIZER_LEAK=ON \ + -DOpenTurbine_ENABLE_SANITIZER_UNDEFINED=ON \ -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} cmake --build . - ctest -C ${{ matrix.build_type }} --output-on-failure + cp src/*.dll tests/unit_tests/ + ctest --output-on-failure diff --git a/.github/workflows/correctness-macos.yaml b/.github/workflows/correctness-macos.yaml index 1f72127a..3df0f26c 100644 --- a/.github/workflows/correctness-macos.yaml +++ b/.github/workflows/correctness-macos.yaml @@ -42,8 +42,9 @@ jobs: mkdir build cd build cmake .. \ - -DOTURB_ENABLE_TESTS:BOOL=ON \ - -DOTURB_ENABLE_BASIC_SANITIZERS=ON \ + -DOpenTurbine_ENABLE_SANITIZER_ADDRESS=ON \ + -DOpenTurbine_ENABLE_SANITIZER_UNDEFINED=ON \ -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} cmake --build . + cp src/*.dll tests/unit_tests/ ctest --output-on-failure diff --git a/.github/workflows/cppcheck.yaml b/.github/workflows/cppcheck.yaml index 604283ef..66a4754c 100644 --- a/.github/workflows/cppcheck.yaml +++ b/.github/workflows/cppcheck.yaml @@ -6,7 +6,7 @@ jobs: CppCheck: runs-on: ubuntu-latest env: - CMAKE_BUILD_PARALLEL_LEVEL: 1 + CMAKE_BUILD_PARALLEL_LEVEL: 4 CXX: clang++ strategy: fail-fast: false @@ -41,8 +41,7 @@ jobs: mkdir build-cppcheck cd build-cppcheck cmake .. \ - -DOTURB_ENABLE_TESTS:BOOL=ON \ - -DOTURB_ENABLE_BASIC_SANITIZERS=ON \ + -DOpenTurbine_ENABLE_CPPCHECK=ON \ + -DOpenTurbine_WARNINGS_AS_ERRORS=OFF \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;--error-exitcode=0;--suppress=missingInclude;--library=googletest" cmake --build . \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a59791b..e8ea571c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,227 +1,46 @@ +cmake_minimum_required (VERSION 3.21 FATAL_ERROR) -############################ BASE ###################################### - -cmake_minimum_required (VERSION 3.20 FATAL_ERROR) -project(OpenTurbine LANGUAGES CXX) - -set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") -list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -include(CMakePackageConfigHelpers) -include(GNUInstallDirs) -include(openturbine-utils) - -########################## OPTIONS ##################################### - -# General options for the project -option(OTURB_ENABLE_BASIC_SANITIZERS "Compile with addrss and undefined behavior sanitizers" OFF) -if(OTURB_ENABLE_BASIC_SANITIZERS) - add_compile_options(-fsanitize=address,undefined) - add_link_options(-fsanitize=address,undefined) -endif() - -# Enable VTK output -option(OTURB_ENABLE_VTK "Enable VTK output" OFF) -if(OTURB_ENABLE_VTK) - find_package(VTK REQUIRED IOXML) - add_compile_definitions(OTURB_ENABLE_VTK) +if (NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) endif() -# option(OTURB_ENABLE_CLANG_TIDY "Compile with clang-tidy static analysis" OFF) -# option(OTURB_ENABLE_CPPCHECK "Enable cppcheck static analysis target" OFF) -# option(OTURB_ENABLE_FCOMPARE "Enable building fcompare when not testing" OFF) - -# Set RELEASE as default build type if none provided -set(SUPPORTED_BUILD_TYPES Debug Release RelWithDebInfo MinSizeRel) -string(REPLACE ";" " " SUPPORTED_BUILD_TYPES_STRING "${SUPPORTED_BUILD_TYPES}") - -if(NOT CMAKE_BUILD_TYPE) - message(WARNING "No Build type provided - using RELEASE as default") - set( - CMAKE_BUILD_TYPE Release CACHE STRING - "Select the type of build from options: ${SUPPORTED_BUILD_TYPES_STRING}" - FORCE - ) -endif() - -# Make build type case-insensitive and check for supported values -string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) -string(TOUPPER "${SUPPORTED_BUILD_TYPES}" SUPPORTED_BUILD_TYPES_UPPER) - -if(NOT BUILD_TYPE_UPPER IN_LIST SUPPORTED_BUILD_TYPES_UPPER) - message(WARNING "Build type ${CMAKE_BUILD_TYPE} is NOT supported - reverting to RELEASE") - set( - CMAKE_BUILD_TYPE RELEASE CACHE STRING - "Select the type of build from options: ${SUPPORTED_BUILD_TYPES_STRING}" - FORCE - ) -endif() - -# Add some defs based on the build type -if(BUILD_TYPE_UPPER STREQUAL "RELEASE" OR BUILD_TYPE_UPPER STREQUAL "MINSIZEREL") - add_definitions(-DRELEASE) -elseif(BUILD_TYPE_UPPER STREQUAL "DEBUG" OR BUILD_TYPE_UPPER STREQUAL "RELWITHDEBINFO") - add_definitions(-DDEBUG) -endif() - -# Enabling tests overrides the executable options -option(OTURB_ENABLE_TESTS "Enable testing suite" OFF) - -# Options for the executable -option(OTURB_ENABLE_OPENMP "Enable OpenMP" OFF) -option(OTURB_ENABLE_CUDA "Enable CUDA" OFF) -option(OTURB_ENABLE_ROCM "Enable ROCm/HIP" OFF) -option(OTURB_ENABLE_DPCPP "Enable Intel OneAPI DPC++" OFF) -set(OTURB_PRECISION "DOUBLE" CACHE STRING "Floating point precision SINGLE or DOUBLE") - -# Options for C++ -set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -if(OTURB_ENABLE_CUDA) -else() - add_compile_options(-Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wpedantic -Werror) -endif() -if(OTURB_ENABLE_CUDA) - enable_language(CUDA) - if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "10.0") - message(FATAL_ERROR "Your nvcc version is ${CMAKE_CUDA_COMPILER_VERSION} which is unsupported." - "Please use CUDA toolkit version 10.0 or newer.") - endif() -endif() - -if(OTURB_ENABLE_ROCM) - find_package(HIP REQUIRED) - if(NOT DEFINED AMD_ARCH) - # Set default AMD architectures (based on Frontier) - set(AMD_ARCH "gfx90a") - endif() -endif() - -if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - set(OTURB_ENABLE_FPE_TRAP_FOR_TESTS OFF) - message(WARNING "Disabling FPE trapping for tests when using AppleClang.") -endif() +project( + OpenTurbine + VERSION 0.0.0 + DESCRIPTION "Wind turbine structural dynamics simulation code" + LANGUAGES CXX) -############################# OpenTurbine ############################## +include(cmake/PreventInSourceBuilds.cmake) +include(OpenTurbineOptions.cmake) -generate_version_info() +openturbine_setup_options() -# General information about machine, compiler, and build type -message(STATUS "OpenTurbine Information:") -message(STATUS "VERSION = ${OTURB_VERSION_TAG}-${OTURB_REPO_DIRTY}") -message(STATUS "CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}") -message(STATUS "CMAKE_CXX_COMPILER_ID = ${CMAKE_CXX_COMPILER_ID}") -message(STATUS "CMAKE_CXX_COMPILER_VERSION = ${CMAKE_CXX_COMPILER_VERSION}") -message(STATUS "CMAKE_BUILD_TYPE = ${BUILD_TYPE_UPPER}") +openturbine_global_options() +include(Dependencies.cmake) +openturbine_setup_dependencies() -include(set_rpath) +openturbine_local_options() -# Create target names -set(oturb_lib_name "openturbine_obj") -set(oturb_exe_name "openturbine") -set(oturb_unit_test_exe_name "${oturb_exe_name}_unit_tests") -set(oturb_api_lib "openturbine_api") - -# Create main target executable -add_executable(${oturb_exe_name}) -add_library(${oturb_lib_name} OBJECT) -# add_library(${oturb_api_lib}) +set( + GIT_SHA + "Unknown" + CACHE STRING "SHA this build was generated from") +STRING( + SUBSTRING "${GIT_SHA}" + 0 + 8 + GIT_SHORT_SHA +) -init_code_checks() -if(CLANG_TIDY_EXE) - set_target_properties( - ${oturb_exe_name} ${oturb_lib_name} # ${oturb_api_lib} - PROPERTIES CXX_CLANG_TIDY ${CLANG_TIDY_EXE} - ) -endif() +add_library(OpenTurbine::openturbine_options ALIAS openturbine_options) +add_library(OpenTurbine::openturbine_warnings ALIAS openturbine_warnings) -# Build OpenTurbine add_subdirectory(src) -if(OTURB_ENABLE_CUDA) - set(oturb_targets "${oturb_lib_name};${oturb_exe_name}") - foreach(tgt IN LISTS oturb_targets) - set_cuda_build_properties(${tgt}) - # get_target_property(OTURB_SOURCES ${tgt} SOURCES) - # list(FILTER OTURB_SOURCES INCLUDE REGEX "\\.cpp") - # set_source_files_properties(${OTURB_SOURCES} PROPERTIES LANGUAGE CUDA) - endforeach() -endif() - -if(OTURB_ENABLE_UNIT_TESTS OR OTURB_ENABLE_TESTS) - add_executable(${oturb_unit_test_exe_name}) - if(CLANG_TIDY_EXE) - set_target_properties( - ${oturb_unit_test_exe_name} - PROPERTIES CXX_CLANG_TIDY ${CLANG_TIDY_EXE} - ) - endif() - add_subdirectory("tests/unit_tests") - set_cuda_build_properties(${oturb_unit_test_exe_name}) - if(OTURB_ENABLE_CUDA) -# get_target_property(UTEST_SOURCES ${oturb_unit_test_exe_name} SOURCES) -# set_source_files_properties(${UTEST_SOURCES} PROPERTIES LANGUAGE CUDA) -# set_target_properties(${oturb_unit_test_exe_name} PROPERTIES -# CUDA_SEPARABLE_COMPILATION ON) - endif() - include(GoogleTest) - gtest_discover_tests(${oturb_unit_test_exe_name} PROPERTIES DISCOVERY_TIMEOUT 60000) -endif() +include(CTest) -# add_subdirectory(tools) - -if(OTURB_ENABLE_TESTS) - include(CTest) +if(${OpenTurbine_ENABLE_TESTS}) add_subdirectory(tests) endif() - -# Define what we want to be installed during a make install -install( - TARGETS ${oturb_exe_name} ${oturb_lib_name} # ${oturb_api_lib} - EXPORT ${PROJECT_NAME}Targets - RUNTIME DESTINATION bin - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib -) - -if(OTURB_ENABLE_UNIT_TESTS OR OTURB_ENABLE_TESTS) - install( - TARGETS ${oturb_unit_test_exe_name} - RUNTIME DESTINATION bin - ) -endif() - -install( - DIRECTORY ${PROJECT_SOURCE_DIR}/src - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - FILES_MATCHING PATTERN "*.H" -) - -install( - EXPORT ${PROJECT_NAME}Targets - NAMESPACE ${PROJECT_NAME}:: - DESTINATION lib/cmake/${PROJECT_NAME} -) - -configure_package_config_file( - cmake/${PROJECT_NAME}Config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - INSTALL_DESTINATION lib/cmake/${PROJECT_NAME} -) - -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - DESTINATION lib/cmake/${PROJECT_NAME} -) - -# Build DISCON.cpp into a shared library -add_library(DISCON SHARED "${PROJECT_SOURCE_DIR}/src/utilities/controllers/discon.cpp") -set_target_properties(DISCON PROPERTIES PREFIX "" SUFFIX ".dll") - -# Build DISCON_ROTOR_TEST_CONTROLLER.cpp into a shared library if tests are enabled -if(OTURB_ENABLE_TESTS) - add_library(DISCON_ROTOR_TEST_CONTROLLER SHARED "${PROJECT_SOURCE_DIR}/src/utilities/controllers/discon_rotor_test_controller.cpp") - set_target_properties(DISCON_ROTOR_TEST_CONTROLLER PROPERTIES PREFIX "" SUFFIX ".dll") -endif() diff --git a/Dependencies.cmake b/Dependencies.cmake new file mode 100644 index 00000000..ac1c5d67 --- /dev/null +++ b/Dependencies.cmake @@ -0,0 +1,23 @@ +function(openturbine_setup_dependencies) + find_package(KokkosKernels REQUIRED) + + find_package(Amesos2 REQUIRED) + + if(TARGET Kokkos::MKL) + find_package(MKL REQUIRED) + endif() + + if(OpenTurbine_ENABLE_VTK) + find_package(VTK REQUIRED IOXML) + endif() + + if(OpenTurbine_ENABLE_TESTS) + find_package(GTest REQUIRED) + endif() + + if(CMAKE_CXX_COMPILER_ID MATCHES GNU) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") + set(FS_LIB stdc++fs) + endif() + endif() +endfunction() \ No newline at end of file diff --git a/OpenTurbineOptions.cmake b/OpenTurbineOptions.cmake new file mode 100644 index 00000000..a2ff2eef --- /dev/null +++ b/OpenTurbineOptions.cmake @@ -0,0 +1,75 @@ +include(cmake/SystemLink.cmake) + +macro(openturbine_setup_options) + option(OpenTurbine_ENABLE_TESTS "Build Tests" ON) + option(OpenTurbine_ENABLE_COVERAGE "Enable coverage reporting" OFF) + option(OpenTurbine_ENABLE_IPO "Enable IPO/LTO" OFF) + option(OpenTurbine_WARNINGS_AS_ERRORS "Treat Warnings As Errors" ON) + option(OpenTurbine_ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" OFF) + option(OpenTurbine_ENABLE_SANITIZER_LEAK "Enable leak sanitizer" OFF) + option(OpenTurbine_ENABLE_SANITIZER_UNDEFINED "Enable undefined sanitizer" OFF) + option(OpenTurbine_ENABLE_SANITIZER_THREAD "Enable thread sanitizer" OFF) + option(OpenTurbine_ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF) + option(OpenTurbine_ENABLE_UNITY_BUILD "Enable unity builds" OFF) + option(OpenTurbine_ENABLE_CLANG_TIDY "Enable clang-tidy" OFF) + option(OpenTurbine_ENABLE_CPPCHECK "Enable CppCheck analysis" OFF) + option(OpenTurbine_ENABLE_PCH "Enable precompiled headers" OFF) + option(OpenTurbine_ENABLE_VTK "Use VTK for visualization" OFF) +endmacro() + +macro(openturbine_global_options) + if(OpenTurbine_ENABLE_IPO) + include(cmake/InterproceduralOptimization.cmake) + openturbine_enable_ipo() + endif() +endmacro() + +macro(openturbine_local_options) + include(cmake/StandardProjectSettings.cmake) + add_library(openturbine_warnings INTERFACE) + add_library(openturbine_options INTERFACE) + + include(cmake/CompilerWarnings.cmake) + openturbine_set_project_warnings( + openturbine_warnings + ${OpenTurbine_WARNINGS_AS_ERRORS} + "" + "" + "" + ) + + include(cmake/Sanitizers.cmake) + openturbine_enable_sanitizers( + openturbine_options + ${OpenTurbine_ENABLE_SANITIZER_ADDRESS} + ${OpenTurbine_ENABLE_SANITIZER_LEAK} + ${OpenTurbine_ENABLE_SANITIZER_UNDEFINED} + ${OpenTurbine_ENABLE_SANITIZER_THREAD} + ${OpenTurbine_ENABLE_SANITIZER_MEMORY} + ) + + set_target_properties(openturbine_options PROPERTIES UNITY_BUILD ${OpenTurbine_ENABLE_UNITY_BUILD}) + + if(OpenTurbine_ENABLE_PCH) + target_precompile_headers( + openturbine_options + INTERFACE + + + ) + endif() + + include(cmake/StaticAnalyzers.cmake) + if(OpenTurbine_ENABLE_CLANG_TIDY) + openturbine_enable_clang_tidy(openturbine_options ${OpenTurbine_WARNINGS_AS_ERRORS}) + endif() + + if(OpenTurbine_ENABLE_CPPCHECK) + openturbine_enable_cppcheck(${OpenTurbine_WARNINGS_AS_ERRORS} "") + endif() + + if(OpenTurbine_ENABLE_COVERAGE) + include(cmake/Tests.cmake) + openturbine_enable_coverage(openturbine_options) + endif() +endmacro() \ No newline at end of file diff --git a/cmake/CompilerWarnings.cmake b/cmake/CompilerWarnings.cmake new file mode 100644 index 00000000..199f87fc --- /dev/null +++ b/cmake/CompilerWarnings.cmake @@ -0,0 +1,73 @@ +function( + openturbine_set_project_warnings + project_name + WARNINGS_AS_ERRORS + CLANG_WARNINGS + GCC_WARNINGS + CUDA_WARNINGS) + if("${CLANG_WARNINGS}" STREQUAL "") + set(CLANG_WARNINGS + -Wall + -Wextra # reasonable and standard + -Wshadow # warn the user if a variable declaration shadows one from a parent context + -Wnon-virtual-dtor # warn the user if a class with virtual functions has a non-virtual destructor. This helps + # catch hard to track down memory errors + #-Wold-style-cast # warn for c-style casts + -Wcast-align # warn for potential performance problem casts + -Wunused # warn on anything being unused + -Woverloaded-virtual # warn if you overload (not override) a virtual function + -Wpedantic # warn if non-standard C++ is used + #-Wconversion # warn on type conversions that may lose data + #-Wsign-conversion # warn on sign conversions + -Wnull-dereference # warn if a null dereference is detected + #-Wdouble-promotion # warn if float is implicit promoted to double + -Wformat=2 # warn on security issues around functions that format output (ie printf) + -Wimplicit-fallthrough # warn on statements that fallthrough without an explicit annotation + ) + endif() + + if("${GCC_WARNINGS}" STREQUAL "") + set(GCC_WARNINGS + ${CLANG_WARNINGS} + -Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist + -Wduplicated-cond # warn if if / else chain has duplicated conditions + -Wduplicated-branches # warn if if / else branches have duplicated code + -Wlogical-op # warn about logical operations being used where bitwise were probably wanted + -Wuseless-cast # warn if you perform a cast to the same type + -Wsuggest-override # warn if an overridden member function is not marked 'override' or 'final' + ) + endif() + + if("${CUDA_WARNINGS}" STREQUAL "") + set(CUDA_WARNINGS + -Wall + -Wextra + -Wunused + -Wconversion + -Wshadow + ) + endif() + + if(WARNINGS_AS_ERRORS) + message(TRACE "Warnings are treated as errors") + list(APPEND CLANG_WARNINGS -Werror) + list(APPEND GCC_WARNINGS -Werror) + endif() + + if(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + set(PROJECT_WARNINGS_CXX ${CLANG_WARNINGS}) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PROJECT_WARNINGS_CXX ${GCC_WARNINGS}) + else() + message(AUTHOR_WARNING "No compiler warnings set for CXX compiler: '${CMAKE_CXX_COMPILER_ID}'") + endif() + + set(PROJECT_WARNINGS_CUDA "${CUDA_WARNINGS}") + + target_compile_options( + ${project_name} + INTERFACE + $<$:${PROJECT_WARNINGS_CXX}> + $<$:${PROJECT_WARNINGS_CUDA}>) + +endfunction() \ No newline at end of file diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake deleted file mode 100644 index 96dfc333..00000000 --- a/cmake/GetGitRevisionDescription.cmake +++ /dev/null @@ -1,180 +0,0 @@ -# This file was retrieved from https://github.com/rpavlik/cmake-modules/ -# The Git commit SHA: ad436ee7be33ca291a59866a173b777b0e2d81ce -# Retrieved on: Feb 12, 2018 -# -# Original copyright notice and licensing information is preserved below -################################################################################ - -# - Returns a version string from Git -# -# These functions force a re-configure on each git commit so that you can -# trust the values of the variables in your build system. -# -# get_git_head_revision( [ ...]) -# -# Returns the refspec and sha hash of the current head revision -# -# git_describe( [ ...]) -# -# Returns the results of git describe on the source tree, and adjusting -# the output so that it tests false if an error occurs. -# -# git_get_exact_tag( [ ...]) -# -# Returns the results of git describe --exact-match on the source tree, -# and adjusting the output so that it tests false if there was no exact -# matching tag. -# -# git_local_changes() -# -# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. -# Uses the return code of "git diff-index --quiet HEAD --". -# Does not regard untracked files. -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -if(__get_git_revision_description) - return() -endif() -set(__get_git_revision_description YES) - -# We must run the following at "include" time, not at function call time, -# to find the path to this module rather than the path to a calling list file -get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) - -function(get_git_head_revision _refspecvar _hashvar) - set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - if(NOT EXISTS "${GIT_DIR}") - set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - return() - endif() - # while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories - # set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") - # get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) - # if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) - # # We have reached the root directory, we are not in git - # set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - # set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - # return() - # endif() - # set(GIT_DIR "${GIT_PARENT_DIR}/.git") - # endwhile() - # check if this is a submodule - if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) - endif() - set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") - if(NOT EXISTS "${GIT_DATA}") - file(MAKE_DIRECTORY "${GIT_DATA}") - endif() - - if(NOT EXISTS "${GIT_DIR}/HEAD") - return() - endif() - set(HEAD_FILE "${GIT_DATA}/HEAD") - configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) - - configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" - "${GIT_DATA}/grabRef.cmake" - @ONLY) - include("${GIT_DATA}/grabRef.cmake") - - set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) - set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) -endfunction() - -function(git_describe _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - if(NOT hash) - set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - return() - endif() - - # TODO sanitize - #if((${ARGN}" MATCHES "&&") OR - # (ARGN MATCHES "||") OR - # (ARGN MATCHES "\\;")) - # message("Please report the following error to the project!") - # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") - #endif() - - # message(STATUS "Arguments to execute_process: ${ARGN}") - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - describe - ${hash} - ${ARGN} - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() - - set(${_var} "${out}" PARENT_SCOPE) -endfunction() - -function(git_get_exact_tag _var) - git_describe(out --exact-match ${ARGN}) - set(${_var} "${out}" PARENT_SCOPE) -endfunction() - -function(git_local_changes _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - if(NOT hash) - set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - return() - endif() - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - diff-index --quiet HEAD -- - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(res EQUAL 0) - set(${_var} "CLEAN" PARENT_SCOPE) - else() - set(${_var} "DIRTY" PARENT_SCOPE) - endif() -endfunction() diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in deleted file mode 100644 index 85a1a5f2..00000000 --- a/cmake/GetGitRevisionDescription.cmake.in +++ /dev/null @@ -1,48 +0,0 @@ -# This file was retrieved from https://github.com/rpavlik/cmake-modules/ -# The Git commit SHA: ad436ee7be33ca291a59866a173b777b0e2d81ce -# Retrieved on: Feb 12, 2018 -# -# Original copyright notice and licensing information is preserved below -################################################################################ - -# -# Internal file for GetGitRevisionDescription.cmake -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -set(HEAD_HASH) - -file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) - -string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -if(HEAD_CONTENTS MATCHES "ref") - # named branch - string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") - if(EXISTS "@GIT_DIR@/${HEAD_REF}") - configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - else() - configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) - file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_HASH "${CMAKE_MATCH_1}") - endif() - endif() -else() - # detached HEAD - configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) -endif() - -if(NOT HEAD_HASH) - file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) - string(STRIP "${HEAD_HASH}" HEAD_HASH) -endif() diff --git a/cmake/OpenTurbineConfig.cmake.in b/cmake/OpenTurbineConfig.cmake.in deleted file mode 100644 index 18980d73..00000000 --- a/cmake/OpenTurbineConfig.cmake.in +++ /dev/null @@ -1,28 +0,0 @@ -@PACKAGE_INIT@ - -list(APPEND CMAKE_MODULE_PATH "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_DATADIR@/cmake/Modules") - -# set(OTURB_ENABLE_MASA @OTURB_ENABLE_MASA@) -# set(OTURB_ENABLE_NETCDF @OTURB_ENABLE_NETCDF@) - -# if (${OTURB_ENABLE_MASA}) -# set(MASA_DIR @MASA_DIR@) -# find_package(MASA QUIET REQUIRED) -# endif() - -# if (${OTURB_ENABLE_NETCDF}) -# set(NetCDF_DIR @NETCDF_DIR@) -# set(NETCDF_DIR @NETCDF_DIR@) -# find_package(NetCDF QUIET REQUIRED) -# endif() - -set(OTURB_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_INCLUDEDIR@") -set(OTURB_LIBRARY_DIRS "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_LIBDIR@") - -include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") - -set(OTURB_LIBRARIES "@PROJECT_NAME@::@oturb_api_lib@") - -set(OTURB_FOUND TRUE) - -check_required_components(OTURB) diff --git a/cmake/OpenTurbineVersion.H.in b/cmake/OpenTurbineVersion.H.in deleted file mode 100644 index 77d8766d..00000000 --- a/cmake/OpenTurbineVersion.H.in +++ /dev/null @@ -1,28 +0,0 @@ -/** - * AUTOGENERATED by CMake. DO NOT EDIT!!! - * - * Generated at @OTURB_VERSION_TIMESTAMP@ - * - */ -#ifndef OPENTURBINEVERSION_H -#define OPENTURBINEVERSION_H - -namespace openturbine { -namespace version { - -#cmakedefine OTURB_HAVE_GIT_INFO - -#ifdef OTURB_HAVE_GIT_INFO -const std::string oturb_version = "@OTURB_VERSION_TAG@"; -const std::string oturb_git_sha = "@OTURB_GIT_COMMIT_SHA@"; -const std::string oturb_dirty_repo = "@OTURB_REPO_DIRTY@"; -#else -const std::string oturb_version = "v0.0.0"; -const std::string oturb_git_sha = "UNKNOWM"; -const std::string oturb_dirty_repo = "UNKNOWN"; -#endif - -} // namespace version -} // namespace openturbine - -#endif /* OPENTURBINEVERSION_H */ \ No newline at end of file diff --git a/cmake/PreventInSourceBuilds.cmake b/cmake/PreventInSourceBuilds.cmake new file mode 100644 index 00000000..dd877428 --- /dev/null +++ b/cmake/PreventInSourceBuilds.cmake @@ -0,0 +1,16 @@ +function(openturbine_assure_out_of_source_builds) + # make sure the user doesn't play dirty with symlinks + get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) + get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH) + + # disallow in-source builds + if("${srcdir}" STREQUAL "${bindir}") + message("######################################################") + message("Warning: in-source builds are disabled") + message("Please create a separate build directory and run cmake from there") + message("######################################################") + message(FATAL_ERROR "Quitting configuration") + endif() +endfunction() + +openturbine_assure_out_of_source_builds() \ No newline at end of file diff --git a/cmake/Sanitizers.cmake b/cmake/Sanitizers.cmake new file mode 100644 index 00000000..17b5e480 --- /dev/null +++ b/cmake/Sanitizers.cmake @@ -0,0 +1,87 @@ +function( + openturbine_enable_sanitizers + project_name + ENABLE_SANITIZER_ADDRESS + ENABLE_SANITIZER_LEAK + ENABLE_SANITIZER_UNDEFINED_BEHAVIOR + ENABLE_SANITIZER_THREAD + ENABLE_SANITIZER_MEMORY) + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + set(SANITIZERS "") + + if(${ENABLE_SANITIZER_ADDRESS}) + list(APPEND SANITIZERS "address") + endif() + + if(${ENABLE_SANITIZER_LEAK}) + list(APPEND SANITIZERS "leak") + endif() + + if(${ENABLE_SANITIZER_UNDEFINED_BEHAVIOR}) + list(APPEND SANITIZERS "undefined") + endif() + + if(${ENABLE_SANITIZER_THREAD}) + if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS) + message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled") + else() + list(APPEND SANITIZERS "thread") + endif() + endif() + + if(${ENABLE_SANITIZER_MEMORY} AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + message( + WARNING + "Memory sanitizer requires all the code (including libc++) to be MSan-instrumented otherwise it reports false positives" + ) + if("address" IN_LIST SANITIZERS + OR "thread" IN_LIST SANITIZERS + OR "leak" IN_LIST SANITIZERS) + message(WARNING "Memory sanitizer does not work with Address, Thread or Leak sanitizer enabled") + else() + list(APPEND SANITIZERS "memory") + endif() + endif() + elseif(MSVC) + if(${ENABLE_SANITIZER_ADDRESS}) + list(APPEND SANITIZERS "address") + endif() + if(${ENABLE_SANITIZER_LEAK} + OR ${ENABLE_SANITIZER_UNDEFINED_BEHAVIOR} + OR ${ENABLE_SANITIZER_THREAD} + OR ${ENABLE_SANITIZER_MEMORY}) + message(WARNING "MSVC only supports address sanitizer") + endif() + endif() + + list( + JOIN + SANITIZERS + "," + LIST_OF_SANITIZERS) + + if(LIST_OF_SANITIZERS) + if(NOT + "${LIST_OF_SANITIZERS}" + STREQUAL + "") + if(NOT MSVC) + target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) + target_link_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) + else() + string(FIND "$ENV{PATH}" "$ENV{VSINSTALLDIR}" index_of_vs_install_dir) + if("${index_of_vs_install_dir}" STREQUAL "-1") + message( + SEND_ERROR + "Using MSVC sanitizers requires setting the MSVC environment before building the project. Please manually open the MSVC command prompt and rebuild the project." + ) + endif() + target_compile_options(${project_name} INTERFACE /fsanitize=${LIST_OF_SANITIZERS} /Zi /INCREMENTAL:NO) + target_compile_definitions(${project_name} INTERFACE _DISABLE_VECTOR_ANNOTATION _DISABLE_STRING_ANNOTATION) + target_link_options(${project_name} INTERFACE /INCREMENTAL:NO) + endif() + endif() + endif() + +endfunction() \ No newline at end of file diff --git a/cmake/StandardProjectSettings.cmake b/cmake/StandardProjectSettings.cmake new file mode 100644 index 00000000..8ef31a0b --- /dev/null +++ b/cmake/StandardProjectSettings.cmake @@ -0,0 +1,27 @@ +# Set a default build type if none was specified +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.") + set(CMAKE_BUILD_TYPE + RelWithDebInfo + CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui, ccmake + set_property( + CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS + "Debug" + "Release" + "MinSizeRel" + "RelWithDebInfo") +endif() + +# Generate compile_commands.json to make it easier to work with clang based tools +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Enhance error reporting and compiler messages +if(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + add_compile_options(-fcolor-diagnostics) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + add_compile_options(-fdiagnostics-color=always) +else() + message(STATUS "No colored compiler diagnostic set for '${CMAKE_CXX_COMPILER_ID}' compiler.") +endif() \ No newline at end of file diff --git a/cmake/StaticAnalyzers.cmake b/cmake/StaticAnalyzers.cmake new file mode 100644 index 00000000..cd9fec3f --- /dev/null +++ b/cmake/StaticAnalyzers.cmake @@ -0,0 +1,100 @@ +macro(openturbine_enable_cppcheck WARNINGS_AS_ERRORS CPPCHECK_OPTIONS) + find_program(CPPCHECK cppcheck) + if(CPPCHECK) + + if(CMAKE_GENERATOR MATCHES ".*Visual Studio.*") + set(CPPCHECK_TEMPLATE "vs") + else() + set(CPPCHECK_TEMPLATE "gcc") + endif() + + if("${CPPCHECK_OPTIONS}" STREQUAL "") + # Enable all warnings that are actionable by the user of this toolset + # style should enable the other 3, but we'll be explicit just in case + set(SUPPRESS_DIR "*:${CMAKE_CURRENT_BINARY_DIR}/_deps/*.h") + message(STATUS "CPPCHECK_OPTIONS suppress: ${SUPPRESS_DIR}") + set(CMAKE_CXX_CPPCHECK + ${CPPCHECK} + --template=${CPPCHECK_TEMPLATE} + --enable=style,performance,warning,portability + --inline-suppr + # We cannot act on a bug/missing feature of cppcheck + --suppress=cppcheckError + --suppress=internalAstError + # if a file does not have an internalAstError, we get an unmatchedSuppression error + --suppress=unmatchedSuppression + # noisy and incorrect sometimes + --suppress=passedByValue + # ignores code that cppcheck thinks is invalid C++ + --suppress=syntaxError + --suppress=preprocessorErrorDirective + --inconclusive + --suppress=${SUPPRESS_DIR}) + else() + # if the user provides a CPPCHECK_OPTIONS with a template specified, it will override this template + set(CMAKE_CXX_CPPCHECK ${CPPCHECK} --template=${CPPCHECK_TEMPLATE} ${CPPCHECK_OPTIONS}) + endif() + if(NOT + "${CMAKE_CXX_STANDARD}" + STREQUAL + "") + set(CMAKE_CXX_CPPCHECK ${CMAKE_CXX_CPPCHECK} --std=c++${CMAKE_CXX_STANDARD}) + endif() + if(${WARNINGS_AS_ERRORS}) + list(APPEND CMAKE_CXX_CPPCHECK --error-exitcode=2) + endif() + else() + message(${WARNING_MESSAGE} "cppcheck requested but executable not found") + endif() +endmacro() + +macro(openturbine_enable_clang_tidy target WARNINGS_AS_ERRORS) + + find_program(CLANGTIDY clang-tidy) + if(CLANGTIDY) + if(NOT + CMAKE_CXX_COMPILER_ID + MATCHES + ".*Clang") + + get_target_property(TARGET_PCH ${target} INTERFACE_PRECOMPILE_HEADERS) + + if("${TARGET_PCH}" STREQUAL "TARGET_PCH-NOTFOUND") + get_target_property(TARGET_PCH ${target} PRECOMPILE_HEADERS) + endif() + + if(NOT ("${TARGET_PCH}" STREQUAL "TARGET_PCH-NOTFOUND")) + message( + SEND_ERROR + "clang-tidy cannot be enabled with non-clang compiler and PCH, clang-tidy fails to handle gcc's PCH file") + endif() + endif() + set(CLANG_TIDY_OPTIONS + ${CLANGTIDY} + -extra-arg=-Wno-unknown-warning-option + -extra-arg=-Wno-ignored-optimization-argument + -extra-arg=-Wno-unused-command-line-argument + -p) + # set standard + if(NOT + "${CMAKE_CXX_STANDARD}" + STREQUAL + "") + if("${CLANG_TIDY_OPTIONS_DRIVER_MODE}" STREQUAL "cl") + set(CLANG_TIDY_OPTIONS ${CLANG_TIDY_OPTIONS} -extra-arg=/std:c++${CMAKE_CXX_STANDARD}) + else() + set(CLANG_TIDY_OPTIONS ${CLANG_TIDY_OPTIONS} -extra-arg=-std=c++${CMAKE_CXX_STANDARD}) + endif() + endif() + + # set warnings as errors + if(${WARNINGS_AS_ERRORS}) + list(APPEND CLANG_TIDY_OPTIONS -warnings-as-errors=*) + endif() + + message("Also setting clang-tidy globally") + set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_OPTIONS}) + else() + message(${WARNING_MESSAGE} "clang-tidy requested but executable not found") + endif() +endmacro() \ No newline at end of file diff --git a/cmake/SystemLink.cmake b/cmake/SystemLink.cmake new file mode 100644 index 00000000..f55b80f4 --- /dev/null +++ b/cmake/SystemLink.cmake @@ -0,0 +1,83 @@ +# Include a system directory (which suppresses its warnings). +function(target_include_system_directories target) + set(multiValueArgs INTERFACE PUBLIC PRIVATE) + cmake_parse_arguments( + ARG + "" + "" + "${multiValueArgs}" + ${ARGN}) + + foreach(scope IN ITEMS INTERFACE PUBLIC PRIVATE) + foreach(lib_include_dirs IN LISTS ARG_${scope}) + if(NOT MSVC) + # system includes do not work in MSVC + # awaiting https://gitlab.kitware.com/cmake/cmake/-/issues/18272# + # awaiting https://gitlab.kitware.com/cmake/cmake/-/issues/17904 + set(_SYSTEM SYSTEM) + endif() + if(${scope} STREQUAL "INTERFACE" OR ${scope} STREQUAL "PUBLIC") + target_include_directories( + ${target} + ${_SYSTEM} + ${scope} + "$" + "$") + else() + target_include_directories( + ${target} + ${_SYSTEM} + ${scope} + ${lib_include_dirs}) + endif() + endforeach() + endforeach() + +endfunction() + +# Include the directories of a library target as system directories (which suppresses their warnings). +function( + target_include_system_library + target + scope + lib) + # check if this is a target + if(TARGET ${lib}) + get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES) + if(lib_include_dirs) + target_include_system_directories(${target} ${scope} ${lib_include_dirs}) + else() + message(TRACE "${lib} library does not have the INTERFACE_INCLUDE_DIRECTORIES property.") + endif() + endif() +endfunction() + +# Link a library target as a system library (which suppresses its warnings). +function( + target_link_system_library + target + scope + lib) + # Include the directories in the library + target_include_system_library(${target} ${scope} ${lib}) + + # Link the library + target_link_libraries(${target} ${scope} ${lib}) +endfunction() + +# Link multiple library targets as system libraries (which suppresses their warnings). +function(target_link_system_libraries target) + set(multiValueArgs INTERFACE PUBLIC PRIVATE) + cmake_parse_arguments( + ARG + "" + "" + "${multiValueArgs}" + ${ARGN}) + + foreach(scope IN ITEMS INTERFACE PUBLIC PRIVATE) + foreach(lib IN LISTS ARG_${scope}) + target_link_system_library(${target} ${scope} ${lib}) + endforeach() + endforeach() +endfunction() \ No newline at end of file diff --git a/cmake/Tests.cmake b/cmake/Tests.cmake new file mode 100644 index 00000000..4a9323b3 --- /dev/null +++ b/cmake/Tests.cmake @@ -0,0 +1,6 @@ +function(openturbine_enable_coverage project_name) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + target_compile_options(${project_name} INTERFACE --coverage -O0 -g) + target_link_libraries(${project_name} INTERFACE --coverage) + endif() +endfunction() \ No newline at end of file diff --git a/cmake/openturbine-utils.cmake b/cmake/openturbine-utils.cmake deleted file mode 100644 index 5db3ea4f..00000000 --- a/cmake/openturbine-utils.cmake +++ /dev/null @@ -1,96 +0,0 @@ - -# target_link_libraries_system -# -# This function is similar to target_link_libraries but allows the includes -# determined from the library to be added as system includes to suppress -# warnings generated from those header files -# -# https://stackoverflow.com/questions/52135983/cmake-target-link-libraries-include-as-system-to-suppress-compiler-warnings/52136398#52136398 -# -function(target_link_libraries_system target visibility) - set(libs ${ARGN}) - foreach(lib ${libs}) - get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES) - target_include_directories(${target} SYSTEM ${visibility} ${lib_include_dirs}) - target_link_libraries(${target} ${visibility} ${lib}) - endforeach(lib) -endfunction(target_link_libraries_system) - - -function(set_cuda_build_properties target) - if (OTURB_ENABLE_CUDA) -# set_target_properties(${target} PROPERTIES LANGUAGE CUDA) - get_target_property(_tgt_src ${target} SOURCES) - list(FILTER _tgt_src INCLUDE REGEX "\\.cpp") - set_source_files_properties(${_tgt_src} PROPERTIES LANGUAGE CUDA) - set_target_properties(${target} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) - set_target_properties(${target} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) - set_target_properties(${target} PROPERTIES CUDA_ARCHITECTURES 70) - target_compile_options(${target} PRIVATE $<$: --extended-lambda --expt-relaxed-constexpr>) - endif() -endfunction(set_cuda_build_properties) - - -macro(init_code_checks) - if(OTURB_ENABLE_CLANG_TIDY) - find_program(CLANG_TIDY_EXE NAMES "clang-tidy") - if(CLANG_TIDY_EXE) - message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}") - else() - message(WARNING "clang-tidy not found.") - endif() - endif() - - if(OTURB_ENABLE_CPPCHECK) - find_program(CPPCHECK_EXE NAMES "cppcheck") - if(CPPCHECK_EXE) - message(STATUS "cppcheck found: ${CPPCHECK_EXE}") - include(ProcessorCount) - ProcessorCount(NP) - if(NP EQUAL 0) - set(NP 1) - endif() - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/cppcheck) - add_custom_target(cppcheck - COMMAND ${CMAKE_COMMAND} -E echo "Running cppcheck on project using ${NP} cores..." - COMMAND ${CMAKE_COMMAND} -E make_directory cppcheck - # cppcheck ignores -isystem directories, so we change them to regular -I include directories (with no spaces either) - COMMAND sed "s/isystem /I/g" ${CMAKE_BINARY_DIR}/compile_commands.json > cppcheck_compile_commands.json - COMMAND ${CPPCHECK_EXE} --template=gcc --inline-suppr --suppress=unusedFunction --suppress=useStlAlgorithm --std=c++17 --language=c++ --enable=all --project=cppcheck_compile_commands.json -i ${CMAKE_SOURCE_DIR}/submods/amrex/Src -i ${CMAKE_SOURCE_DIR}/submods/AMReX-Hydro -i ${CMAKE_SOURCE_DIR}/submods/googletest --output-file=cppcheck-full-report.txt -j ${NP} - COMMENT "Run cppcheck on project compile_commands.json" - BYPRODUCTS cppcheck-full-report.txt - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/cppcheck - VERBATIM USES_TERMINAL - ) - add_custom_target(cppcheck-ci - # Filter out submodule source files after analysis - COMMAND awk -v nlines=2 "/submods/ {for (i=0; i cppcheck/cppcheck-short-report.txt - COMMAND cat cppcheck/cppcheck-short-report.txt | egrep "information:|error:|performance:|portability:|style:|warning:" | sort > cppcheck-ci-report.txt - COMMAND printf "Warnings: " >> cppcheck-ci-report.txt - COMMAND cat cppcheck-ci-report.txt | awk "END{print NR-1}" >> cppcheck-ci-report.txt - COMMENT "Filter cppcheck results to only OpenTurbine files with results in cppcheck-ci-report.txt" - DEPENDS cppcheck - BYPRODUCTS cppcheck-ci-report.txt - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - VERBATIM - ) - else() - message(WARNING "cppcheck not found.") - endif() - endif() -endmacro(init_code_checks) - - -macro(generate_version_info) - include(GetGitRevisionDescription) - get_git_head_revision(OTURB_GITREFSPEC OTURB_GIT_COMMIT_SHA) - if (OTURB_GIT_COMMIT_SHA) - git_describe(OTURB_VERSION_TAG "--tags" "--always") - git_local_changes(OTURB_REPO_DIRTY) - option(OTURB_HAVE_GIT_INFO "Git version for OpenTurbine" ON) - if (${OTURB_VERSION_TAG} MATCHES ".*-NOTFOUND") - set(OTURB_VERSION_TAG "v0.0.1") - endif() - endif() - string(TIMESTAMP OTURB_VERSION_TIMESTAMP "%Y-%m-%d %H:%M:%S (UTC)" UTC) -endmacro(generate_version_info) diff --git a/cmake/set_compile_flags.cmake b/cmake/set_compile_flags.cmake deleted file mode 100644 index 7f18566b..00000000 --- a/cmake/set_compile_flags.cmake +++ /dev/null @@ -1,54 +0,0 @@ - -if(OTURB_ENABLE_ALL_WARNINGS) - - # GCC, Clang, and Intel seem to accept these - list(APPEND OTURB_CXX_FLAGS "-Wall" "-Wextra" "-pedantic") - if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - # Intel always reports some diagnostics we don't necessarily care about - list(APPEND - OTURB_CXX_FLAGS - "-diag-disable:11074,11076,15335" - ) - endif() - - if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$") - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.0) - list(APPEND - OTURB_CXX_FLAGS - "-faligned-new" - "-Wunreachable-code" - "-Wnull-dereference" - "-Wfloat-conversion" - "-Wshadow" - "-Woverloaded-virtual" - ) - endif() - endif() - -endif() - -# Add our extra flags according to language -separate_arguments(OTURB_CXX_FLAGS) -target_compile_options( - ${oturb_lib_name} PRIVATE - $<$:${OTURB_CXX_FLAGS}> -) - -# Building on CUDA requires additional considerations -# if (OTURB_ENABLE_CUDA) -# set_target_properties( -# ${oturb_lib_name} PROPERTIES -# CUDA_SEPARABLE_COMPILATION ON -# ) -# endif() - -# if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") -# if ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND OTURB_ENABLE_FPE_TRAP_FOR_TESTS) -# target_compile_options( -# ${oturb_lib_name} PUBLIC $<$:-ffp-exception-behavior=maytrap> -# ) -# endif() -# target_compile_options( -# ${oturb_lib_name} PUBLIC $<$:-Wno-pass-failed> -# ) -# endif() diff --git a/cmake/set_rpath.cmake b/cmake/set_rpath.cmake deleted file mode 100644 index 7392f28b..00000000 --- a/cmake/set_rpath.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# Use, i.e. don't skip the full RPATH for the build tree -SET(CMAKE_SKIP_BUILD_RPATH FALSE) - -# When building, don't use the install RPATH already (but later on when installing) -SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) -SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") - -# Add the automatically determined parts of the RPATH -# which point to directories outside the build tree to the install RPATH -SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - -# The RPATH to be used when installing, but only if it's not a system directory -LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) -IF("${isSystemDir}" STREQUAL "-1") - SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") -ENDIF("${isSystemDir}" STREQUAL "-1") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7637e238..ed48dac9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,74 +1,36 @@ +add_library(openturbine_library) +add_library(OpenTurbine::openturbine_library ALIAS openturbine_library) -set(Kokkos_DIR "$ENV{Kokkos_ROOT}" CACHE STRING "Kokkos root directory") -find_package(KokkosKernels REQUIRED) -if(TARGET Kokkos::MKL) - find_package(MKL REQUIRED) -endif() +set_target_properties(openturbine_library PROPERTIES + LINKER_LANGUAGE CXX + POSITION_INDEPENDENT_CODE ON + VISIBILITY_INLINES_HIDDEN YES) -find_package(Amesos2 REQUIRED) - -if(CMAKE_CXX_COMPILER_ID MATCHES GNU) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") - set(FS_LIB stdc++fs) - endif() -endif() - -target_sources(${oturb_exe_name} PRIVATE main.cpp) -set_target_properties(${oturb_exe_name} PROPERTIES LINKER_LANGUAGE CXX) -target_link_libraries(${oturb_exe_name} PRIVATE - KokkosKernels::kokkoskernels - Amesos2::amesos2 - ${FS_LIB} -) - -set_target_properties(${oturb_lib_name} PROPERTIES LINKER_LANGUAGE CXX) -target_link_libraries(${oturb_lib_name} PRIVATE - KokkosKernels::kokkoskernels - Amesos2::amesos2 - ${FS_LIB} +target_link_libraries(openturbine_library PRIVATE + openturbine_options + openturbine_warnings ) -target_include_directories(${oturb_exe_name} PRIVATE ${PROJECT_BINARY_DIR}) -target_include_directories(${oturb_exe_name} - PUBLIC - $ - $ - $ +target_link_system_libraries(openturbine_library PRIVATE + KokkosKernels::kokkoskernels + Amesos2::amesos2 + ${FS_LIB} ) -# OpenTurbine lib include directories -target_include_directories(${oturb_lib_name} +target_include_directories(openturbine_library PUBLIC $ $ - $ -) - -# Get all source files -# add_subdirectory(gebt_poc) -# add_subdirectory(gen_alpha_poc) -add_subdirectory(restruct_poc) -add_subdirectory(io) -add_subdirectory(utilities) - -# Generate OpenTurbine version header -configure_file("${CMAKE_SOURCE_DIR}/cmake/OpenTurbineVersion.H.in" - "${CMAKE_CURRENT_BINARY_DIR}/OpenTurbineVersion.H" @ONLY ) -target_link_libraries(${oturb_exe_name} PRIVATE ${oturb_lib_name}) +target_compile_features(openturbine_library PUBLIC cxx_std_17) -# Set -fpic options -set_target_properties(${oturb_lib_name} - PROPERTIES - POSITION_INDEPENDENT_CODE ON -) +add_library(DISCON SHARED) +set_target_properties(DISCON PROPERTIES PREFIX "" SUFFIX ".dll") -file(GLOB_RECURSE openturbine_header_list ${CMAKE_CURRENT_SOURCE_DIR} "*.H") -add_custom_target(openturbine_headers SOURCES ${openturbine_header_list}) +add_library(DISCON_ROTOR_TEST_CONTROLLER SHARED) +set_target_properties(DISCON_ROTOR_TEST_CONTROLLER PROPERTIES PREFIX "" SUFFIX ".dll") -# Add CMake-generated headers to installation -install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenTurbineVersion.H - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} -) +add_subdirectory(restruct_poc) +add_subdirectory(io) +add_subdirectory(utilities) \ No newline at end of file diff --git a/src/io/CMakeLists.txt b/src/io/CMakeLists.txt index b6cbdc40..ac3ec2a0 100644 --- a/src/io/CMakeLists.txt +++ b/src/io/CMakeLists.txt @@ -1,8 +1,3 @@ -target_sources(${oturb_lib_name} +target_sources(openturbine_library PRIVATE - #C++ - # diagnostics.cpp - # io.cpp - console_io.cpp - # IOManager.cpp ) diff --git a/src/restruct_poc/CMakeLists.txt b/src/restruct_poc/CMakeLists.txt index d5ade7be..7a0cd862 100644 --- a/src/restruct_poc/CMakeLists.txt +++ b/src/restruct_poc/CMakeLists.txt @@ -1 +1 @@ -target_sources(${oturb_lib_name} PRIVATE) +target_sources(openturbine_library PRIVATE) diff --git a/src/utilities/CMakeLists.txt b/src/utilities/CMakeLists.txt index d6f4e842..58bc5c89 100644 --- a/src/utilities/CMakeLists.txt +++ b/src/utilities/CMakeLists.txt @@ -1,6 +1,14 @@ -target_sources(${oturb_lib_name} +target_sources(openturbine_library PRIVATE debug_utils.cpp log.cpp controllers/turbine_controller.cpp ) + +target_sources(DISCON + PRIVATE + controllers/discon.cpp) + +target_sources(DISCON_ROTOR_TEST_CONTROLLER + PRIVATE + controllers/discon_rotor_test_controller.cpp) \ No newline at end of file diff --git a/src/utilities/debug_utils.cpp b/src/utilities/debug_utils.cpp index 2e1de166..0a67259d 100644 --- a/src/utilities/debug_utils.cpp +++ b/src/utilities/debug_utils.cpp @@ -1,6 +1,6 @@ -#include "src/utilities/debug_utils.H" +#include "src/utilities/debug_utils.hpp" -#include "src/utilities/log.h" +#include "src/utilities/log.hpp" namespace openturbine::util { diff --git a/src/utilities/debug_utils.H b/src/utilities/debug_utils.hpp similarity index 100% rename from src/utilities/debug_utils.H rename to src/utilities/debug_utils.hpp diff --git a/src/utilities/log.cpp b/src/utilities/log.cpp index 8a9662c0..43479af0 100644 --- a/src/utilities/log.cpp +++ b/src/utilities/log.cpp @@ -1,4 +1,4 @@ -#include "src/utilities/log.h" +#include "src/utilities/log.hpp" #include #include diff --git a/src/utilities/log.h b/src/utilities/log.hpp similarity index 100% rename from src/utilities/log.h rename to src/utilities/log.hpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fc06c953..7723daa9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,92 +1 @@ -#============================================================================= -# OpenTurbine Testing -#============================================================================= - -# configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake ${CMAKE_BINARY_DIR}/CTestCustom.cmake) - -if(OTURB_SAVE_GOLDS) - if("${OTURB_SAVED_GOLDS_DIRECTORY}" STREQUAL "") - message(FATAL_ERROR "To save gold files, OTURB_SAVED_GOLDS_DIRECTORY must be set and the directory exist") - else() - if(EXISTS ${OTURB_SAVED_GOLDS_DIRECTORY}) - set(SAVED_GOLDS_DIRECTORY ${OTURB_SAVED_GOLDS_DIRECTORY}/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/${CMAKE_CXX_COMPILER_VERSION}) - message(STATUS "Gold files will be saved to: ${SAVED_GOLDS_DIRECTORY}") - else() - message(FATAL_ERROR "Specified directory for saving gold files does not exist: ${OTURB_SAVED_GOLDS_DIRECTORY}") - endif() - endif() -endif() - -# Have CMake discover the number of cores on the node -include(ProcessorCount) -ProcessorCount(PROCESSES) - -#============================================================================= -# Functions for adding tests / Categories of tests -#============================================================================= -macro(setup_test) - set(CURRENT_TEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test_files/${TEST_NAME}) - set(CURRENT_TEST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/test_files/${TEST_NAME}) - # set(PLOT_GOLD ${GOLD_FILES_DIRECTORY}/${TEST_NAME}/plt00010) - # set(PLOT_TEST ${CURRENT_TEST_BINARY_DIR}/plt00010) - file(MAKE_DIRECTORY ${CURRENT_TEST_BINARY_DIR}) - file(GLOB TEST_FILES "${CURRENT_TEST_SOURCE_DIR}/*") - file(COPY ${TEST_FILES} DESTINATION "${CURRENT_TEST_BINARY_DIR}/") - set(RUNTIME_OPTIONS "time.max_step=10 amr.plot_file=plt time.plot_interval=10 amrex.the_arena_is_managed=0 amrex.abort_on_out_of_gpu_memory=1") - # if(OTURB_ENABLE_CUDA OR (OTURB_ENABLE_HYPRE AND (CMAKE_CXX_COMPILER_ID STREQUAL "Intel"))) - # set(FCOMPARE_TOLERANCE "-r 1e-10 --abs_tol 1.0e-12") - # set(RUNTIME_OPTIONS "${RUNTIME_OPTIONS} io.skip_outputs=p") - # endif() - if(OTURB_SAVE_GOLDS) - file(MAKE_DIRECTORY ${SAVED_GOLDS_DIRECTORY}/${TEST_NAME}) - set(SAVE_GOLDS_COMMAND "&& cp -R ${PLOT_TEST} ${SAVED_GOLDS_DIRECTORY}/${TEST_NAME}/") - endif() -endmacro(setup_test) - -# Standard regression test -function(add_test_r TEST_NAME) - setup_test() - add_test(${TEST_NAME} sh -c "${CMAKE_BINARY_DIR}/${OTURB_exe_name} ${MPIEXEC_POSTFLAGS} ${CURRENT_TEST_BINARY_DIR}/${TEST_NAME}.inp ${RUNTIME_OPTIONS} > ${TEST_NAME}.log ${SAVE_GOLDS_COMMAND}") - # Set properties for test - set_tests_properties( - ${TEST_NAME} PROPERTIES - TIMEOUT 5400 - # PROCESSORS ${TEST_NP} - WORKING_DIRECTORY "${CURRENT_TEST_BINARY_DIR}/" - LABELS "regression" - ATTACHED_FILES_ON_FAIL "${CURRENT_TEST_BINARY_DIR}/${TEST_NAME}.log" - ) -endfunction(add_test_r) - -# Standard unit test -function(add_test_u TEST_NAME) - setup_test() - # set(TEST_NP 1) - add_test(${TEST_NAME} sh -c "${MPI_COMMANDS} ${CMAKE_BINARY_DIR}/${oturb_unit_test_exe_name}") - set_tests_properties( - ${TEST_NAME} PROPERTIES - TIMEOUT 500 - # PROCESSORS ${TEST_NP} - WORKING_DIRECTORY "${CURRENT_TEST_BINARY_DIR}/" - LABELS "unit" - ) -endfunction(add_test_u) - -#============================================================================= -# Unit tests -#============================================================================= - -#============================================================================= -# Regression tests -#============================================================================= -# add_test_r(asdf) - -#============================================================================= -# Verification tests -#============================================================================= -# add_test_v(mms "${LIST_OF_GRID_SIZES}") - -#============================================================================= -# Performance tests -#============================================================================= -# add_test_p(asdf) +add_subdirectory(unit_tests) \ No newline at end of file diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index 3bdf288d..97ed0acb 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -1,55 +1,36 @@ -# Add subdirectories for unit tests -#add_subdirectory(gebt_poc) -#add_subdirectory(gen_alpha_poc) +add_executable(openturbine_unit_tests) + add_subdirectory(restruct_poc) target_sources( - ${oturb_unit_test_exe_name} - PRIVATE - utest_main.cpp - test_config.cpp -) - -target_compile_options( - ${oturb_unit_test_exe_name} PRIVATE - $<$:${OTURB_CXX_FLAGS}> + openturbine_unit_tests + PRIVATE + utest_main.cpp ) -target_include_directories(${oturb_unit_test_exe_name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(${oturb_unit_test_exe_name} PRIVATE ${PROJECT_BINARY_DIR}) - -if(CMAKE_CXX_COMPILER_ID MATCHES GNU) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") - set(FS_LIB stdc++fs) - endif() -endif() -# Link our unit test executable with GoogleTest -find_package(GTest REQUIRED) -target_link_libraries(${oturb_unit_test_exe_name} PRIVATE ${FS_LIB} GTest::gtest GTest::gtest_main) +target_link_libraries( + openturbine_unit_tests + PRIVATE + openturbine_warnings + openturbine_options + openturbine_library) -# Link to OpenTurbine test targets -target_link_libraries(${oturb_unit_test_exe_name} PRIVATE ${oturb_lib_name}) - -# Link Kokkos to test target -find_package(KokkosKernels REQUIRED) -find_package(Amesos2 REQUIRED) -target_link_libraries(${oturb_unit_test_exe_name} PRIVATE +target_link_system_libraries( + openturbine_unit_tests + PRIVATE KokkosKernels::kokkoskernels Amesos2::amesos2 -) + GTest::gtest + GTest::gtest_main) -# Link VTK to test target if (OTURB_ENABLE_VTK) - target_link_libraries(${oturb_unit_test_exe_name} PRIVATE + target_link_system_libraries( + openturbine_unit_tests + PRIVATE VTK::IOXML ) endif() -# Define what we want to be installed during a make install -install(TARGETS ${oturb_unit_test_exe_name} - RUNTIME DESTINATION bin - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib -) - +include(GoogleTest) +gtest_discover_tests(openturbine_unit_tests PROPERTIES DISCOVERY_TIMEOUT 60000) \ No newline at end of file diff --git a/tests/unit_tests/restruct_poc/CMakeLists.txt b/tests/unit_tests/restruct_poc/CMakeLists.txt index 4a758289..1c37b837 100644 --- a/tests/unit_tests/restruct_poc/CMakeLists.txt +++ b/tests/unit_tests/restruct_poc/CMakeLists.txt @@ -1,6 +1,6 @@ target_sources( - ${oturb_unit_test_exe_name} + openturbine_unit_tests PRIVATE test_beams.cpp test_solver.cpp @@ -39,7 +39,7 @@ target_sources( if(OTURB_ENABLE_VTK) target_sources( - ${oturb_unit_test_exe_name} + openturbine_unit_tests PRIVATE vtkout.hpp ) diff --git a/tests/unit_tests/restruct_poc/solver/test_copy_into_sparse_matrix.cpp b/tests/unit_tests/restruct_poc/solver/test_copy_into_sparse_matrix.cpp index d42b5d9d..fde96108 100644 --- a/tests/unit_tests/restruct_poc/solver/test_copy_into_sparse_matrix.cpp +++ b/tests/unit_tests/restruct_poc/solver/test_copy_into_sparse_matrix.cpp @@ -8,7 +8,7 @@ namespace openturbine::restruct_poc::tests { auto createDenseMatrix_1x1() { auto dense = Kokkos::View("dense"); - auto dense_host_data = std::array{3.}; + auto dense_host_data = std::array{3.}; auto dense_host = Kokkos::View(dense_host_data.data()); auto dense_mirror = Kokkos::create_mirror(dense); Kokkos::deep_copy(dense_mirror, dense_host); diff --git a/tests/unit_tests/restruct_poc/test_math.cpp b/tests/unit_tests/restruct_poc/test_math.cpp index 6592882d..c89fb2f7 100644 --- a/tests/unit_tests/restruct_poc/test_math.cpp +++ b/tests/unit_tests/restruct_poc/test_math.cpp @@ -235,7 +235,7 @@ TEST(VectorTest, CrossProduct_Set2) { void test_DotProduct_View() { auto a = Create1DView<3>({1., 2., 3.}); auto b = Create1DView<3>({4., 5., 6.}); - auto c = double{}; + auto c = 0.; Kokkos::parallel_reduce( "DotProduct_View", 1, KOKKOS_LAMBDA(int, double& result) { result = DotProduct(a, b); }, c ); diff --git a/tests/unit_tests/restruct_poc/test_utilities.hpp b/tests/unit_tests/restruct_poc/test_utilities.hpp index 049f11d2..b8006cb5 100644 --- a/tests/unit_tests/restruct_poc/test_utilities.hpp +++ b/tests/unit_tests/restruct_poc/test_utilities.hpp @@ -1,7 +1,5 @@ #pragma once -#include "src/gen_alpha_poc/quaternion.h" -#include "src/gen_alpha_poc/utilities.h" #include "src/restruct_poc/types.hpp" namespace openturbine::restruct_poc::tests { diff --git a/tests/unit_tests/test_config.cpp b/tests/unit_tests/test_config.cpp deleted file mode 100644 index b9096c11..00000000 --- a/tests/unit_tests/test_config.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** \file test_config.cpp - * - * Tests various configurations for GPU builds - */ - -#include - -#include "gtest/gtest.h" - -#include "src/OpenTurbineVersion.H" - -namespace oturb_tests { - -TEST(Configuration, Build) { - const std::string dirty_tag = (openturbine::version::oturb_dirty_repo == "DIRTY") - ? ("-" + openturbine::version::oturb_dirty_repo) - : ""; - const std::string ot_git_sha = openturbine::version::oturb_git_sha + dirty_tag; - std::cout << "OpenTurbine SHA = " << ot_git_sha << std::endl; -} - -// TEST(Configuration, GPU) -// { - -// #ifdef AMREX_USE_GPU -// #ifdef AMREX_USE_CUDA -// amrex::Print() << "GPU backend: CUDA" << std::endl; -// #if defined(CUDA_VERSION) -// amrex::Print() << "CUDA_VERSION: " << CUDA_VERSION << " " -// << CUDA_VERSION / 1000 << "." << (CUDA_VERSION % 1000) / -// 10 -// << std::endl; -// #endif -// #elif defined(AMREX_USE_HIP) -// amrex::Print() << "GPU backend: HIP" << std::endl; -// #elif defined(AMREX_USE_DPCPP) -// amrex::Print() << "GPU backend: SYCL" << std::endl; -// #endif - -// using Dev = amrex::Gpu::Device; -// const int myrank = amrex::ParallelDescriptor::MyProc(); -// std::stringstream ss; -// // clang-format off -// ss << "[" << myrank << "] " << Dev::deviceId() -// << ": " << Dev::deviceName() << "\n" -// << " Warp size : " << Dev::warp_size << "\n" -// << " Global memory : " -// << (static_cast(Dev::totalGlobalMem()) / (1 << 30)) << "GB\n" -// << " Shared mem/ block : " -// << (Dev::sharedMemPerBlock() / (1 << 10)) << "KB\n" -// << " Max. threads/block : " << Dev::maxThreadsPerBlock() -// << " (" << Dev::maxThreadsPerBlock(0) << ", " -// << Dev::maxThreadsPerBlock(1) << ", " << Dev::maxThreadsPerBlock(2) -// << ")\n" -// << " Max. blocks/grid : (" << Dev::maxBlocksPerGrid(0) -// << ", " << Dev::maxBlocksPerGrid(1) << ", " << -// Dev::maxBlocksPerGrid(2) << ")\n" -// << std::endl; -// // clang-format on -// amrex::OutStream() << ss.str(); -// #else -// amrex::Print() << "AMR-Wind not built with GPU support" << std::endl; -// GTEST_SKIP(); -// #endif -// } - -TEST(Configuration, TPLs) { -} - -} // namespace oturb_tests