From cf71f6ee15f4f1e7b83c1912bbc8b70ef58140d0 Mon Sep 17 00:00:00 2001 From: Allison Vacanti Date: Wed, 3 Mar 2021 13:54:13 -0500 Subject: [PATCH] Update NVBench build system with initial standalone support. --- CMakeLists.txt | 18 ++++++++++++++++-- cmake/modules/CPM.cmake | 19 +++++++++++++++++++ nvbench/CMakeLists.txt | 12 +++++++++++- testing/CMakeLists.txt | 7 +++++-- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 cmake/modules/CPM.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 20aba97..17424d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,22 @@ # 3.18.3 is needed for a MSVC + NVCC + C++17 bugfix. cmake_minimum_required(VERSION 3.18.3) -project(nvbench CUDA) +# CXX to work around issues with CUDA-only CMake projects. +project(NVBench CUDA CXX) + +option(NVBench_ENABLE_TESTING "Build NVBench testing suite." OFF) # Setup some vars for CPM packages: +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/") + +# NVBench requires C++17. set(CMAKE_CXX_STANDARD 17) set(CMAKE_CUDA_STANDARD 17) +# TODO this probably should use GNUInstallDirs or something. +set(NVBench_LIBRARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/lib") +set(NVBench_EXECUTABLE_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin") + include(CPM) CPMAddPackage( @@ -16,4 +26,8 @@ CPMAddPackage( ) add_subdirectory(nvbench) -add_subdirectory(testing) + +if (NVBench_ENABLE_TESTING) + enable_testing() + add_subdirectory(testing) +endif() diff --git a/cmake/modules/CPM.cmake b/cmake/modules/CPM.cmake new file mode 100644 index 0000000..c2a4347 --- /dev/null +++ b/cmake/modules/CPM.cmake @@ -0,0 +1,19 @@ +set(CPM_DOWNLOAD_VERSION 0.27.3) + +if(CPM_SOURCE_CACHE) + set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif(DEFINED ENV{CPM_SOURCE_CACHE}) + set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else() + set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif() + +if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) + message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}") + file(DOWNLOAD + https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION} + ) +endif() + +include(${CPM_DOWNLOAD_LOCATION}) diff --git a/nvbench/CMakeLists.txt b/nvbench/CMakeLists.txt index fc562c0..0ce074f 100644 --- a/nvbench/CMakeLists.txt +++ b/nvbench/CMakeLists.txt @@ -30,10 +30,20 @@ add_library(nvbench STATIC ${srcs}) add_library(nvbench::nvbench ALIAS nvbench) # TODO generator expressions for installed paths -target_include_directories(nvbench PUBLIC "${nvbench_SOURCE_DIR}") +target_include_directories(nvbench PUBLIC "${NVBench_SOURCE_DIR}") target_link_libraries(nvbench PRIVATE fmt::fmt) target_compile_features(nvbench PUBLIC cuda_std_17) +set_target_properties(nvbench PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + LIBRARY_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${NVBench_EXECUTABLE_OUTPUT_DIR}" +) add_library(nvbench_main OBJECT main.cu) add_library(nvbench::main ALIAS nvbench_main) target_link_libraries(nvbench_main PUBLIC nvbench) +set_target_properties(nvbench PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + LIBRARY_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${NVBench_EXECUTABLE_OUTPUT_DIR}" +) diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt index 3692da1..b49ea0d 100644 --- a/testing/CMakeLists.txt +++ b/testing/CMakeLists.txt @@ -16,8 +16,6 @@ set(test_srcs type_list.cu ) -enable_testing() - foreach(test_src IN LISTS test_srcs) get_filename_component(test_name "${test_src}" NAME_WLE) string(PREPEND test_name "nvbench.test.") @@ -25,5 +23,10 @@ foreach(test_src IN LISTS test_srcs) target_include_directories(${test_name} PRIVATE "${CMAKE_CURRENT_LIST_DIR}") target_link_libraries(${test_name} PRIVATE nvbench::nvbench fmt) set_target_properties(${test_name} PROPERTIES COMPILE_FEATURES cuda_std_17) + set_target_properties(${test_name} PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + LIBRARY_OUTPUT_DIRECTORY "${NVBench_LIBRARY_OUTPUT_DIR}" + RUNTIME_OUTPUT_DIRECTORY "${NVBench_EXECUTABLE_OUTPUT_DIR}" + ) add_test(NAME ${test_name} COMMAND "$") endforeach()