【语法】

注释  # :   
    #我是注释

命令语法 COMMAND:
    COMMAND(参数1 参数2 ...)

字符串列

A;B;C           //分号分割或空格分隔的值

变量
    set(Foo a b c)             // 设置变量 Foo
    command(${Foo})     //等价于 command(a b c)
    command("${Foo}")  // 等价于 command("a b c")
    command("/${Foo}") // 转义,和 a b c无关联

流控制结构
    IF()...ELSE()  /ELSEIF()...ENDIF()
    WHILE()...ENDWHILE()
    FOREACH()...ENDFOREACH()

【常用命令】

(按A~Z排列)

ADD_EXECUTABLE
add_exectuable  : 工程生成一个可执行文件。
add_executable(hello ${SRC_LIST})  //生成一个名为hello.exe的可执行文件

ADD_LIBRARY
add_library :  生成一个库文件。
add_library(libhello ${LIB_SRC})                  //生成libhello.lib文件
add_library(libhello SHARED ${LIB_SRC})  //生成动态库文件

ADD_CUSTOM_TARGET
自定义目标,生成一个自定义文件类型

add_subdirectory :增加子文件夹,2个参数的话就是 源→目标 文件夹生成对应 
add_subdirectory(src) :建立src子文件夹
add_subdirectory(src bin)  :在cmake目标文件夹中与源文件夹对应 src→bin文件夹

ADD_DEPENDENCIES( target1 t2 t3 )
目标target1依赖于t2 t3

ADD_DEFINITIONS( "-Wall -ansi")
本意是供设置 -D... /D... 等编译预处理需要的宏定义参数,对比 REMOVE_DEFINITIONS()

AUX_SOURCE_DIRECTORY ( “sourcedir” variable)
收集目录中的文件名并赋值给变量

EXEC_PROGRAM ( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] )
 执行外部程序

FILE ( WRITE|READ|APPEND|GLOB| GLOB_RECURSE|REMOVE|MAKE_DIRECTORY ...)
文件操作

FIND_FILE
FIND_PATH
FIND_LIBRARY
FIND_PACKAGE
    上述4个注意 CMAKE_LIBRARY_PATH

FIND_PROGRAM

INCLUDE_DIRECTORIES ( "dir1" "dir2" ... )
include_directories  : 包含指定目录下的指定文件夹
include_directories(${PROJECT_SOURCE_DIR}/libhello)  //包含当前目录下的libhello文件夹

INSTALL ( FILES “f1” “f2”DESTINATION . )
DESTINATION (目标文件夹)相对于 ${CMAKE_INSTALL_PREFIX}
 
LINK_DIRECTORIES ("dir1" "dir2")
 库文件路径。注意:由于历史原因,相对路径会原样传递给链接器。尽量使用FIND_LIBRARY而避免使用这个。
 
LINK_LIBRARIES ( lib1 lib2 ...)
设置所有目标需要链接的库

LIST ( APPEND|INSERT|LENGTH|GET| REMOVE_ITEM|REMOVE_AT|SORT ...)
列表操作

MESSAGE (...)  输出信息,方便检查调试

message(${PROJECT_SOURCE_DIR})

project

建立一个工程
project   不是强制性的,但最好始终都加上。这一行会引入两个变量
•HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
同时,cmake自动定义了两个等价的变量
•PROJECT_BINARY_DIR   和  PROJECT_SOURCE_DIR
如果是out-of-source方式构建(源代码和生成的中间产物分离),所以要时刻区分这两个变量对应的目录

SET
set (SRC_LIST hello.cpp)  //源文件列表 hello.cpp
set (APP_SRC main.c)       //语义基本同上,具体不太了解
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)  //指定生成hello.exe到目标文件夹

SET_TARGET_PROPERTIES ( ... ): 设置目标的属性 OUTPUT_NAME, VERSION, ....
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")  //使libhello.lib输出文件名为hello.exe

SEPARATE_ARGUMENTS ( VAR )
转换空格分隔的字符串到列表

STRING ( TOUPPER|TOLOWER|LENGTH| SUBSTRING|REPLACE|REGEX ...)
字符串操作

TARGET_LINK_LIBRARIES ( target-name lib1 lib2 ...)
target_link_libraries  :  将指定库文件链接到某个执行文件
target_link_libraries(hello libhello)   //将libhello.lib文件链接到hello.exe

【常见变量】

----工程路径------

•CMAKE_SOURCE_DIR
•PROJECT_SOURCE_DIR
•<projectname>_SOURCE_DIR
这三个变量指代的内容是一致的,是工程顶层目录

•CMAKE_BINARY_DIR
•PROJECT_BINARY_DIR
•<projectname>_BINARY_DIR
这三个变量指代的内容是一致的,如果是in source编译,指得就是工程顶层目录,如果  是out-of-source编译,指的是工程编译发生的目录

•CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的CMakeLists.txt所在的路径。

•CMAKE_CURRRENT_BINARY_DIR
如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource  编译,他指的是target编

译目录。

•CMAKE_CURRENT_LIST_FILE
输出调用这个变量的CMakeLists.txt的完整路径

----CMAKE_BUILD_TYPE-----

控制 Debug 和 Release 模式的构建

•CMakeList.txt文件
SET(CMAKE_BUILD_TYPE Debug)•命令行参数
cmake DCMAKE_BUILD_TYPE=Relea

-----编译器参数-----

•CMAKE_C_FLAGS
•CMAKE_CXX_FLAGS
也可以通过指令ADD_DEFINITIONS()添加

CMAKE_INCLUDE_PATH
配合 FIND_FILE() 以及 FIND_PATH() 使用。如果头文件没有存放在常规路径/usr/include, /usr/local/include等),
则可以通过这些变量就行弥补。如果不使用 FIND_FILE 和 FIND_PATH的话,CMAKE_INCLUDE_PATH,没有任何作

用。

•CMAKE_LIBRARY_PATH

配合 FIND_LIBRARY() 使用。否则没有任何作用

•CMAKE_MODULE_PATH

cmake 为上百个软件包提供了查找器(finder):FindXXXX.cmake

当使用非cmake自带的finder时,需要指定finder的路径,这就是CMAKE_MODULE_PATH,配合 FIND_PACKAGE

()使用

CMAKE_INSTALL_PREFIX
控制make install是文件会安装到什么地方。默认定义是/usr/local 或 %PROGRAMFILES%

BUILD_SHARED_LIBS
如果不进行设置,使用ADD_LIBRARY且没有指定库类型,默认编译生成的库是静态库。

UNIX 与 WIN32
•UNIX,在所有的类UNIX平台为TRUE,包括OS X和cygwin
•WIN32,在所有的win32平台为TRUE,包括cygwin

更多CMake信息参考

学习如何写CMakeLists参考如下网址,写的不错

CMAKE语法的更多相关文章

  1. CMake语法—内置变量

    目录 CMake语法-内置变量 1 CMake变量分类 1.1 普通变量 1.2 缓存变量 1.3 环境变量 1.4 内置变量 2 CMake内置变量分类 2.1 提供信息的变量 2.2 改变行为的变 ...

  2. CMake语法—普通变量与函数(Normal Variable And Function)

    目录 CMake语法-普通变量与函数(Normal Variable And Function) 1 CMake普通变量与函数示例 1.1 CMakeLists.txt 1.2 执行CMake配置脚本 ...

  3. CMake语法—普通变量与子目录(Normal Variable And Subdirectory)

    目录 CMake语法-普通变量与子目录(Normal Variable And Subdirectory) 1 CMake普通变量与子目录示例 1.1 代码目录结构 1.2 父目录CMakeLists ...

  4. CMake语法—普通变量与包含、宏(Normal Variable And Include、Macro)

    目录 CMake语法-普通变量与包含.宏(Normal Variable And Include.Macro) 1 CMake普通变量与包含.宏示例 1.1 代码目录结构 1.2 根目录CMakeLi ...

  5. CMake语法—缓存变量(Cache Variable)

    目录 CMake语法-缓存变量(Cache Variable) 1 CMake缓存变量 2 定义缓存变量 2.1 定义格式 2.2 定义示例代码 2.3 运行结果 2.4 小结 3 CMakeCach ...

  6. CMake语法—环境变量(Environment Variable)

    目录 CMake语法-环境变量(Environment Variable) 1 定义环境变量 2 应用环境变量 2.1 代码结构 2.2 示例代码 2.3 运行结果 3 小结 CMake语法-环境变量 ...

  7. linux中cmake语法的学习

    在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大.常常,写代码,效率才是王道.这里还有自动化的项目构建工具C ...

  8. cmake 语法

    语法说明 CMakeLists.txt 文件遵循一种简单的语法包括 注释,命令和空格字符.注释使用#符号,从符号开始之后的一行都表示注释.命令包括命令名,左括号,分隔参数的空白字符和右括号.命令既可以 ...

  9. cmake语法入门记录

    刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...

随机推荐

  1. 用jquery或js实现三个div自动循环轮播

    //3个div的统一class = 'div' var index =0; //3秒轮播一次 var timer = setInterval(function(){     index = (inde ...

  2. 使用js给页面显示的图片添加水印效果

    功能描述:使用Jquery 给页面的图片添加 版权信息水印. 这里的水印并不是真的把每一张图片上都添加了水印.而是在图片的上方添加了一个层,层中包含了水印图片效果就像是图片上加了水印. 功能原理:1, ...

  3. The APR based Apache Tomcat Native library 异常解决办法

    tomat在linux服务器上启动报The APR based Apache Tomcat Native library which allows optimal performance in pro ...

  4. 管理工具MongoVUE使用

    连接数据库 管理数据库 查询 1,查询所有 2,查询命令窗口

  5. GUID

    前言 全局唯一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA ...

  6. 转载——PLSQL developer 连接不上64位Oracle 解决办法

    前两天刚下载了oracle 11g 64位的最新版本,安装成功之后,再安装PLSQL.结果使用PLSQL访问数据库时,死活连接不上.报错如下: Could not load "……\bin\ ...

  7. bzoj 2241: [SDOI2011]打地鼠

    #include<cstdio> #include<iostream> using namespace std; ][],b[][],ans,sum; void pan(int ...

  8. adMob iAd整合,随机根据网络状况自动显示。

    最近找整合的代码,找到的都不对,有个大概对的,但要奔溃退出,只要两个单独弄. adMob 下载好sdk,导入进去,iAd的加入iad framework. 使用方法,在viewController v ...

  9. 酷狗音乐盒缓存文件夹KuGouCache的设置方法

    1.每次一打开酷狗总能在E盘里找到这个 KuGouCache 文件夹 ,是自动生成的MV缓存文件 .按照常规 ,可以修改这个文件的办法是 找到C盘里的:用户\administrator\AppDate ...

  10. xcode6中如何添加pch文件

    在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字的pch (precompile header)文件,在开发过程中,可以将那些整个工程都广泛使用的头文件包含在该文件下,编 ...