cmakelist基本语法

2023-05-16

一、几个基本概念:

1、GCC

a、由GUN开发的编译器,支持C/C++,Java等语言.

b、项目简单时,可以使用gcc/g++来进行编译.

c、项目复杂时,只使用gcc来进行编译会变得非常复杂.

2、make

a、主要负责一个软件工程中多个源代码的自动编译工作

b、注意每个平台的make不一样,makefile的语法也不一样

c、make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率;

d、make的主要任务是根据 makefile 文件(一个脚本文件)中定义的规则和步骤,根据各个模块的更新情况,自动完成整个软件项目的维护和目标程序生成工作。

3、Makefile

a、Makefile是有条理的gcc编译命令文件.

b、利用make工具执行Makefile文件,来达到编译的目的.

c、程序简单时,可以使用Makefile.

d、程序复杂时,有局限性.

4、CMake

a、全称:Cross Platform CMake,是一个跨平台的安装(编译)工具.

b、利用cmake工具读取CMakeList.txt配置文件,并最终生成Makefile文件.

c、CMake开发简单,易于理解.

d、编程效率高.

5、CMakelist

a、CMakeList其实就是适配CMake语法的一个配置文件

b、不需要关注不同的Make工具需要的不同格式的MakeFile文件,而是直接使用Cmake 构建出适应当前平台的Makefile进而进行代码编译(因此cmake具有跨平台特点)。

6、Kconfig

kconfig用来做系统配置,生成menuconfig的配置文件:

a、供cmake使用:CMakeList会使用这些参数

b、用于编译源码

7、ninja

a、ninja根据.ninja文件将源码生成目标程序

b、类似make,但是处理速度更快

8、.ninja

a、包含一系列编译规则和命令的文件

b、类似Makefile,但是语法更简单

9、GN

a、大规模工程的跨平台构建工具,类似cmake,但是构建速度更快。

b、GN(generate ninja)是一种元构建系统,生成Ninja构建文件(Ninja build files),即利用GN工具把.gn文件转换成.ninja文件

c、gn和ninja的关系就与cmake和make的关系差不多

10、build.gn

a、项目构建文件,不直接构建项目,而是产生构建项目的ninja文件,然后再用ninja去构建项目

b、类似cmakelist,但是语法更简单

原始跨平台:

编写makefile文件,使用各平台上的make(微软的MS nmake、GNU的make)来编译makefile文件,这种做法的缺点是各平台的make实现不同,导致这种原始的做法其实复用度并不高,需要针对各平台单独编写差异巨大的makefile文件,那为什么要介绍它呢,因为这是跨平台的根,所有跨平台工具,最终都是要依赖各平台应用的集成开发环境的编译器来执行编译,这是固定不变的,也就是说各平台的编译,最终还是需要各平台的makefile,这一点是无法逃避的,而怎么由人工转为自动化,才是跨平台编译的进阶之路。

进阶跨平台:

使用cmake,编写统一的makefile文件,最后由cmake自动生成各平台相关的makefile文件执行编译,这一点上,cmake已经是比较好的跨平台工具了,一般的跨平台工程基本已经满足需求了。

现代跨平台:

当工程规模增大到难以想象的量级时,编译速度和工程模块的划分变得尤为重要,其中chromium工程就遇到这两个问题,于是最初诞生了gyp,最后演化升级为gn,其旨在追求工程更加清晰的模块和结构呈现,以及更快的编译速度。前者通过语法层面实现,后者则依靠ninja来提升编译速度,因为大型工程的编译,很大一部分时间都花在了源文件编译依赖树的分析这块,而ninja更像是一个编译器的预处理,其主要目的是舍弃gcc、msvc、clang等编译器在编译过程中递归查找依赖的方式,因为这里存在很多重复的依赖查找,而ninja改进了这一过程,提前生成编译依赖树,编译期间按照编译依赖树的顺序依次编译,这样就大大减少了编译期间杂乱的编译顺序造成的重复依赖关系查找。

二、CMakelist编写(CMake基本指令)

1、configure_file

功能

cmake 中的 configure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义,然后存入另一个文件中。其语法格式如下。其中,input 为输入的文件,output 为输出的文件。通常,输入文件为 http://xxx-config.h.in,输出文件为 xxx-config.h

语法

configure_file(<input> <output>

               [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |

                FILE_PERMISSIONS <permissions>...]

               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]

               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

主要参数说明

input:输入的文件名,通常为 xxx-config.h.in;

output:输出的文件名,通常为 xxx-config.h;

@ONLY:在 <input> 文件中只使用 @VAR@ 的方式获取变量值,不适用 ${VAR} 的方式;

示例

a、判断变量是否定义

输入文件xxx-config.h.in语法:

#cmakedefine VAR

用途:

源码中不关心变量值,只关心变量是否被定义。如果 CMakeLists.txt 文件中,定义了变量 VAR,那么在转化出来的输出文件中就会存在 #define VAR 的语句。否则,在输出文件中就会显示 /*undef VAR*/。然后,在源码中使用 #ifdef 语句进行使用——#ifdef VAR。

b、判断选项是否开启

输入文件xxx-config.h.in语法:

#cmakedefine01 VAR

用途:

CMakelists.txt 中的 option(VAR ...) 用于开关操作,并且可以使用 cmake -DVAR=ON/OFF .. 修改其变量值。上述指令根据 CMakeLists.txt 中 VAR 的值为 ON 或 OFF,将其转换为输出文件中的 #define VAR 1 或 #define VAR 0。然后在源码中使用 #if 进行引用——#if VAR。当然,该语句也可用于使用 set(VAR xxx) 定义的变量,但是用于 option(VAR ...) 更合适。

c、获取变量值

输入文件xxx-config.h.in语法(其中的 @VAR@ 可以替换为 ${VAR}):

#cmakedefine VAR @VAR@

#define SELF_DEFINE_MACRO_NAME @VAR@

用途:

CMakeLists.txt 文件中,变量 VAR 多用于定义某些信息,比如版本号,作者,项目描述,调试等级等。然后在源码中输出这些值到固定位置,起到提示的作用。

总结:

使用configure_file()可以省去很多的类似add_compile_options()指令。只需在 CMakeLists.txt 文件中定义变量,然后再在xxx-config.h.in 文件中使用 #cmakedefine 进行引用即可,即通过cmakelist控制宏变量的使用。

2、set

功能

用来显式定义变量。

语法

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

主要参数说明

VAR:要设置的变量名

VALUE:变量的值

示例:

SET (SRC_LST STRING)

说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。

3、if

功能

对项目进行有条件编译。

语法

if(<condition>)

  <commands>

elseif(<condition>) # optional block, can be repeated

  <commands>

else()              # optional block

  <commands>

endif()

主要参数说明

condition:如果为1、ON、TRUE等值,则条件为真,否则为变量(则判断变量是否已经定义)

commands:为真时执行的命令

4、add_library

功能

使用指定的源文件向工程中添加一个目标库。

语法

add_library(<name> [STATIC | SHARED | MODULE]

            [EXCLUDE_FROM_ALL]

            [<source>...])

主要参数说明

name:构建成的库名,必须全局唯一

STATIC|SHARED|MOUDLE:库的类型,STATIC(静态库) SHARED(动态库) MODULE(模块库)

EXCLUDE_FROM_ALL:加了此属性的target在默认编译的时候,不会被编译,只能手动编译

source:构建库的源文件,可以直接指定,也可以后续使用target_sources()指定

示例

add_library(hello_library STATIC

    src/Hello.cpp

)

5、target_compile_definitions

功能

向目标添加编译标志。

语法

target_compile_definitions(<target>

  <INTERFACE|PUBLIC|PRIVATE> [items1...]

  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

主要参数说明

target:编译目标,必须已经通过add_executable() 或者add_library() 创建,并且must not be an ALIAS target(输入工程).

关键字INTERFACE,PUBLIC和PRIVATE用来指定其后参数的作用域。PRIVATE 和 PUBLIC 项将产生的COMPILE_DEFINITIONS 属性。PUBLIC和INTERFACE 项将产生的INTERFACE_COMPILE_DEFINITIONS 属性。

items:参数指定编译定义。重复调用相同的目标将按照调用顺序追加(定义)。

示例

target_compile_definitions(cmake_examples_compile_flags

PRIVATE CONFIG_FSM_DEBUG=1

)

说明:为编译目标cmake_examples_compile_flags设置编译标志CONFIG_FSM_DEBUG=1

6、set_target_properties

功能

设置目标的属性,语法是列出想要更改的所有目标,然后提供接下来想要设置的值,可以使用该命令任何所需的键值对。

语法

set_target_properties(target1 target2 ...

                      PROPERTIES prop1 value1

                      prop2 value2 ...)

主要参数说明

target1、target2…:要设置属性的目标1、目标2

PROPERTIES:属性关键字

prop1 value1、prop2 value2:键值对1、键值对2

示例

set_target_properties(

Thirdlib

PROPERTIES IMPORTED_LOCATION

${CMAKE_CURRENT_SOURCE_DIR}/jniLibs/libThirdlib.so

)

说明:为目标Thirdlib设置导入位置属性

7、target_include_targets

功能

为目标添加库

语法

# Set a target to include all interface directories of depended targets.

# The arguments must be target.

function(target_include_targets target type)

    foreach(arg ${ARGN})

        target_include_directories(${target} ${type}

            $<TARGET_PROPERTY:${arg},INTERFACE_INCLUDE_DIRECTORIES>)

    endforeach()

endfunction()

主要参数说明

示例

target_include_targets(appstart

PRIVATE atr ats diag nvm)

说明:为目标appstart添加库atr ats diag nvm

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

8、target_include_targets_if

功能

有条件的为目标添加库

语法

# Helper to link libraries with conditions

macro(target_include_targets_if)  # <conditon> THEN <command>

    cmake_parse_arguments(MY "" "" "THEN" ${ARGN})

    if(${MY_UNPARSED_ARGUMENTS})

        target_include_targets(${MY_THEN})

    endif()

endmacro()

主要参数说明

示例

target_include_targets_if(CONFIG_AT_BT_APP_SUPPORT THEN

appstart PRIVATE bt_app)

说明:如果定义了CONFIG_AT_BT_APP_SUPPORT,则为目标appstart添加库bt_app

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

9、target_include_directories

功能

为特定目标 target 添加头文件目录

语法

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]

                                     <INTERFACE|PUBLIC|PRIVATE> [items1...]

                                    [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

主要参数说明

<target>: 构建目标,使用 add_executable() 或 add_library 声明,不可为 ALIAS 目标;

[SYSTEM]: 指定是否平台相关,若该属性与 PUBLIC 或 INTERFACE 一同设置,CMake 将使用指定的目录初始化目标的 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES 属性;

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES: 该属性为含有平台相关头文件的目录,常用于抑制编译器警告;

[AFTER|BEFORE]: 指定相应目录添加的顺序,在后添加/在前添加。

[INTERFACE|PUBLIC|PRIVATE]: 指定头文件的可见性,若设置PRIVATE或PUBLIC,CMake 将使用指定的目录初始化目标的INCLUDE_DIRECTORIES 属性,若设置为PUBLIC或 INTERFACE,CMake 将使用指定的目录初始化目标的 INTERFACE_INCLUDE_DIRECTORIES 属性;

INCLUDE_DIRECTORIES: 该属性为目标的头文件目录;

INTERFACE_INCLUDE_DIRECTORIES: 该属性为目标的开放头文件目录;

[items]: 指定要添加的头文件目录,可以使用相对路径或绝对路径,相对路径为相对于当前路径 CMAKE_CURRENT_SOURCE_DIR,也可以使用 CMake 提供的 generator expression。

示例

target_include_directories(appstart

PRIVATE //kaihong/kh_platform/interfaces/kits/nativeapi)

说明:为目标appstart添加头文件目录//kaihong/kh_platform/interfaces/kits/nativeapi

注意:为目标添加当前目录或子目录下的头文件目录时使用PUBLIC,否则使用PRIVATE

10、set_if

功能

条件设置目标

语法

# Helper to set variable with conditions

macro(set_if var) # <condition> THEN <val_true> OTHERWISE <val_false>

    cmake_parse_arguments(MY "" "" "THEN;OTHERWISE" ${ARGN})

    if(${MY_UNPARSED_ARGUMENTS})

        if(MY_THEN)

            set(${var} ${MY_THEN})

        endif()

    else()

        if (MY_OTHERWISE)

            set(${var} ${MY_OTHERWISE})

        endif()

    endif()

endmacro()

主要参数说明

示例

set_if(ldscript        CONFIG_APP_RUN_ON_FLASH

THEN            ${SOURCE_TOP_DIR}/components/hal/ldscripts/flashrun.ld

     OTHERWISE ${SOURCE_TOP_DIR}/components/hal/ldscripts/ddrrun.ld )

说明:如果定义了CONFIG_APP_RUN_ON_FLASH,则链接器链接${SOURCE_TOP_DIR}/components/hal/ldscripts/flashrun.ld,否则链接${SOURCE_TOP_DIR}/components/hal/ldscripts/ddrrun.ld

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

11、link_directories

功能

添加链接器寻找库的目录

语法

link_directories([AFTER|BEFORE] directory1 [directory2 ...])

主要参数说明

Directory:要寻找的库的路径

示例

link_directories (${OHOS_OUT_PATH}/libs)

12、target_link_libraries

功能

将目标与库文件链接

语法

target_link_libraries(<target>

                      <PRIVATE|PUBLIC|INTERFACE> <item>...

                      [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

主要参数说明

<target>:目标

<item>:库文件

示例

target_link_libraries(${BUILD_TARGET} PRIVATE all_libs appstart)

13、target_link_whole_archive

功能

设置连接器将库中的符号全部加载到链接的库中

语法

# Link targets with --whole-archive. PUBLIC/PRIVATE is required as parameter,

# but PRIVATE will be used forcedly.

function(target_link_whole_archive target signature)

    target_link_libraries(${target} PRIVATE -Wl,--whole-archive)

    foreach(arg ${ARGN})

        target_link_libraries(${target} PRIVATE ${arg})

    endforeach()

    target_link_libraries(${target} PRIVATE -Wl,--no-whole-archive)

endfunction()

主要参数说明

示例

target_link_whole_archive(${BUILD_TARGET} PRIVATE  ${OHOS_FORCE_LINK_LIBS})

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

14、target_link_group

功能

为目标添加链接库组

语法

# Link targets with --start-group. PUBLIC/PRIVATE is required as parameter,

# but PRIVATE will be used forcedly.

function(target_link_group target signature)

    target_link_libraries(${target} PRIVATE -Wl,--start-group)

    foreach(arg ${ARGN})

        target_link_libraries(${target} PRIVATE ${arg})

    endforeach()

    target_link_libraries(${target} PRIVATE -Wl,--end-group)

endfunction()

主要参数说明

示例

target_link_group(${BUILD_TARGET}

PRIVATE

all_libs ${OHOS_ALL_BASE_LIBS} ${OHOS_SERIES_PORT_PARAM} ${libcpp_file_name})

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

15、relative_glob

功能

产生一个匹配的文件列表并将它存储到变量中。如果 RELATIVE 标志位被设定,将返回指定路径的相对路径。

语法

macro(relative_glob var)

    file(GLOB ${var} RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${ARGN})

endmacro()

主要参数说明

示例

relative_glob(srcs include/*.h src/*.c src/*.h)

说明:产生一个匹配include/*.h、src/*.c、src/*.h的文件列表并将它存储到变量srcs中。

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

16、beautify_c_code

功能

将编译后的文件放在和代码文件相同的文件夹中,并且设置格式化选项,使用自定义的排版格式。

语法

function(beautify_c_code target)

    if(ARGN)

        set(beautify_target beautify_${target})

        if(NOT TARGET ${beautify_target})

            add_custom_target(${beautify_target})

            add_dependencies(beautify ${beautify_target})

        endif()

        add_custom_command(TARGET ${beautify_target} POST_BUILD

            COMMAND clang-format -i ${ARGN}

            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

    endif()

endfunction()

主要参数说明

示例

beautify_c_code(appstart ${srcs})

注意:此为extesion.cmake中的扩展指令,就像CMakeList.txt的库一样,加载后可以在CMakeList.txt中使用它的一些自定义函数和定义

17、cmake_minimum_required

功能

指明对cmake的最低(高)版本的要求。

语法

cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])

主要参数说明

VERSION:指明后面的参数为版本号,这个参数是必须的。

min:指定cmake要求的最低版本号,如果cmake实际版本号低于min指定的版本号,cmake的执行过程会终止。

max:指定cmake要求的最高版本号,要求该参数不能小于min。

FATAL_ERROR: 该参数在cmake的2.6及以后的版本被忽略,在cmake的2.4及以前的版本,需要指明该参数,以便cmake能提示失败而不仅仅是一个警告。

示例

cmake_minimum_required(VERSION 3.13)

说明:cmake要求的最低版本号为3.13

补充:cmake的版本号格式为major.minor[.patch[.tweak]],例如cmake的版本号为3.10.2

18、include

功能

载入并运行来自于文件或模块的 CMake 代码

语法

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])

主要参数说明

示例

include(cmake/extension.cmake)

19、define_property

功能

定义和记录自定义属性。在作用域中定义一个用于set_property()和get_property()命令的属性。它主要用于定义属性的初始化或继承方式。

语法

define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |

                 TEST | VARIABLE | CACHED_VARIABLE>

                 PROPERTY <name> [INHERITED]

                 [BRIEF_DOCS <brief-doc> [docs...]]

                 [FULL_DOCS <full-doc> [docs...]]

                 [INITIALIZE_FROM_VARIABLE <variable>])

主要参数说明

第一个参数确定应在其中使用属性的范围类型。它必须是下列之一:

GLOBAL    = associated with the global namespace

DIRECTORY = associated with one directory

TARGET    = associated with one target

SOURCE    = associated with one source file

TEST      = associated with a test named with add_test

VARIABLE  = documents a CMake language variable

CACHED_VARIABLE = documents a CMake cache variable

PROPERTY:属性关键字

<name>:要定义的属性名称

BRIEF_DOCS:关键字,表示简要文档

<brief-doc>:简要文档与属性关联的字符串

FULL_DOCS:关键字,表示完整文档

<full-doc>:完整文档与属性关联的字符串

示例

# Use a global property to collect all application libraries

define_property(GLOBAL

PROPERTY app_libraries

BRIEF_DOCS "app libraries"

                         FULL_DOCS "app libraries" )

说明:为所有应用库设置全局属性“app_libraries”,关联字符串为“app libraries”

20、message

功能

在终端显示消息,类似printf

语法

message([<mode>] "message text" ...)

主要参数说明

mode 的值包括 FATAL_ERROR、WARNING、AUTHOR_WARNING、STATUS、VERBOSE等。常用其中2个——FATAL_ERROR、STATUS。

FATAL_ERROR:产生 CMake Error,会停止编译系统的构建过程;

STATUS:最常用的命令,常用于查看变量值,类似于编程语言中的 DEBUG 级别信息。

"message text"为显示在终端的内容。

示例

message("CMAKE_CURRENT_SOURCE_DIR dir: ${CMAKE_CURRENT_SOURCE_DIR}")

message("CMAKE_CURRENT_BINARY_DIR dir: ${CMAKE_CURRENT_BINARY_DIR}")

说明:在cmakelist.txt所在目录执行cmake .命令即可在终端输出如下目录信息

CMAKE_CURRENT_SOURCE_DIR dir: /home/jwl/safehat/device/soc/unisoc/8910dm/fibocom_l610/liteos_m/sdk

CMAKE_CURRENT_BINARY_DIR dir: /home/jwl/safehat/device/soc/unisoc/8910dm/fibocom_l610/liteos_m/sdk

21、find_package

功能

引入外部依赖包

语法

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]

             [REQUIRED] [[COMPONENTS] [components...]]

             [OPTIONAL_COMPONENTS components...]

             [NO_POLICY_SCOPE])

主要参数说明

PackageName:依赖包名称,必须项;

version:版本号,若指定,则find_package一定要检查找到的包是否与version版本兼容;

EXACT:如果指定,表示必须完全匹配version指定版本的包而不是仅仅兼容就可以;

QUIET:如果指定,表示disable信息输出,即命令运行时不输出相关message,即使没有找到该包。但是如果REQUIRED被指定,还是会有信息输出;

MODULE:表示只用于module模式,即使没有找到也不会进入CONFIG模式;

REQUIRED:表示此包是必须的,如果没有找到,构建程序报错并终止;

[COMPONENTS] [components…]:表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行;

OPTIONAL_COMPONENTS components…:可选的依赖组件,即使找不到也不会影响cmake继续执行;

NO_POLICY_SCOPE:cmake policy,参见:cmake_policy

注:上述参数中,除了PackageName必需,其他都是可选参数。

示例

find_package(Git)

说明:通过在Modules路径下寻找FindGit.cmake引入Git包

补充:cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成,比如FindXXX.cmake和XXXConfig.cmake。只不过,库的作者通常会提供这两个文件,以方便使用者调用。find_package采用两种模式搜索库:

Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成。

Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。

不过cmake默认采取Module模式,如果Module模式未找到库,才会采取Config模式,Config模式是一个备选策略。

22、execute_process

功能

从当前正在执行的CMake进程中派生一个或多个子进程,从而提供了在配置项目时运行任意命令的方法。可以在一次调用 execute_process 时执行多个命令。但请注意,每个命令的输出将通过管道传输到下一个命令中。

语法

execute_process(COMMAND <cmd1> [<arguments>]

                [COMMAND <cmd2> [<arguments>]]...

                [WORKING_DIRECTORY <directory>]

                [TIMEOUT <seconds>]

                [RESULT_VARIABLE <variable>]

                [RESULTS_VARIABLE <variable>]

                [OUTPUT_VARIABLE <variable>]

                [ERROR_VARIABLE <variable>]

                [INPUT_FILE <file>]

                [OUTPUT_FILE <file>]

                [ERROR_FILE <file>]

                [OUTPUT_QUIET]

                [ERROR_QUIET]

                [COMMAND_ECHO <where>]

                [OUTPUT_STRIP_TRAILING_WHITESPACE]

                [ERROR_STRIP_TRAILING_WHITESPACE]

                [ENCODING <name>]

                [ECHO_OUTPUT_VARIABLE]

                [ECHO_ERROR_VARIABLE]

                [COMMAND_ERROR_IS_FATAL <ANY|LAST>])

主要参数说明

COMMAND:子进程命令行。

WORKING_DIRECTORY:指定应该在哪个目录中执行命令。

TIMEOUT:如果在指定的时间内(以秒为单位计算,允许有小数位)子进程执行仍未完成,则将会被中断。

RESULT_VARIABLE:包含进程运行的结果。这要么是一个整数表示执行成功,要么是一个带有错误条件的字符串。

RESULTS_VARIABLE:变量将被设置为以分号分隔的列表形式包含所有进程的结果,按给定命令参数的顺序排列。每个条目都是对应子项的整数返回码或描述错误条件的字符串。

OUTPUT_VARIABLE和ERROR_VARIABLE将包含执行命令的标准输出和标准错误。由于命令的输出是通过管道传输的,因此只有最后一个命令的标准输出才会保存到OUTPUT_VARIABLE中。

INPUT_FILE:指定标准输入重定向的文件名。

OUTPUT_FILE:指定标准输出重定向的文件名。

ERROR_FILE:指定标准错误输出重定向的文件名。

OUTPUT_QUIET和ERROR_QUIET:CMake将静默地忽略标准输出和标准错误。

COMMAND_ECHO <where>:正在运行的命令将被回送到<where>,而<where>将被设置为STDERR、STDOUT或NONE中的一个。

OUTPUT_STRIP_TRAILING_WHITESPACE:删除运行命令的标准输出中的任何尾随空格。

ERROR_STRIP_TRAILING_WHITESPACE:删除运行命令的错误输出中的任何尾随空格。

ENCODING <name>:适用于windows平台,编码名称有NONE、AUTO、ANSI、OEM、UTF8或UTF-8。

ECHO_OUTPUT_VARIABLE, ECHO_ERROR_VARIABLE:标准输出或标准错误不会被专门重定向到配置的变量。

示例

execute_process(COMMAND "${GIT_EXECUTABLE}" describe --abbrev=8 --always --dirty WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}

OUTPUT_VARIABLE         BUILD_GIT_REVISION

OUTPUT_STRIP_TRAILING_WHITESPACE)

23、set_property

功能

在作用域的零个或多个对象上设置一个属性。

语法

set_property(<GLOBAL                      |

              DIRECTORY [<dir>]           |

              TARGET    [<target1> ...]   |

              SOURCE    [<src1> ...]

                        [DIRECTORY <dirs> ...] |

                        [TARGET_DIRECTORY <targets> ...]

              INSTALL   [<file1> ...]     |

              TEST      [<test1> ...]     |

              CACHE     [<entry1> ...]    >

             [APPEND] [APPEND_STRING]

             PROPERTY <name> [<value1> ...])

主要参数说明

第一个参数决定该属性设置所在的域,它必须为下面中的其中之一:

GLOBAL域是唯一的,并且不接特殊的任何名字。

DIRECTORY域默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)。

TARGET域可命名零或多个已经存在的目标。

SOURCE域可命名零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)。

TEST域可命名零或多个已存在的测试。

CACHE域必须命名零或多个已存在条目的cache.

必选项PROPERTY后面紧跟着要设置的属性的名字。其他的参数用于构建以分号隔开的列表形式的属性值。如果指定了APPEND选项,则指定的列表将会追加到任何已存在的属性值当中。如果指定了APPEND_STRING选项,则会将值作为字符串追加到任何已存在的属性值。

示例

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${partinfogen_py} ${CONFIG_PARTINFO_JSON_PATH})

24、project

功能

指定camke工程的名字,还可指定版本号、描述、主页链接以及编译工程所使用的的语言。

语法

project(<PROJECT-NAME> [<language-name>...])

project(<PROJECT-NAME>

        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]

        [DESCRIPTION <project-description-string>]

        [HOMEPAGE_URL <url-string>]

        [LANGUAGES <language-name>...])

主要参数说明

PROJECT_NAME : 必选,用来设置工程名,设置后,会把设置的值存储在CMAKE_PROJECT_NAME变量中

**VERSION **:可选,工程版本号,有主版本号、次版本号、补丁版本号

**DESCRIPTION **:工程简单的的描述

**HOMEPAGE_URL **:工程主页url

**LANGUAGES **:工程使用的语言,默认为C或CXX

示例

project(${BUILD_TARGET} C CXX ASM)

25、include_directories

功能

将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。

语法

include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

主要参数说明

示例

include_directories(${SOURCE_TOP_DIR}/components/newlib/include)

26、add_custom_target

功能:增加一个没有输出的目标(不在all target中),使得它总是被构建,该目标需要手动指定才能执行,类似make clean这种命令(单独make不会执行,需要指定目标ckean)。

语法

add_custom_target(Name [ALL] [command1 [args1...]]

                  [COMMAND command2 [args2...] ...]

                  [DEPENDS depend depend depend ... ]

                  [BYPRODUCTS [files...]]

                  [WORKING_DIRECTORY dir]

                  [COMMENT comment]

                  [JOB_POOL job_pool]

                  [VERBATIM] [USES_TERMINAL]

                  [COMMAND_EXPAND_LISTS]

                  [SOURCES src1 [src2...]])

主要参数说明

Name:target名字

COMMAND:指定要在构建时执行的命令行;

DEPENDS:指定命令所依赖的文件;

COMMENT:在构建时执行命令之前显示给定消息;

WORKING_DIRECTORY:使用给定的当前工作目录执行命令。如果它是相对路径,它将相对于对应于当前源目录的构建树目录;

BYPRODUCTS:指定命令预期产生的文件。

示例

add_custom_target(finish

                 COMMAND ${CMAKE_COMMAND} -E echo compile finish)

27、get_property

功能

获取一个属性值

语法

get_property(<variable>

               <GLOBAL             |

                DIRECTORY [dir]    |

                TARGET    <target> |

                SOURCE    <source> |

                TEST      <test>   |

                CACHE     <entry>  |

                VARIABLE>

               PROPERTY <name>

               [SET | DEFINED |BRIEF_DOCS | FULL_DOCS])

主要参数说明

示例

get_property(app_libraries GLOBAL PROPERTY app_libraries)

28、add_custom_command

功能

自定义生成输出文件

语法

add_custom_command(OUTPUT output1 [output2 ...]

                    COMMAND command1 [ARGS] [args1...]

                    [COMMAND command2 [ARGS] [args2...] ...]

                    [MAIN_DEPENDENCY depend]

                    [DEPENDS [depends...]]

                    [BYPRODUCTS [files...]]

                    [IMPLICIT_DEPENDS <lang1> depend1

                                     [<lang2> depend2] ...]

                    [WORKING_DIRECTORY dir]

                    [COMMENT comment]

                    [DEPFILE depfile]

                    [JOB_POOL job_pool]

                    [VERBATIM] [APPEND] [USES_TERMINAL]

                    [COMMAND_EXPAND_LISTS])

主要参数说明

OUTPUT:目标文件名称,代表下方的命令;

COMMAND:需要执行的命令;

DEPENDS:执行命令时需要的依赖;

示例

add_custom_command(OUTPUT printout

                    COMMAND ${CMAKE_COMMAND} -E echo compile finish

                    VERBATIM

                   )

29、add_dependencies

功能

为目标添加一个依赖关系,编译时目标中的符号定义找不到时就可以添加其他库依赖。

语法

add_dependencies(<target> [<target-dependency>]...)

主要参数说明

示例

add_dependencies(${target} build_${target})

30、add_subdirectory_if_exist

功能

添加一个子目录并构建该子目录,子目录下应该包含CMakeLists.txt文件和代码文件。

语法

add_subdirectory_if_exist (source_dir [binary_dir] [EXCLUDE_FROM_ALL])

主要参数说明

source_dir:必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。

示例

add_subdirectory_if_exist(appstart)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmakelist基本语法 的相关文章

随机推荐

  • Snake-SLAM:VIO、解耦化优化、延迟建图、图优化、鲁棒性初始化

    本来想写一篇文章 xff0c 但是这篇已经写的很好了 xff0c 不再赘述 xff1a 一种解耦非线性优化的高效VI SLAM系统 Snake SLAM
  • PooledByteBuf分配及回收之六PooledUnsafeDirectByteBuf初始化

    PooledByteBufAllocator初始化 PoolThreadCache初始化 PoolAerna初始化 PoolChunk初始化 PoolSubpage初始化 PooledUnsafeDirectByteBuf初始化 分配微小型
  • CubeMx工程增加FreeRtos支持

    对于stm32一些ram和flash相对大一些的mcu xff0c 增加一个实时操作系统 xff0c 会使程序控制更加灵活 本文阐述一下通过CubeMx自动添加FreeRtos的方法 xff0c 和使用visualgdb加载CubeMx生成
  • 整理leetcode刷题过程中遇到的常用库函数(c++)

    整理leetcode刷题过程中遇到的常用库函数 xff08 c 43 43 xff09 如果有额外的了解需求 xff0c 可以在微软c 43 43 库函数进行了解 以下按照我理解的刷题顺序整理 xff1a 数组 数组是刷题的开始 xff0c
  • s5pv210开发与学习:1.3之SD卡学习

    目录 拓展阅读 SD卡 内存 RAM 与外存 ROM 的区别 RAM random access memory 随机访问存储器 特点是任意字节读写 随机访问 xff0c 掉电丢失 ROM read only memory 只读存储器 用于存
  • RT-Thread 开发者能力认证考试样题(RCEA)

    V1 0 RT Thread 开发者能力认证考试样题 RCEA xff09 注 xff1a 样题仅为部分题目 第一小卷 单选题 40 题 40 分钟 40 0 分 1 对两个字符 a 和 b 进行初始化 xff1a char a 61 34
  • Android开发中为什么有些变量会以m开头

    平常在看Android代码和看别人敲代码的时候经常看到有些变量会以m开头 xff0c 这到底是什么样的命名规则呢 xff1f 首先看官网的答案 xff1a Follow Field Naming Conventions Non public
  • Ubuntu 串口设备 USB tty

    Ubuntu 串口设备 USB tty 概述USB查看详细信息 概述 研究Ubuntu下串口设备的连接 xff0c 简单的讲就是看有没有连接上 xff0c 至于使用后面再说 USB 使用命令如下可以查看USB接口的信息 xff0c dmes
  • Nooploop UWB LinkTrack ROS下配置

    Nooploop LinkTrack ROS 1 概述2 ROS下配置3 ROS系统安装4 串行库安装 5 ROS包的配置5 1 找不到libserial so文件5 2 解决办法 6 消息格式7 参考8 延伸阅读传感器配置节点程序分析经典
  • 相机标定之使用Kalibr工具箱

    相机标定之使用Kalibr工具箱 1 概述2 准备3 步骤4 参考链接5 相关链接 1 概述 简单介绍如何使用Kalibr工具箱进行针孔模型相机标定的步骤 xff0c 供自己以后参考 xff0c 同时希望给大家带来帮助 2 准备 提前准备好
  • 机器人学中的状态估计学习笔记(一)第二章 概率论基础

    机器人学中的状态估计学习笔记 xff08 一 xff09 第二章 概率论基础 2 1 概率密度函数2 1 1 定义2 1 2 贝叶斯公式及推断2 1 3 矩2 1 5 统计独立性和不相关性2 1 6 归一化积 2 2 高斯概率密度函数2 2
  • 机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计

    机器人学中的状态估计学习笔记 xff08 二 xff09 第三章线性高斯系统的状态估计 3 1 离散时间的批量估计问题3 1 1 问题定义3 1 2 最大后验估计3 1 3 贝叶斯推断3 1 4 存在性 唯一性与能观性情况1 xff1a 有
  • PooledByteBuf分配及回收之十PoolChunkList源码解析

    PooledByteBufAllocator初始化 PoolThreadCache初始化 PoolAerna初始化 PoolChunk初始化 PoolSubpage初始化 PooledUnsafeDirectByteBuf初始化 分配微小型
  • 机器人学中的状态估计学习笔记(三)第四章 非线性非高斯系统的状态估计

    机器人学中的状态估计学习笔记 xff08 三 xff09 第四章 非线性非高斯系统的状态估计 4 1 引言4 2 离散时间的递归估计问题4 3 离散时间的批量估计问题 4 1 引言 本小节主要是从一个简化的 一维度的非线性状态估计问题 估计
  • Camera-IMU联合标定原理

    Camera IMU联合标定原理 一 相机投影模型二 IMU 模型三 Camera IMU标定模型 一 相机 IMU旋转 二 相机 IMU平移 三 视觉惯性代价函数 四 camera imu联合标定 一 粗略估计camera与imu之间时间
  • 里程计及基于双目视觉的视觉里程计(stereo visual odometry)

    里程计在slam算法中扮演的作用不言而喻 xff0c 通常里程计可以分为轮子编码器的里程计 wheel odometry 和视觉里程计 visual odometry 而视觉里程计又可分为基于单目的视觉里程计 monocular odome
  • WIN7镜像中增加USB3.0驱动和语言包

    原版的win7镜像没有集成USB3 0的驱动 xff0c 如今的电脑主板基本是XHCI主控 xff08 以前是EHCI的 xff09 xff0c 这一变动导致在安装Win7的过程中会出现USB接口全部失灵的状况 xff0c 所以在安装时无法
  • Linux静态库与动态库示例之hello world

    Linux静态库与动态库示例之hello world 1 Linux动态库与静态库的基本概念 linux下有两种库 动态库和静态库 共享库 xff0c 二者的不同点在于代码被载入的时刻不同 静态库的代码在编译过程中已经被载入可执行程序 因此
  • 卡尔曼滤波原理及其在RSSI测距中的应用

    nbsp nbsp nbsp nbsp 卡尔曼滤波 Kalman filter 是一种高效的自回归滤波器 它能在存在诸多不确定性情况的组合信息中估计动态系统的状态 是一种强大的 通用性极强的工具 它的提出者 鲁道夫 E 卡尔曼 在一次访问N
  • cmakelist基本语法

    一 几个基本概念 xff1a 1 GCC a 由GUN 开发的编译器 支持C C 43 43 Java等语言 b 项目简单时 可以使用gcc g 43 43 来进行编译 c 项目复杂时 只使用gcc来进行编译会变得非常复杂 2 make a