一、几个基本概念:
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(使用前将#替换为@)