This is a cross post from the CUDA discourse, it was suggested that I ask here instead.
I have a repository that is structured in this way, following the example from ModernCMake - Extended example. I’m replacing with ... extra information.
├── apps
│   ├── CMakeLists.txt
│   └── main.cpp
├── CMakeLists.txt
├── include
│   └── cuda_path_tracer
│       ├── error.cuh
│       ├── image.hpp
│       ...
├── Makefile
├── src
│   ├── CMakeLists.txt
│   ├── error.cu
│   ├── image.cpp
│   ...
└── tests
    ├── CMakeLists.txt
    ├── test_error.cpp
    ...
Can somebody help me figure out if I’m doing things correctly in the CMake configuration? I seem to keep getting errors and never seem to get to a configuration that just works. At the moment it compiles and runs fine with nvcc, but with clang++ it throws some
clang++-20: error: no such file or directory: 'CUDA'
clang++-20: error: no such file or directory: 'devices'
clang++-20: error: no such file or directory: 'found.'
clang++-20: error: no such file or directory: 'CUDA'
clang++-20: error: no such file or directory: 'devices'
clang++-20: error: no such file or directory: 'found.'
clang++-20: warning: CUDA version 12.6 is only partially supported [-Wunknown-cuda-version]
clang++-20: error: unsupported CUDA gpu architecture: sm_No
I’m compiling the project with the following commands:
CC := cmake
override FLAGS := -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
	-DCMAKE_CUDA_COMPILER=clang++-20 \
	-DCMAKE_CXX_COMPILER=clang++-20 \
	-DCMAKE_CUDA_ARCHITECTURES=native
# override FLAGS := -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
# 	-DCMAKE_CUDA_COMPILER=nvcc \
# 	-DCMAKE_CXX_COMPILER=g++
TARGET := cuda_path_tracer
.PHONY: build run clean test
build:
	$(CC) -S . -B build $(FLAGS)
	$(CC) --build build
test: build
	./build/tests/tests
run: build
	./build/apps/$(TARGET)
clean:
	rm -rf *build* 
my root CMakeList.txt is
cmake_minimum_required(VERSION 3.27...3.31)
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
  set(CMAKE_CUDA_ARCHITECTURES 90)
endif()
project(
    cuda_path_tracer
    VERSION 1.0
    LANGUAGES CXX CUDA
)
# Only set these properties if this is the main project, not included as a library
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
    set(CMAKE_CXX_EXTENSIONS OFF)
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    include(CTest)
endif()
include(FetchContent)
add_subdirectory(src)
add_subdirectory(apps)
if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR CUDA_PATH_TRACER_CMAKE_BUILD_TESTING)
    AND BUILD_TESTING)
    add_subdirectory(tests)
endif()
the one in the src folder is
set(HEADER_LIST
    "${cuda_path_tracer_SOURCE_DIR}/include/cuda_path_tracer/error.cuh"
    "${cuda_path_tracer_SOURCE_DIR}/include/cuda_path_tracer/image.hpp"
    ...
)
add_library(cuda_path_tracer_lib
    error.cu
    image.cpp
    ...
    ${HEADER_LIST}
)
target_include_directories(cuda_path_tracer_lib
    PUBLIC
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} 
)
target_compile_features(cuda_path_tracer_lib PUBLIC cxx_std_20)
set_target_properties(cuda_path_tracer_lib
    PROPERTIES
    CUDA_SEPARABLE_COMPILATION ON
    CUDA_RESOLVE_DEVICE_SYMBOLS ON
)
source_group(
    TREE "${PROJECT_SOURCE_DIR}/include"
    PREFIX "Header Files"
    FILES ${HEADER_LIST}
)
The one in the apps is
add_executable(cuda_path_tracer main.cpp)
set_target_properties(cuda_path_tracer
    PROPERTIES
    CUDA_SEPARABLE_COMPILATION ON
    CUDA_RESOLVE_DEVICE_SYMBOLS ON
)
target_compile_features(cuda_path_tracer PRIVATE cxx_std_20)
target_link_libraries(cuda_path_tracer PRIVATE cuda_path_tracer_lib)
while the one in tests is:
FetchContent_Declare(
  Catch2
  GIT_REPOSITORY https://github.com/catchorg/Catch2.git
  GIT_TAG v3.7.1
)
FetchContent_MakeAvailable(Catch2)
add_executable(tests
  test_error.cpp
  ...
)
include(Catch)
catch_discover_tests(tests)
set_target_properties(tests
  PROPERTIES
  CUDA_SEPARABLE_COMPILATION ON
)
target_compile_features(tests PRIVATE cxx_std_20)
target_link_libraries(tests PRIVATE cuda_path_tracer_lib Catch2::Catch2WithMain)
add_test(NAME test_all COMMAND tests)
Is there something that I’m doing wrong/that can be improved? Initially I had CUDA_ARCHITECTURES defined in the set_target_properties of the inner CMakeList.txt, but this lead to correct compilation both with nvcc and clang++ but errors at runtime due to library linkage issues.
I’m sorry if it’s such an open-ended question, but I’m new to CMake and I want to learn it right