mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-30 18:29:37 -06:00
CUDA: Add Support to SourceCompiles|Runs and CheckCompilerFlags
This commit is contained in:
committed by
Brad King
parent
c61f820a7f
commit
da2622ff36
11
Help/release/dev/cuda-check-support.rst
Normal file
11
Help/release/dev/cuda-check-support.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
cuda-check-support
|
||||
------------------
|
||||
|
||||
* The :module:`CheckCompilerFlag` module was extended to
|
||||
support 'CUDA'.
|
||||
|
||||
* The :module:`CheckSourceCompiles` module was extended to
|
||||
support 'CUDA'.
|
||||
|
||||
* The :module:`CheckSourceRuns` module was extended to
|
||||
support 'CUDA'.
|
||||
@@ -49,6 +49,10 @@ function(CHECK_COMPILER_FLAG _lang _flag _var)
|
||||
elseif(_lang STREQUAL CXX)
|
||||
set(_lang_src "int main() { return 0; }")
|
||||
set(_lang_fail_regex FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+")
|
||||
elseif(_lang STREQUAL CUDA)
|
||||
set(_lang_src "__host__ int main() { return 0; }")
|
||||
set(_lang_fail_regex FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+" # Host GNU
|
||||
FAIL_REGEX "argument unused during compilation: .*") # Clang
|
||||
elseif(_lang STREQUAL Fortran)
|
||||
set(_lang_src " program test\n stop\n end program")
|
||||
set(_lang_fail_regex FAIL_REGEX "command[ -]line option .* is valid for .* but not for Fortran")
|
||||
|
||||
@@ -89,6 +89,9 @@ function(CHECK_SOURCE_COMPILES _lang _source _var)
|
||||
elseif(_lang STREQUAL CXX)
|
||||
set(_lang_textual "C++")
|
||||
set(_lang_ext "cxx")
|
||||
elseif(_lang STREQUAL CUDA)
|
||||
set(_lang_textual "CUDA")
|
||||
set(_lang_ext "cu")
|
||||
elseif(_lang STREQUAL Fortran)
|
||||
set(_lang_textual "Fortran")
|
||||
set(_lang_ext "F")
|
||||
|
||||
@@ -87,6 +87,9 @@ function(CHECK_SOURCE_RUNS _lang _source _var)
|
||||
elseif(_lang STREQUAL CXX)
|
||||
set(_lang_textual "C++")
|
||||
set(_lang_ext "cxx")
|
||||
elseif(_lang STREQUAL CUDA)
|
||||
set(_lang_textual "CUDA")
|
||||
set(_lang_ext "cu")
|
||||
elseif(_lang STREQUAL Fortran)
|
||||
set(_lang_textual "Fortran")
|
||||
set(_lang_ext "F")
|
||||
|
||||
@@ -38,6 +38,11 @@ if (APPLE AND CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
|
||||
add_CMakeOnly_test(CheckOBJCXXCompilerFlag)
|
||||
endif()
|
||||
|
||||
if(CMake_TEST_CUDA)
|
||||
add_CMakeOnly_test(CompilerIdCUDA)
|
||||
endif()
|
||||
|
||||
|
||||
if(CMAKE_Fortran_COMPILER)
|
||||
add_CMakeOnly_test(CompilerIdFortran)
|
||||
endif()
|
||||
|
||||
14
Tests/CMakeOnly/CompilerIdCUDA/CMakeLists.txt
Normal file
14
Tests/CMakeOnly/CompilerIdCUDA/CMakeLists.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
project(CompilerIdCUDA CUDA)
|
||||
|
||||
foreach(v
|
||||
CMAKE_CUDA_COMPILER
|
||||
CMAKE_CUDA_COMPILER_ID
|
||||
CMAKE_CUDA_COMPILER_VERSION
|
||||
)
|
||||
if(${v})
|
||||
message(STATUS "${v}=[${${v}}]")
|
||||
else()
|
||||
message(SEND_ERROR "${v} not set!")
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -538,9 +538,15 @@ add_RunCMake_test(target_compile_features)
|
||||
add_RunCMake_test(target_compile_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
|
||||
add_RunCMake_test(target_include_directories)
|
||||
add_RunCMake_test(target_sources)
|
||||
add_RunCMake_test(CheckCompilerFlag)
|
||||
add_RunCMake_test(CheckSourceCompiles -DCMake_TEST_ISPC=${CMake_TEST_ISPC})
|
||||
add_RunCMake_test(CheckSourceRuns)
|
||||
add_RunCMake_test(CheckCompilerFlag -DCMake_TEST_CUDA=${CMake_TEST_CUDA}
|
||||
-DCMake_TEST_ISPC=${CMake_TEST_ISPC})
|
||||
add_RunCMake_test(CheckSourceCompiles -DCMake_TEST_CUDA=${CMake_TEST_CUDA}
|
||||
-DCMake_TEST_ISPC=${CMake_TEST_ISPC})
|
||||
add_RunCMake_test(CheckSourceRuns -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
|
||||
set_property(TEST RunCMake.CheckCompilerFlag
|
||||
RunCMake.CheckSourceCompiles
|
||||
RunCMake.CheckSourceRuns
|
||||
APPEND PROPERTY LABELS "CUDA")
|
||||
set_property(TEST RunCMake.CheckSourceCompiles
|
||||
RunCMake.CheckCompilerFlag
|
||||
APPEND PROPERTY LABELS "ISPC")
|
||||
|
||||
13
Tests/RunCMake/CheckCompilerFlag/CheckCUDACompilerFlag.cmake
Normal file
13
Tests/RunCMake/CheckCompilerFlag/CheckCUDACompilerFlag.cmake
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
enable_language (CUDA)
|
||||
include(CheckCompilerFlag)
|
||||
|
||||
check_compiler_flag(CUDA "-_this_is_not_a_flag_" SHOULD_FAIL)
|
||||
if(SHOULD_FAIL)
|
||||
message(SEND_ERROR "invalid CUDA compile flag didn't fail.")
|
||||
endif()
|
||||
|
||||
check_compiler_flag(CUDA "-DFOO" SHOULD_WORK)
|
||||
if(NOT SHOULD_WORK)
|
||||
message(SEND_ERROR "${CMAKE_CUDA_COMPILER_ID} compiler flag '-DFOO' check failed")
|
||||
endif()
|
||||
@@ -15,6 +15,10 @@ if (CMAKE_Fortran_COMPILER_ID)
|
||||
run_cmake(CheckFortranCompilerFlag)
|
||||
endif()
|
||||
|
||||
if (CMake_TEST_CUDA)
|
||||
run_cmake(CheckCUDACompilerFlag)
|
||||
endif()
|
||||
|
||||
if(CMake_TEST_ISPC)
|
||||
run_cmake(CheckISPCCompilerFlag)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
enable_language (CUDA)
|
||||
include(CheckSourceCompiles)
|
||||
|
||||
check_source_compiles(CUDA "I don't build" SHOULD_FAIL)
|
||||
if(SHOULD_FAIL)
|
||||
message(SEND_ERROR "invalid CUDA source didn't fail.")
|
||||
endif()
|
||||
|
||||
check_source_compiles(CUDA [=[
|
||||
#include <vector>
|
||||
__device__ int d_func() { }
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
]=]
|
||||
SHOULD_BUILD)
|
||||
if(NOT SHOULD_BUILD)
|
||||
message(SEND_ERROR "Test fail for valid CUDA source.")
|
||||
endif()
|
||||
|
||||
check_source_compiles(CUDA "void l(char const (&x)[2]){}; int main() { l(\"\\n\"); return 0;}"
|
||||
SHOULD_BUILD_COMPLEX)
|
||||
|
||||
if(NOT SHOULD_BUILD_COMPLEX)
|
||||
message(SEND_ERROR "Test fail for valid CUDA complex source.")
|
||||
endif()
|
||||
@@ -15,6 +15,10 @@ if (CMAKE_Fortran_COMPILER_ID)
|
||||
run_cmake(CheckFortranSourceCompiles)
|
||||
endif()
|
||||
|
||||
if (CMake_TEST_CUDA)
|
||||
run_cmake(CheckCUDASourceCompiles)
|
||||
endif()
|
||||
|
||||
if(CMake_TEST_ISPC)
|
||||
run_cmake(CheckISPCSourceCompiles)
|
||||
endif()
|
||||
|
||||
21
Tests/RunCMake/CheckSourceRuns/CheckCUDASourceRuns.cmake
Normal file
21
Tests/RunCMake/CheckSourceRuns/CheckCUDASourceRuns.cmake
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
enable_language (CUDA)
|
||||
include(CheckSourceRuns)
|
||||
|
||||
check_source_runs(CUDA "int main() {return 2;}" SHOULD_FAIL)
|
||||
if(SHOULD_FAIL)
|
||||
message(SEND_ERROR "CUDA check_source_runs succeeded, but should have failed.")
|
||||
endif()
|
||||
|
||||
check_source_runs(CUDA
|
||||
[=[
|
||||
#include <vector>
|
||||
__device__ __host__ void fake_function();
|
||||
__host__ int main() {
|
||||
return 0;
|
||||
}
|
||||
]=]
|
||||
SHOULD_RUN)
|
||||
if(NOT SHOULD_RUN)
|
||||
message(SEND_ERROR "CUDA check_source_runs failed for valid CUDA executable.")
|
||||
endif()
|
||||
@@ -14,3 +14,7 @@ endif()
|
||||
if (CMAKE_Fortran_COMPILER_ID)
|
||||
run_cmake(CheckFortranSourceRuns)
|
||||
endif()
|
||||
|
||||
if (CMake_TEST_CUDA)
|
||||
run_cmake(CheckCUDASourceRuns)
|
||||
endif()
|
||||
|
||||
Reference in New Issue
Block a user