CMake - yszheda/wiki GitHub Wiki

compiler

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")

指定从某一路径中寻找toolchain

set(TOOLCHAIN_ROOT "/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/")
set(CMAKE_PROGRAM_PATH "/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/")
set(GNU_MACHINE "arm-hisiv300-linux-uclibcgnueabi" CACHE STRING "GNU compiler triple")
# set(CMAKE_C_COMPILER  "${TOOLCHAIN_ROOT}${GNU_MACHINE}-gcc")
# set(CMAKE_CXX_COMPILER  "${TOOLCHAIN_ROOT}${GNU_MACHINE}-g++")
# set(CMAKE_LINKER  "${TOOLCHAIN_ROOT}${GNU_MACHINE}-ld")
# set(CMAKE_AR  "${TOOLCHAIN_ROOT}${GNU_MACHINE}-ar")
find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc)
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}-g++)
find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}-ld)
find_program(CMAKE_AR NAMES ${GNU_MACHINE}-ar)

linker

add_link_options

skip linking

add_library(dummy OBJECT <source files>)

C++ standard

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

archieve

SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -X -r5 -o <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> -X -r5 -o <TARGET> <LINK_FLAGS> <OBJECTS>")

CFLAGS

warnings as errors flag

Check CPU feature flags

include_directories

target_include_directories

INTERFACE_INCLUDE_DIRECTORIES

target_compile_definitions

Public VS Private VS Interface

CMAKE_CURRENT_LIST_DIR CMAKE_CURRENT_SOURCE_DIR

load flag / LDFLAGS

cross compile

install

CMAKE_INSTALL_PREFIX

filter

cmake_minimum_required(VERSION 2.8)
project(foo)

install(
    DIRECTORY
    "./src"
    DESTINATION
    "include/foo"
    FILES_MATCHING
    PATTERN
    "*.hpp"
)

component

string

STREQUAL

regex

get_filename_component

get_filename_component(lib_we ${lib_loc} NAME_WE)

test

CMAKE_BUILD_TYPE DEBUG RELEASE

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make


mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
1. Release: `-O3 -DNDEBUG`
2. Debug: `-O0 -g`
3. RelWithDebInfo: `-O2 -g -DNDEBUG`
4. MinSizeRel: `-Os -DNDEBUG`
LIST(APPEND CUDA_NVCC_FLAGS_RELEASE -DNDEBUG )
LIST(APPEND CUDA_NVCC_FLAGS_RELEASE -O3 )
LIST(APPEND CUDA_NVCC_FLAGS_RELEASE --use_fast_math )

add_definitions

add_compile_options

LIBRARY_OUTPUT_NAME

LIST

filter list

list(REMOVE_ITEM <list> <value> [<value> ...])
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

CMP0060: link library with full path

GLOB

file(GLOB helloworld_SRC
    "*.h"
    "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})

CONFIGURE_DEPENDS

build id

add_subdirectory

MACRO(SUBDIRLIST result curdir)
  FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
  SET(dirlist "")
  FOREACH(child ${children})
    IF(IS_DIRECTORY ${curdir}/${child} AND EXISTS ${curdir}/${child}/CMakeLists.txt)
      LIST(APPEND dirlist ${child})
    ENDIF()
  ENDFOREACH()
  SET(${result} ${dirlist})
ENDMACRO()

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR})

FOREACH(subdir ${SUBDIRS})
  ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()

ENV

RPATH

LD_LIBRARY_PATH

CUDA


# CMakeLists.txt for G4CU project                                                                                                                                                                          
project(test-cuda-thrust-gdb)

# required cmake version                                                                                                                                                                                   
cmake_minimum_required(VERSION 2.8)

# packages                                                                                                                                                                                                 
find_package(CUDA)

# nvcc flags                                                                                                                                                                                               
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_20,code=sm_20)

cuda_compile(HELPER_O helper.cu)
cuda_compile(DRIVER_O driver.cu OPTIONS -G)

cuda_add_executable(driver ${HELPER_O} ${DRIVER_O})

OpenCV

C++11

message

multi-line string

add_custom_command

clean custom target ADDITIONAL_MAKE_CLEAN_FILES

pkg-config

configure_file

find_library

set_source_files_properties

OBJECT_OUTPUTS

set_target_properties

SET_TARGET_PROPERTIES(name PROPERTIES PREFIX "")

export

install(TARGETS
        your_target
    EXPORT YourPackageConfig
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS
        your_target
    NAMESPACE YourPackage::
    FILE "${CMAKE_CURRENT_BINARY_DIR}/YourPackageConfig.cmake"
)
install(EXPORT
        YourPackageConfig
    DESTINATION "${CMAKE_INSTALL_DATADIR}/YourPackage/cmake"
    NAMESPACE YourPackage::
)

CMakePackageConfigHelpers

Python

assembly / asm

CMAKE_ASM_COMPILER

language checking

project(XXX LANGUAGES NONE)

function

global var

set_property(GLOBAL PROPERTY source_list_property "${source_list}")
get_property(source_list GLOBAL PROPERTY source_list_property)

cmake_parse_arguments

Trouble shooting

Link static library

set_target_properties called with incorrect number of arguments.

"/usr/include/opencv-3.1.0-dev/opencv"non-existent path

CUDA nvcc redefinition of argument 'std'

SET(CUDA_PROPAGATE_HOST_FLAGS OFF)

-isystem

set_target_properties(my_target
    PROPERTIES
    NO_SYSTEM_FROM_IMPORTED ON
    )

All uses of target_link_libraries with a target must be either all-keyword or all-plain.

// TODO

CMake Error at CMakeLists.txt: (target_link_libraries):                                                                                                                   
  The plain signature for target_link_libraries has already been used with
  the target "".  All uses of target_link_libraries with
  a target must be either all-keyword or all-plain.

CMakeTestCCompiler

CMake Error at /arm/tools/gnu/cmake/3.14.3/share/cmake-3.14/Modules/CMakeTestCCompiler.cmake:60 (message):                                                    
  The C compiler
  is not able to compile a simple test program.
set(CMAKE_C_COMPILER_WORKS 1)

add_executable Cannot find source file

CMake Error: Cannot determine link language for target

set_source_files_properties(${SOURCE} PROPERTIES LANGUAGE CXX)

change the file extension name of object files

set(CMAKE_C_OUTPUT_EXTENSION ".rel")
set(CMAKE_CXX_OUTPUT_EXTENSION ".rel")

add compiler macro through CMake argument

⚠️ **GitHub.com Fallback** ⚠️