Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CMakeLists.txt

invoke

cmake -B build -G "Ninja Multi-Config"
cmake --build build --config Release
CMAKE_INSTALL_MODE=SYMLINK_OR_COPY cmake --install build --config Release --prefix .

normal

cmake_minimum_required(VERSION 3.20)
project(example)

if (NOT UNIX)
    message(FATAL_ERROR "Unsupported OS")
endif()

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_DIAGNOSTICS ON)
# list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# save the executables/libraries according to GNU standard
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

# enable warnings by default for all targets
add_compile_options(-Wall -Wextra -Wpedantic -Werror)

# enable sanitizers for debug build
add_compile_options("$<$<CONFIG:DEBUG>:-fsanitize=address;-fsanitize=undefined;-fno-omit-frame-pointer>")

# enable lto for release build
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE true)
# force fat lto objects
set(CMAKE_CXX_COMPILE_OPTIONS_IPO -flto=auto -ffat-lto-objects)
# enable strip for release build
add_link_options("$<$<CONFIG:RELEASE>:-s>")
# -fPIC
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# build native binaries
add_compile_options("$<$<CONFIG:RELEASE>:-march=native>")

# use pthread
find_package(Threads REQUIRED)
set(THREADS_PREFER_PTHREAD_FLAG ON)

# static library
add_library(lib1 STATIC lib1.cpp)

# shared library
add_library(lib2 SHARED lib2.cpp)
install(TARGETS lib1 lib2 DESTINATION "${CMAKE_INSTALL_LIBDIR}")

# executable
add_executable(exe1 main.cpp)
add_dependencies(exe1 lib1 lib2)

target_link_libraries(exe1 PRIVATE lib1 lib2 Threads::Threads)
target_link_directories(exe1 PRIVATE "/opt/cuda/lib64")

target_include_directories(exe1 PRIVATE ${CMAKE_CURRENT_BINARY_DIR} "/opt/cuda/include")

target_compile_options(exe1 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:$<$<CONFIG:DEBUG>:-g3;-Og>>)

target_compile_definitions(exe1 PRIVATE
    MAJOR_VERSION=0
    MINOR_VERSION=0
    PATCH_VERSION=1
    BUILD_DEBUG
    )
install(TARGETS exe1 DESTINATION "${CMAKE_INSTALL_BINDIR}")

# child targets, should contain CMakeLists.txt
add_subdirectory(examples)

cuda

set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
# -DCMAKE_CUDA_ARCHITECTURES=all-major
    set(CMAKE_CUDA_ARCHITECTURES native)
endif()
enable_language(CUDA)
find_package(CUDAToolkit REQUIRED)

add_compile_options("$<$<COMPILE_LANGUAGE:CUDA>:-Werror=all-warnings>")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-Wall;-Wextra;-Wpedantic;-Werror>")

add_executable(examle_cuda
    worker.cu
    main.cpp
)
target_include_directories(example_cuda PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
target_link_libraries(example_cuda PRIVATE
    CUDA::nvrtc # -lnvrtc
    CUDA::cuda_driver # -lcuda
)

nasm

enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> <FLAGS> -o <OBJECT> <SOURCE>")
set(CMAKE_ASM_NASM_FLAGS "-g -felf64")
set(CMAKE_C_FLAGS "-g -nostdlib -fPIE -fno-stack-protector")
add_executable(exe_asm a.asm b.c)
set_source_files_properties(a.asm PROPERTIES LANGUAGE ASM_NASM)

flex & bison

find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)
FLEX_TARGET(SCANNER scannr.l ${CMAKE_CURRENT_BINARY_DIR}/scanner.cpp)
BISON_TARGET(PARSER parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp)
add_flex_bison_dependency(SCAN PARSE)

add_executable(exe1 main.cpp ${FLEX_SCAN_OUTPUTS} ${BISON_PARSE_OUTPUTS})
target_link_libraries(exe1 PRIVATE ${FLEX_LIBRARIES})