常见变量
WIN32
MSVC
CMAKE_SIZEOF_VOID_P
VERSION
SOVERSION
NO_SONAME
RUNTIME_OUTPUT_DIRECTORY
常见指令
add_custom_target
添加一个目标,它总是过期的(需要重新生成的)。
通过add_dependencies()将它添加到某个目标的依赖列表,或使它依赖某一目标。
add_custom_command
作用主要有两个:生成文件、给一个目标添加自定义命令
add_dependencies
将一个目标添加到某个目标的依赖列表,或使它依赖某个目标。
file
find_file
get_filename_component
get_target_property
list
list(JOIN <list> <glue> <out-var>)
list(APPEND <list> [<element>...])
...
set
set_target_properties
set_target_properties(t1 t2 PROPERTIES p1 v1 p2 v2)
常见目的
判断系统位宽
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set(xXX x64)
elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
set(xXX x86)
endif()
添加一个后处理命令
创建文件夹
file(MAKE_DIRECTORY ${DIR})
获取文件列表
file(GLOB SRCS *)
获取目标属性
get_target_property(v t NAME)
搜索头文件
find_file(
WTH_HEADER
wth.h
PATHS
/usr
/usr/local
PATH_SUFFIXES
include
)
获取文件所在文件夹
get_filename_component(DIR ${FILE} DIRECTORY)
获取文件名
get_filename_component(NAME ${FILE} NAME)
get_filename_component(NAME ${FILE} NAME_WE)
get_filename_component(NAME ${FILE} NAME_WLE)
清除缓存变量
unset(WTH_DIR CACHE)
创建缓存变量
set(WTH_DIR "/home/user/WTH" CACHE PATH "WTH dir")
set(WTH_FILE "/home/user/WTH/WTH.txt" CACHE FILEPATH "WTH file")
set(ENABLE_WTH OFF CACHE BOOL "Enable WTH")
set(WTH_NAME "WTH" CACHE STRING "WTH string")
构建某目标前,先生成自定义文件
config_file
TODO
生成.h或.cpp
TODO
生成自定义类型文件
TODO
创建宏并获取参数
macro(test)
set(options A B)
set(oneValueArgs C D)
set(multiValueArgs E F)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
message(STATUS "${ARG_A}")
message(STATUS "${ARG_B}")
message(STATUS "${ARG_C}")
message(STATUS "${ARG_D}")
message(STATUS "${ARG_E}")
message(STATUS "${ARG_F}")
endmacro()
test(
A B
C c1
D d2
E e1 e2
F f1 f2
)
-- TRUE
-- TRUE
-- c1
-- d2
-- e1;e2
-- f1;f2
设置全局生成目录
要禁用多配置目录前缀,需要使用生成表达式,说明见RUNTIME_OUTPUT_DIRECTORY
################################################################################
# Output dir
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_DEBUG_POSTFIX "d")
自定义构建过程
询问用户并执行指令
库引入
################################################################################
# find glslc
# package: https://github.com/google/shaderc/blob/main/downloads.md
# Vulkan::glslc(cmake 3.19)
find_program(
GLSLC_COMMAND
name glslc
PATHS
/bin
/usr/bin
/usr/local/bin
)
if (GLSLC_COMMAND)
message(STATUS "Found glslc ${GLSLC_COMMAND}")
else ()
message(FATAL_ERROR "NOT fount glslc")
endif ()
################################################################################
# glm
# target: glm::glm
# ubuntu package: libglm-dev
find_package(glm REQUIRED)
if (glm_FOUND)
message(STATUS "Found glm(${GLM_VERSION})")
else ()
message(FATAL_ERROR "NOT found glm")
endif ()
################################################################################
# glfw3
# target: glfw
# ubuntu package: libglfw3-dev
find_package(glfw3 REQUIRED)
if (glfw3_FOUND)
message(STATUS "Found glfw3(${glfw3_VERSION})")
else ()
message(FATAL_ERROR "NOT found glfw3")
endif ()
################################################################################
# Vulkan
# target: Vulkan
# ubuntu package: vulkan-tools libvulkan-dev vulkan-validationlayers-dev spriv-tools
find_package(Vulkan REQUIRED)
if (Vulkan_FOUND)
message(STATUS "Found Vulkan")
else ()
message(FATAL_ERROR "NOT found Vulkan")
endif ()
################################################################################
# Qt5
# ubuntu package: qtbase5-dev qtdeclarative5-dev qtquickcontrols2-5-dev
find_package(Qt5 REQUIRED COMPONENTS Widgets)
message(STATUS "Qt5Widgets_INCLUDE_DIRS:${Qt5Widgets_INCLUDE_DIRS}")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(QT_ALL_LIBRARIES Qt5::Widgets)
#include_directories(${Qt5Widgets_INCLUDE_DIRS})
################################################################################
# OSG
find_package(OpenSceneGraph REQUIRED osg)
## osgQt
if (OPENSCENEGRAPH_VERSION VERSION_GREATER_EQUAL "3.6")
find_package(OpenSceneGraph REQUIRED osg osgDB osgViewer osgUtil osgParticle osgText osgGA osgFX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(OSGQT REQUIRED openscenegraph-osgQt)
set(OSGQT_LIBRARIES osgQOpenGL)
message(STATUS OSGQT_LIBRARIES:${OSGQT_LIBRARIES})
message(STATUS OSGQT_LIBRARY_DIRS:${OSGQT_LIBRARY_DIRS})
message(STATUS OSGQT_INCLUDE_DIRS:${OSGQT_INCLUDE_DIRS})
set(OPENSCENEGRAPH_INCLUDE_DIR ${OPENSCENEGRAPH_INCLUDE_DIR} ${OSGQT_INCLUDE_DIRS})
set(OPENSCENEGRAPH_LIBRARIES ${OPENSCENEGRAPH_LIBRARIES} ${OSGQT_LIBRARIES})
set(OPENSCENEGRAPH_LIBRARY_DIRS ${OPENSCENEGRAPH_LIBRARY_DIRS} ${OSGQT_LIBRARY_DIRS})
else ()
find_package(OpenSceneGraph REQUIRED osg osgQt osgDB osgViewer osgUtil osgParticle osgText osgGA osgFX)
endif ()
message(STATUS "OPENSCENEGRAPH_INCLUDE_DIR:${OPENSCENEGRAPH_INCLUDE_DIR}")
message(STATUS "OPENSCENEGRAPH_LIBRARIES:${OPENSCENEGRAPH_LIBRARIES}")
message(STATUS "OPENSCENEGRAPH_VERSION:${OPENSCENEGRAPH_VERSION}")
message(STATUS "OPENSCENEGRAPH_LIBRARY_DIRS:${OPENSCENEGRAPH_LIBRARY_DIRS}")
include_directories(${OPENSCENEGRAPH_INCLUDE_DIR})
################################################################################
# osgEarth
find_package(OsgEarth REQUIRED)
message(STATUS OSGEARTH_INCLUDE_DIRS:${OSGEARTH_INCLUDE_DIRS})
message(STATUS OSGEARTH_LIBRARY:${OSGEARTH_LIBRARY})
include_directories(${OSGEARTH_INCLUDE_DIRS})
################################################################################
# Boost
#set(BOOST_ROOT ..)
find_package(Boost REQUIRED COMPONENTS system)
message(STATUS "Boost_INCLUDE_DIR:${Boost_INCLUDE_DIR}")
message(STATUS "Boost_LIBRARY_DIRS:${Boost_LIBRARY_DIRS}")
message(STATUS "Boost_LIBRARIES:${Boost_LIBRARIES}")
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
########################################################
# Eigen3
find_package(Eigen3 REQUIRED)
message(STATUS EIGEN3_DEFINITIONS:${EIGEN3_DEFINITIONS})
message(STATUS EIGEN3_INCLUDE_DIRS:${EIGEN3_INCLUDE_DIRS})
message(STATUS Eigen3_DIR:${Eigen3_DIR})
include("${Eigen3_DIR}/UseEigen3.cmake")
手动引入库
set(LIB_INCLUDE_DIRS "DIRS")
set(LIB_LIBRARY_DEBUG "LIBD")
set(LIB_LIBRARY_RELEASE "LIBR")
add_library(lib <UNKNOWN|INTERFACE> IMPORTED)
set_property(TARGET lib APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIB_INCLUDE_DIRS})
set_property(TARGET lib APPEND PROPERTY IMPORTED_CONVIGURATIONS RELEASE)
set_property(TARGET lib APPEND PROPERTY IMPORTED_LOCATION_RELEASE ${LIB_LIBRARY_RELEASE})
set_property(TARGET lib APPEND PROPERTY IMPORTED_CONVIGURATIONS DEBUG)
set_property(TARGET lib APPEND PROPERTY IMPORTED_LOCATION_DEBUG ${LIB_LIBRARY_DEBUG})
set_property(TARGET lib APPEND PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES deps)
使用目录
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(TARGET tar PROPERTY FOLDER TAR)