##===----------------------------------------------------------------------===## # # Build OMPT unit testing library: ompTest # ##===----------------------------------------------------------------------===## cmake_minimum_required(VERSION 3.20) project(omptest LANGUAGES CXX) option(LIBOMPTEST_BUILD_STANDALONE "Build ompTest 'standalone', i.e. w/o GoogleTest." ${OPENMP_STANDALONE_BUILD}) option(LIBOMPTEST_BUILD_UNITTESTS "Build ompTest's unit tests, requires GoogleTest." OFF) option(LIBOMPTEST_INSTALL_COMPONENTS "Install ompTest library, headers and package files." OFF) # Exit early if OMPT support or LLVM-tests were disabled by the user. if((NOT ${LIBOMP_OMPT_SUPPORT}) OR (NOT ${LLVM_INCLUDE_TESTS})) return() endif() include(CMakePackageConfigHelpers) include_directories(${LIBOMP_INCLUDE_DIR}) set(OMPTEST_HEADERS ./include/AssertMacros.h ./include/InternalEvent.h ./include/InternalEventCommon.h ./include/Logging.h ./include/OmptAliases.h ./include/OmptAsserter.h ./include/OmptAssertEvent.h ./include/OmptCallbackHandler.h ./include/OmptTester.h ./include/OmptTesterGlobals.h ) add_library(omptest SHARED ${OMPTEST_HEADERS} ./src/InternalEvent.cpp ./src/InternalEventOperators.cpp ./src/Logging.cpp ./src/OmptAsserter.cpp ./src/OmptAssertEvent.cpp ./src/OmptCallbackHandler.cpp ./src/OmptTester.cpp ) # Target: ompTest library # On (implicit) request of GoogleTest, link against the one provided with LLVM. if ((NOT LIBOMPTEST_BUILD_STANDALONE) OR LIBOMPTEST_BUILD_UNITTESTS) # Check if standalone build was requested together with unittests if (LIBOMPTEST_BUILD_STANDALONE) # Emit warning: this build actually depends on LLVM's GoogleTest message(WARNING "LIBOMPTEST_BUILD_STANDALONE and LIBOMPTEST_BUILD_UNITTESTS" " requested simultaneously.\n" "Linking against LLVM's GoogleTest library archives.\n" "Disable LIBOMPTEST_BUILD_UNITTESTS to perform an actual" " standalone build.") # Explicitly disable LIBOMPTEST_BUILD_STANDALONE set(LIBOMPTEST_BUILD_STANDALONE OFF) endif() # Add dependency llvm_gtest; emits error if unavailable. add_dependencies(omptest llvm_gtest) # Link llvm_gtest as whole-archive to expose required symbols set(GTEST_LINK_CMD "-Wl,--whole-archive" llvm_gtest "-Wl,--no-whole-archive" LLVMSupport) # Add GoogleTest-based header target_sources(omptest PRIVATE ./include/OmptTesterGoogleTest.h) # Add LLVM-provided GoogleTest include directories. target_include_directories(omptest PRIVATE ${LLVM_THIRD_PARTY_DIR}/unittest/googletest/include) # TODO: Re-visit ABI breaking checks, disable for now. target_compile_definitions(omptest PUBLIC -DLLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING) # Link against gtest and gtest_main target_link_libraries(omptest PRIVATE ${GTEST_LINK_CMD}) else() # Add 'standalone' compile definitions target_compile_definitions(omptest PRIVATE -DOPENMP_LIBOMPTEST_BUILD_STANDALONE) # Add 'standalone' source files target_sources(omptest PRIVATE ./include/OmptTesterStandalone.h ./src/OmptTesterStandalone.cpp) endif() if(TARGET cxx-headers) add_dependencies(omptest cxx-headers) endif() if(TARGET cxx_shared) add_dependencies(omptest cxx_shared) endif() if(TARGET cxxabi_shared) add_dependencies(omptest cxxabi_shared) endif() # Add common include directories. target_include_directories(omptest PUBLIC $ $/${LIBOMP_HEADERS_INSTALL_PATH}/omptest> ) target_compile_features(omptest PRIVATE cxx_std_17) # Perform package configuration. set(OMPTEST_CONFIG_INSTALL_DIR "${OPENMP_INSTALL_LIBDIR}/cmake/openmp/omptest") configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/omptest-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/omptest-config.cmake INSTALL_DESTINATION "${OMPTEST_CONFIG_INSTALL_DIR}" ) # Perform installation only if requested by the user. if(LIBOMPTEST_INSTALL_COMPONENTS) # Install package configuration files. install(FILES ${omptest_BINARY_DIR}/cmake/omptest-config.cmake DESTINATION "${OMPTEST_CONFIG_INSTALL_DIR}") # Install libomptest header files: Copy header-files from include dir set(OMPTEST_HEADER_INSTALL_DIR "${LIBOMP_HEADERS_INSTALL_PATH}/omptest") install(DIRECTORY ./include/ DESTINATION "${OMPTEST_HEADER_INSTALL_DIR}" FILES_MATCHING PATTERN "*.h") # Install library and export targets. # Note: find_package(omptest) may require setting of PATH_SUFFIXES # Example: "lib/cmake/openmp/omptest", this is due to the install location install(TARGETS omptest EXPORT OPENMPomptest LIBRARY COMPONENT omptest DESTINATION "${OPENMP_INSTALL_LIBDIR}" INCLUDES DESTINATION "${OMPTEST_HEADER_INSTALL_DIR}") # Allow to link omptest by using: target_link_libraries( ... omptest::omptest) # Additionally, it automatically propagates the include directory. install(EXPORT OPENMPomptest DESTINATION "${OMPTEST_CONFIG_INSTALL_DIR}" NAMESPACE omptest:: FILE omptest-targets.cmake) endif() # Discover unit tests (added to check-openmp) if(LIBOMPTEST_BUILD_UNITTESTS) add_subdirectory(test) endif()