Svårt att se varför man inte skulle använda CMake för ett nytt C/C++/CUDA projekt som skapas idag. Kan verka enkelt att svänga ihop sin egen Makefile, men även enkla exempel har typisk flera av dessa problem
potentiella race om man använder flera kärnor för att bygga
felaktiga beroenden mellan filer, speciellt mellan källkodsfiler och headers. För att få detta rätt måste varje källkodsfil scannas och en speciell byggregel för varje fil måste skapas
väldigt komplicerat att få till egna Makefiler som faktiskt fungerar någorlunda på mer än ett OS (varför skulle man inte stödja Linux, MacOS och Windows där det är möjligt?)
svårt för andra att veta hur din makefile fungerar, d.v.s. vad är konfigurerbart, vad förutsätts etc
Detta är grunden till en CMakeLists.txt som du frågar efter. Skulle nog själv dela upp det i flera filer, men för mindre projekt behövs kanske inte det
cmake_minimum_required(VERSION 3.10)
# C++ and CUDA project
project(MyProject VERSION 1.0 LANGUAGES CXX CUDA)
# Enable C++17...
set(CMAKE_CXX_STANDARD 17)
# ...and fail if the compiler do not support C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Enable C++14 for CUDA files...
set(CMAKE_CUDA_STANDARD 14)
# ...and fail if the CUDA_compiler do not support C++14
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
# add /include of this directory to the include path
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# Make list of all C++ and all CUDA files in /src
file(GLOB CPP_SRCS src/*.cpp)
file(GLOB CUDA_SRCS src/*.cu)
# Build rules for program
add_executable(myprog ${CPP_SRCS} ${CUDA_SRCS})
# Potentially add libraries with
# target_link_libraries(myprog libx liby...)
Detta fungerar både för Linux och Windows (och MacOS om man nu råkar ha en Nvidia GPU). CMake kommer själv lura ut var CUDA är installerat (inom rimliga gränser). Vill du köra med clang++ + debug kör du (har en väldigt gammal version av clang på denna maskin, kör alltid GCC på just den här maskinen)
$ mkdir debug
$ cd debug
$ CXX=clang++ cmake -DCMAKE_BUILD_TYPE=Debug ..
-- The CXX compiler identification is Clang 6.0.0
-- The CUDA compiler identification is NVIDIA 9.1.85
-- Check for working CXX compiler: /opt/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++
-- Check for working CXX compiler: /opt/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Check for working CUDA compiler: /usr/bin/nvcc
-- Check for working CUDA compiler: /usr/bin/nvcc -- works
-- Detecting CUDA compiler ABI info
-- Detecting CUDA compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kjonsson/programming/cmake/proj/debug
$ make -j $(nproc --all)
Edit: Oh, angående vad du bör läsa för att få kläm på CMake. Går att googla.
Problemet är att CMake är väldigt väl dokumenterat, fast bara när man redan förstår grunderna... Ofta rätt svårt att veta vad man ska söka på innan man fått hyfsad kläm på något.
Kan därför rekommendera boken Professional CMAKE - A practical guide, men för det du beskriver ovan kan du garanterat googla dig till det som behövs då det är rätt konkreta frågor samt förutsatt att projektet är ett litet personligt projekt.