CMakeListx.txt 编辑语法学习

已hello.cpp为源文件,构建一个CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(hello)
add_executable(hello hello.cpp)

在目录中的build 文件夹中进行cmake ..和make ,就可以编译源文件生成可运行文件.

cmake的常用命令:

project 命令

语句 : project(<projectname> [languageName1 languageName2 … ] )

作用 : 指定项目名

cmake_minimum_required 命令

语句 : cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])

作用 : 指定cmake需要的最小版本

aux_source_directory 命令

语句 : aux_source_directory(<dir> <variable>)

作用 : 获取指定目录下的所有文件,保存到variable中,包括 .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx文件

示例 : aux_source_directory(. var)#获取当前目录中源文件

add_executable 命令

语句 : add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

作用 : 将指定文件source编译成可执行文件,命名位name

示例 : add_executable(hello hello.cpp)

add_library 命令

语句 : add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

作用 : 添加一个名为<name>的库文件,指定STATIC,SHARED,或者MODULE参数用来指定要创建的库的类型。STATIC库是目标文件的归档文件,在链接其它目标的时候使用。SHARED库会被动态链接,在运行时被加载。MODULE库是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接。如果没有类型被显式指定,这个选项将会根据变量BUILD_SHARED_LIBS的当前值是否为真决定是STATIC还是SHARED

示例 : add_library(Lib ${DIR_SRCS})

add_dependencies 命令

语句 : add_dependencies(target-name depend-target1 depend-target2 …)

作用 : 用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须是 add_executable、add_library、add_custom_target 命令创建的目标

add_subdirectory 命令

语句 : add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

作用 : 用于添加一个需要进行构建的子目录

示例 : add_subdirectory(directory)

target_link_libraries 命令

语句 : target_link_libraries(<target> [item1 [item2 […]]] [[debug|optimized|general] ] …)

作用 : 用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)

示例 : target_link_libraries(Main Lib)

set 命令

语句 : set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

作用 : 用于设定变量 variable 的值为 value。variable可以自己定义

示例 : set(var "${list}_exe")

unset 命令

语句 : unset(<variable> [CACHE])

作用 : 用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。

示例 : unset(VAR CACHE)

message 命令

语句 : message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)

作用 : 输出信息

示例 : message("hello world")

include_directories 命令

语句 : include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

作用 : 用于设定目录,这些设定的目录将被编译器用来查找 include 文件

示例 : include_directories(${PROJECT_SOURCE_DIR}/lib)

find_path 命令

语句 : find_path(<VAR> name1 [path1 path2 …])

作用 : 用于查找包含文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。默认的情况下,VAR 会被保存在 Cache 中,这时候我们需要清除 VAR 才可以进行下一次查询(使用 unset 命令)

add_definitions 命令

语句 : find_library(<VAR> name1 [path1 path2 …])

作用 : 用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义

示例 : add_definitions(-D_UNICODE -DUNICODE)

execute_process 命令

语句 : execute_process(COMMAND <cmd1> [args1...]]  [COMMAND <cmd2> [args2...] [...]]

[WORKING_DIRECTORY <directory>]

[TIMEOUT <seconds>]

[RESULT_VARIABLE <variable>]

[OUTPUT_VARIABLE <variable>]

[ERROR_VARIABLE <variable>]

[INPUT_FILE <file>]

[OUTPUT_FILE <file>]

[ERROR_FILE <file>]

[OUTPUT_QUIET]

[ERROR_QUIET]

[OUTPUT_STRIP_TRAILING_WHITESPACE]

[ERROR_STRIP_TRAILING_WHITESPACE])

作用 : 用于执行一个或者多个外部命令。每一个命令的标准输出通过管道转为下一个命令的标准输入。WORKING_DIRECTORY 用于指定外部命令的工作目录,RESULT_VARIABLE 用于指定一个变量保存外部命令执行的结果,这个结果可能是最后一个执行的外部命令的退出码或者是一个描述错误条件的字符串,OUTPUT_VARIABLE 或者 ERROR_VARIABLE 用于指定一个变量保存标准输出或者标准错误,OUTPUT_QUIET 或者 ERROR_QUIET 用于忽略标准输出和标准错误。

示例 : execute_process(COMMAND ls)

file 命令

语句 : file(WRITE filename "message to write"... )

作用 : WRITE选项将会写一条消息到名为filename的文件中。如果文件已经存在,该命令会覆盖已有的文件;如果文件不存在,它将创建该文件。

===========================================================

语句 : file(APPEND filename "message to write"... )

作用 : APPEND选项和WRITE选项一样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。

===========================================================

语句 : file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])

作用 : READ选项将会读一个文件中的内容并将其存储在变量里。读文件的位置从offset开始,最多读numBytes个字节。如果指定了HEX参数,二进制代码将会转换为十六进制表达方式,并存储在变量里。

===========================================================

语句 : file(STRINGS filename variable [LIMIT_COUNT num] [LIMIT_INPUT numBytes]  [LIMIT_OUTPUT numBytes]

[LENGTH_MINIMUM numBytes]   [LENGTH_MAXIMUM numBytes]

[NEWLINE_CONSUME] [REGEX regex]  [NO_HEX_CONVERSION])

作用 : STRINGS将会从一个文件中将一个ASCII字符串的list解析出来,然后存储在variable变量中。文件中的二进制数据会被忽略。回车换行符会被忽略。它也可以用在Intel的Hex和Motorola的S-记录文件;读取它们时,它们会被自动转换为二进制格式。可以使用NO_HEX_CONVERSION选项禁止这项功能。LIMIT_COUNT选项设定了返回的字符串的最大数量。LIMIT_INPUT设置了从输入文件中读取的最大字节数。LIMIT_OUTPUT设置了在输出变量中存储的最大字节数。LENGTH_MINIMUM设置了要返回的字符串的最小长度;小于该长度的字符串会被忽略。LENGTH_MAXIMUM设置了返回字符串的最大长度;更长的字符串会被分割成不长于最大长度的字符串。NEWLINE_CONSUME选项允许新行被包含到字符串中,而不是终止它们。REGEX选项指定了一个待返回的字符串必须满足的正则表达式。

===========================================================

语句 : file(GLOB variable [RELATIVE path] [globbing expressions]...)

作用 : GLOB选项将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。文件名查询表达式与正则表达式类似,只不过更加简单。如果为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。

===========================================================

语句 : file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)

作用 : GLOB_RECURSE选项将会生成一个类似于通常的GLOB选项的list,只是它会寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件。作为符号链接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。参见cmake --help-policy CMP0009 查询跟多有用的信息。

===========================================================

语句 : file(RENAME <oldname> <newname>)

作用 : RENAME选项对同一个文件系统下的一个文件或目录重命名。

===========================================================

语句 : file(REMOVE [file1 ...])

作用 : REMOVE选项将会删除指定的文件,包括在子路径下的文件。

===========================================================

语句 : file(REMOVE_RECURSE [file1 ...])

作用 : REMOVE_RECURSE选项会删除给定的文件以及目录,包括非空目录。

===========================================================

语句 : file(MAKE_DIRECTORY [directory1 directory2 ...])

作用 : MAKE_DIRECTORY选项将会创建指定的目录,如果它们的父目录不存在时,同样也会创建。(类似于mkdir命令——译注)

===========================================================

语句 : file(RELATIVE_PATH variable directory file)

作用 : RELATIVE_PATH选项会确定从direcroty参数到指定文件的相对路径。

===========================================================

语句 : file(TO_CMAKE_PATH path result)

作用 : TO_CMAKE_PATH选项会把path转换为一个以unix的 / 开头的cmake风格的路径。输入可以是一个单一的路径,也可以是一个系统路径,比如"$ENV{PATH}"。注意,在调用TO_CMAKE_PATH的ENV周围的双引号只能有一个参数(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。

===========================================================

语句 : file(TO_NATIVE_PATH path result)

作用 : TO_NATIVE_PATH选项与TO_CMAKE_PATH选项很相似,但是它会把cmake风格的路径转换为本地路径风格:windows下用\,而unix下用/。

===========================================================

语句 : file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS])

作用 : DOWNLOAD 将给定的URL下载到指定的文件中。如果指定了LOG var选项,下载日志将会被输出到var中。如果指定了STATUS var选项,下载操作的状态会被输出到var中。该状态返回值是一个长度为2的list。list的第一个元素是操作的数字返回值,第二个返回值是错误的字符串值。错误信息如果是数字0,操作中没有发生错误。如果指定了TIMEOUT time选项,在time秒之后,操作会超时退出;time应该是整数。如果指定了EXPECTED_MD5 sum选项,下载操作会认证下载的文件的实际MD5和是否与期望值匹配。如果不匹配,操作将返回一个错误。如果指定了SHOW_PROGRESS选项,进度信息会以状态信息的形式被打印出来,直到操作完成。

cmake 常用语句

条件控制

======================

if(expression)

# ...

elseif(expression2)

# ...

else()

# ...

endif()

======================

对于 if(string) 来说:

  1. 如果 string 为(不区分大小写)1、ON、YES、TRUE、Y、非 0 的数则表示真
  2. 如果 string 为(不区分大小写)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 结尾的字符串则表示假
  3. 如果 string 不符合上面两种情况,则 string 被认为是一个变量的名字。变量的值为第二条所述的各值则表示假,否则表示真

===========================================================

if中的语句:

  1. if(NOT expression)
    为真的前提是 expression 为假
  2. if(expr1 AND expr2)
    为真的前提是 expr1 和 expr2 都为真
  3. if(expr1 OR expr2)
    为真的前提是 expr1 或者 expr2 为真
  4. if(COMMAND command-name)
    为真的前提是存在 command-name 命令、宏或函数且能够被调用
  5. if(EXISTS name)
    为真的前提是存在 name 的文件或者目录(应该使用绝对路径)
  6. if(file1 IS_NEWER_THAN file2)
    为真的前提是 file1 比 file2 新或者 file1、file2 中有一个文件不存在(应该使用绝对路径)
  7. if(IS_DIRECTORY directory-name)
    为真的前提是 directory-name 表示的是一个目录(应该使用绝对路径)
  8. if(variable|string MATCHES regex)
    为真的前提是变量值或者字符串匹配 regex 正则表达式
  9. if(variable|string LESS variable|string)
    if(variable|string GREATER variable|string)
    if(variable|string EQUAL variable|string)
    为真的前提是变量值或者字符串为有效的数字且满足小于(大于、等于)的条件
  10. if(variable|string STRLESS variable|string)
    if(variable|string STRGREATER variable|string)
    if(variable|string STREQUAL variable|string)
    为真的前提是变量值或者字符串以字典序满足小于(大于、等于)的条件
  11. if(DEFINED variable)
    为真的前提是 variable 表示的变量被定义了

循环结构

foreach循环

======================

set(VAR a b c)

foreach(f ${VAR})

message(${f})

endforeach()

======================

while循环

======================

set(VAR 5)

while(${VAR} GREATER 0)

message(${VAR})

math(EXPR VAR "${VAR} - 1")

endwhile()

======================

宏定义

macro循环

======================

# 定义一个宏 hello

macro(hello MESSAGE)

message(${MESSAGE})

endmacro()

# 调用宏 hello

hello("hello world")

# 定义一个函数 hello

function(hello MESSAGE)

message(${MESSAGE})

endfunction()

?======================?

函数定义

======================

function(get_func RESULT)

# RESULT 的值为实参的值,因此需要使用 ${RESULT}

# 这里使用 PARENT_SCOPE 是因为函数会构建一个局部作用域

set(${RESULT} "Hello Function" PARENT_SCOPE)

endfunction()

macro(get_macro RESULT)

set(${RESULT} "Hello Macro")

endmacro()

get_func(V1)

# 输出 Hello Function

message(${V1})

get_macro(V2)

# 输出 Hello Macro

message(${V2})

?======================?

字符串控制

string(REGEX MATCH (regular_expression) (output variable) (input) [(input)...])
    string(REGEX MATCHALL (regular_expression) (output variable) (input) [(input)...])
    string(REGEX REPLACE (regular_expression) (replace_expression) (output variable) (input) [(input)...])
    string(REPLACE (match_string) (replace_string) (output variable) (input) [(input)...])
    string(COMPARE EQUAL (string1) (string2) (output variable))
    string(COMPARE NOTEQUAL (string1) (string2) (output variable))
    string(COMPARE LESS (string1) (string2) (output variable))
    string(COMPARE GREATER (string1) (string2) (output variable))
    string(ASCII (number) [(number) ...] (output variable))
    string(CONFIGURE (string1) (output variable) [@ONLY] [ESCAPE_QUOTES])
    string(TOUPPER (string1) (output variable))
    string(TOLOWER (string1) (output variable))
    string(LENGTH (string) (output variable))
    string(SUBSTRING (string) (begin) (length) (output variable))
    string(STRIP (string) (output variable))
    string(RANDOM [LENGTH (length)] [ALPHABET (alphabet)] (output variable))

cmake 常用变量


  1. UNIX 如果为真,表示为 UNIX-like 的系统,包括 Apple OS X 和 CygWin
  2. WIN32 如果为真,表示为 Windows 系统,包括 CygWin
  3. APPLE 如果为真,表示为 Apple 系统
  4. CMAKE_SIZEOF_VOID_P 表示 void* 的大小(例如为 4 或者 8),可以使用其来判断当前构建为 32 位还是 64 位
  5. CMAKE_CURRENT_LIST_DIR 表示正在处理的 CMakeLists.txt 文件的所在的目录的绝对路径(2.8.3 以及以后版本才支持)
  6. CMAKE_ARCHIVE_OUTPUT_DIRECTORY 用于设置 ARCHIVE 目标的输出路径
  7. CMAKE_LIBRARY_OUTPUT_DIRECTORY 用于设置 LIBRARY 目标的输出路径
  8. CMAKE_RUNTIME_OUTPUT_DIRECTORY 用于设置 RUNTIME 目标的输出路径

可能会用到的一些命令

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_source_file_property  为一个源文件获取一种属性值

get_source_file_property(VAR file property)

get_target_property 从一个目标中获取一个属性值

get_target_property(VAR target property)

get_test_property 获取一个测试的属性

get_test_property(test VAR property)

get_cmake_property  获取一个CMake实例的属性

get_cmake_property(VAR property)

get_filename_component 得到一个完整文件名中的特定部分

get_filename_component(<VAR> FileName                         PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH                         [CACHE])

get_cmake_property  获取一个CMake实例的属性。

get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)

参考 : http://www.cnblogs.com/coderfenghc/archive/2012/07/08/2581734.html

http://name5566.com/1795.html

时间: 2024-10-29 19:08:19

CMakeListx.txt 编辑语法学习的相关文章

cmake语法学习

1.项目最外层cmake编写:----------用于kdevelop编译器 ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× eg: project(filtering) cmake_minimum_required(VERSION 2.8) ————必须有的 include_directories(${PROJECT_SOURCE_DIR}/src)  ————设置include头文件查找路径lin

Robot Framework语法学习(一)

Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edit区点Add Scalar或Add List来新增变量. 3.变量赋值: 1)Set赋值:通常这种方式主要使用Set Variable或类似的使用了Set的关键字对变量进行赋值 ${type}  Set Variable  2013 2) Get赋值:主要用于返回值上,包括系统关键字的返回值和用户关

正则表达式语法学习

正则表达式用到的地方很多很广,一般用于验证 此文讲解了正则表达式的语法,以下内容转自网友[丰衣足食]的帖子 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 后向引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配

【JavaScript】02.基础语法学习

[JavaScript]02.基础语法学习 引言: 老农认为(老农是我对自己的昵称),学习任何一门计算机程序语言都要先从它的语法知识开始.计算机程序语言由一堆预定义的字符和书写这些字符的规则组成.这些预定义的字符在语言里面叫做关键字或者保留字,书写这些字符的规则叫做语法. 计算机语言(Computer Lnguage),是指用于人与计算机之间通讯的语言.语言分为自然语言与人工语言两大类.自然语言是人类在自身发展的过程中形成的语言,是人与人之间传递信息的媒介.人工语言指的是人们为了某种目的而自行设

Java语法学习概述

Java语法学习概述: 1,数值型有:    整数类型分     byte:127到-128 8位(1个字节);只用后七位表示数字 第一位表            示正负号;特点最基本数据单元,占空间少 short:16位(2个字节)短整型 -32768到32767 int:32位(4个字节) 整型 正负21亿 写程序大部分用int写 long:64位(8个字节) 长整型 +-922后面16个零多           数字后面加字母L 或小写l 表示long型数据           用数字表示

转 python语法学习面向对象之继承

传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始化方法__init__,可以理解为构造,self,理解为this,等等在前一篇文章中介绍过,现在就学习类的继承. 继承: 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法   class 派生类

Swift高级语法学习总结(转)

Swift高级语法学习总结 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参数需要指明类型,而如果没有返回值可以不写->(),返回值只需要写返回类型,如果写了返回名称,可以在函数调用后的值用点语法访问 1.3 在参数名称前可以加上外部参数名,调用的时候就可以带上它了,如果外部参数名和内部参数名相同则可以直接在内部参数名前加#即可 1.4 如果跟参数设置一个默认值,则swift会

Swift基础语法学习总结(转)

Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的. 1.3) swift在语句后面加分号与否都是正确的,但是swift偏好的风格是不在结尾处加分号的.如果有多个语句,必须用分号隔开. 1.4) 在一个数字中庸下划线(_)会被忽视,方便认出大数值的的数字,也可以在前面补零. 1.5) swift不允许在不同种类型间做加减乘

python 语法学习

同时给x,y,z赋值: x,y,z=1,2,3 x值与y的值交换 x,y=y,x python 语法学习