Cmake的输入是在源码目录下的CMakeLists.txt文件。这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件。

语法

  CMakeList.txt文件是由注释、命令和空白字符组成。

  注释是由 # 开始,到行结尾。

  命令是由:命令名、(、空格分隔的参数、)组成。

  例如:command (args….)

  上面的command可以是一个命令名;或者是一个宏;也可以是一个函数名。

  args是以空格分隔的参数例表(如果参数中包含空格,则要加双引号)

  除了用于分隔参数的空白字符(空格、换行号、tabs)都是被忽略不计的。任何包含在双引号中的字符都做为一个参数。一个反斜杠用于转换码。

  命令名是大小写不敏感的。

字符串(string)和字符串列表(lists)

  CMake的基本数据类型是字符串(string)。CMake也支持由字符串组成的字符串列表。字符串列表可以由;或空格分隔的组成。例如:下面设置变量var是等效的。

  set(var a;b;c)

  set(var a b c)

  字符串列表可以用 foreach命令叠代(iterated)或list命令操作。

变量

  CMake支持简单的变量:字符串或字符串列表。用${VAR} 语法得到变量的引用。

  可以用一个set命令把一个字符串列表设置为一个变量,然后把这个变量传递给需要传递多参数的函数。例如:

  set(Foo a b c)

  command(${Foo})

  上面两行等效 command(a b c)

  如果你想传把一个字符串列表做为一个单独的参数传递给函数,用双引号包含它。例如:

  Command(“${Foo}”)

  等效于:command(“a b c”)

环境变量:

  用$ENV{VAR}得到环境变量的引用

  设置环境变量:

  Set(ENV{VAR} /home)

程序流控制

  CMake提供三种程序流控制结构:

1.条件声明:if

  # some_command will be called if the variable's value is not:
  # empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND. 
  if(var) 
      some_command(...) 
  endif(var)

2. 循环控制:foreach 和 while

  set(VAR a b c) 
  # loop over a, b,c with the variable f 
  foreach(f ${VAR}) 
    message(${f}) 
  endforeach(f)

3.程序定义:宏或函数(函数在CMake2.6以后的版本才支持)。函数建立本地范围内的变量,宏用于全局范围内。

# define a macro hello
macro(hello MESSAGE)
  message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")
# define a function hello
function(hello MESSAGE)
  message(${MESSAGE})
endfunction(hello)

  函数可以返回,可以用 return()命令返回。如果要从函数中返回值,只能通过参数返回:

  #定义函数 get_lib从给定的目录查找指定的库,并把它传回到参数 lib_FILE中

function(get_lib lib_FILE lib_NAME lib_PATH)
#message("lib_name:""${lib_NAME}")
set(__LIB "__LIB-NOTFOUND")
#message("__LIB:""${__LIB}")
find_library(__LIB ${lib_NAME} ${lib_PATH})
if(__LIB STREQUAL "__LIB-NOTFOUND")
message("don't find ${lib_NAME} librarys in ${lib_PATH}")
return()
endif()
#message("__LIB:""${__LIB}")
set(${lib_FILE} ${__LIB}PARENT_SCOPE)
endfunction(get_lib)

set命令中 PARENT_SCOPE表示传递给函数调用者所拥有的变量

模板

├── bin
│ └── main
├── build
├── CMakeLists.txt
├── doc
├── README
└── src
├── CMakeLists.txt
├── libs
│ ├── hello.cpp
│ └── hello.h
├── main.cpp
└── modules

根目录下的CMakeLists.txt:

#项目名称
PROJECT(hello)
#声明要求的最小版本
cmake_minimum_required(VERSION 2.6) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2")
#添加参与编译的子目录 我理解为:添加下一个CMakeLists.txt
add_subdirectory(src)

src下的:

#添加头文件的查找目录 && 在编译参数"-l" ,指定搜索头文件的路径
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/libs)
SET(SEC_LIST
main.cpp
libs/hello.cpp
)
ADD_EXECUTABLE(main ${SEC_LIST}) #TARGET_LINK_LIBRARIES 用来链接 -l后的文件依赖
#TARGET_LINK_LIBRARIES(CRNode thread) #EXECUTABLE_OUTPUT_PATH && LIBRARY_OUTPUT_PATH用来指定二进制文件位置和库文件路径,这里不包括中间文件
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #关于install 请看http://now-code.com/archives/208

包含库的目录:

├── bin
├── build
├── CMakeLists.txt
├── doc
├── README
└── src
├── apps
│ ├── CMakeLists.txt
│ └── main.cpp
├── CMakeLists.txt
├── includes
│ └── hello.h
├── libs
│ ├── CMakeLists.txt
│ └── hello.cpp
└── modules

根目录下:

PROJECT(hello)

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2") add_subdirectory(src)

src->apps 下:


set(myexe_EXEC_SRCS
main.cpp
# 其它cpp文件
)
#一定要包含main.cpp 包含的"*.h"文件
include_directories(
${PROJECT_SOURCE_DIR}/src/includes/
#${PROJECT_BINARY_DIR}/src/libs/
#${PROJECT_SOURCE_DIR}/src/libs/markup
#${PROJECT_SOURCE_DIR}/src/modules/
#/opt/Ice/include
)
#库文件路径
link_directories(
/usr/local/lib
#$ENV{ORACLE_HOME}/lib
) #添加自己生成的动态库/静态库 设置目标所需要的链接库
#link_libraries(myexe markup)
link_libraries(main hellolib) add_executable(main ${myexe_EXEC_SRCS})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/) #install(TARGETS main RUNTIME DESTINATION bin)

src->libs 的:

set(utils_LIB_SRCS
hello.cpp
#其它cpp文件
) include_directories(
${PROJECT_SOURCE_DIR}/src/includes
#${PROJECT_SOURCE_DIR}/src/libs/markup
#${PROJECT_SOURCE_DIR}/src/libs
) link_directories(
/usr/local/lib
#其它库路径
) #link_libraries(utils markup)
#link_libraries(utils uuid) #生成动态库 静态库则 STATIC
add_library (hellolib SHARED ${utils_LIB_SRCS})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/src/libs/)

转载自

cmake使用——cmake语法 http://blog.csdn.net/kl222/article/details/7519340

Cmake 模板和语法 http://blog.csdn.net/feibuhui123/article/details/8552719

推荐阅读

cmake 学习笔记(一) http://blog.csdn.net/dbzhang800/article/details/6314073

CMake 2.8.8 Documentation http://www.cmake.org/cmake/help/v2.8.8/cmake.html

【转载】cmake编写的更多相关文章

  1. [转载] CMake Official Tutorial——教程还是官方的好

    CMake官方教程传送门:https://cmake.org/cmake-tutorial/ 以下的内容跟官方教程基本一致,少数地方根据自己的测试有所改动: A Basic Starting Poin ...

  2. Cmake编写JNI

    调用两个库 CMakeLists.txt //把那种大段的注释去掉了 cmake_minimum_required(VERSION ) add_library( # Sets the name of ...

  3. [转载]自己编写 php 在线问卷调查程序

        <html> <head> <title>问卷调查</title> <meta http-equiv="Content-Type ...

  4. cmake命令 安装、用法简介

    前言 cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品.后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目.其官方网站是www.cm ...

  5. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  6. Cmake的介绍和使用 Cmake实践【转】

    本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1.    ...

  7. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  8. C/C++构建系统 CMake

    Cmake实践 Cmake Practice –Cjacker cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍 生品,最终形成体系,成为一个独立的开放源代码项目 ...

  9. CMake初步(1)

    转自:<你所不知的OSG>第一章:CMake初步(1)http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1189&f ...

随机推荐

  1. 高效的插入子节点DocumentFragment

    DocumentFragment 对象 DocumentFragment 接口表示文档的一部分(或一段).更确切地说,它表示一个或多个邻接的 Document 节点和它们的所有子孙节点. Docume ...

  2. 慕课网__CSS__line height

  3. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解.[size=1.8em]Handler+Runna ...

  4. VMware虚拟机12安装linux系统

    http://jingyan.baidu.com/article/4f7d5712d20a1b1a21192760.html 阿里云开源镜像站:http://mirrors.aliyun.com/

  5. flume原理及代码实现

    转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 ...

  6. oracle 的分析函数

    row_number() over(partition by ... order by ...) rank() over(partition by ... order by ...) dense_ra ...

  7. 【转】 C++模板详解

    C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 通常有 ...

  8. R语言实战(三)基本图形与基本统计分析

    本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...

  9. Python中 "+=" 使用时的注意事项

    代码1: >>> l1=range(3) >>> l2=l1 >>> l2+=[4] >>> l1 [0, 1, 2, 4] & ...

  10. js中this的使用

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着函数使用场合的 ...