[系统的学习][cmake]使用笔记

1 篇文章 0 订阅

常见变量

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值