首页 > 代码库 > Heka 的 CMake 编译配置分析
Heka 的 CMake 编译配置分析
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件。
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成, 其中命令是不区分大小写的, 符号"#"后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
常见的命令如下:
SET指令
用来显式的定义变量的
语法: SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])
find_package 指令
find_package可以被用来在系统中自动查找配置构建工程所需的程序库。
option 指令
设置编译选项
MESSAGE 指令
参数
的内容
输出到终端
include 指令
用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块.
INCLUDE(file1 [OPTIONAL])
INCLUDE(module [OPTIONAL])
OPTIONAL参数的作用是文件不存在也不会产生错误。
你可以指定载入一个文件,如果定义的是一个模块,那么将在CMAKE_MODULE_PATH中搜
索这个模块并载入。
install 指令
相当于copy命令,
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)
这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中
find_program 指令
查找可执行程序
ADD_CUSTOM_COMMAND 指令
ADD_CUSTOM_COMMAND(
TARGET name
PRE_BUILD|PRE_LINK|POST_BUILD
COMMAND cmd1 [COMMAND cmd2 …] ):
为目标工程name添加一个或多个新的自定义的编译规则cmd1,cmd2等,执行时机可以选择编译前,链接前或者编译后。它的作用相当于Visual Studio工程的“Custom Build Step”属性。
add_custom_target 指令
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
添加一个名为name的编译目标,并指定一个或多个自定义的命令cmd1,cmd2等。注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程,例如一个专用于将已生成文件拷贝到指定文件夹的INSTALL工程;以及与之作用截然相反的UNINSTALL工程。
如果指定了ALL选项,那就表明该目标会被添加到默认的构建目标,使得它每次都被运行。(该命令的名称不能命名为 ALL). 命令和参数都是可选的,如果没有指定,将会创建一个空目标。
如果设置了WORKING_DIRECTORY ,那么该命令将会在指定的目录中运行。如果它是个相对路径,那它会被解析为相对于当前源码目录对应的构建目录。
如果设置了 COMMENT,在构建的时候,该值会被当成信息在执行该命令之前显示。
DEPENDS参数可以是文件和同一目录中的其他客制命令的输出。
如果指定了VERBATIM, 所有传递给命令的参数将会被适当地转义。建议使用该选项。
SOURCES选项指定了包含进该客制目标的额外的源文件。即使这些源文件没有构建规则,但是它们会被增加到IDE的工程文件中以方便编辑。
我们在Heka的 CMakeLists.txt 文件中可以看到下面命令。
add_custom_target(sbmgr ALL
${GO_EXECUTABLE} install ${LDFLAGS} github.com/mozilla-services/heka/cmd/heka-sbmgr
DEPENDS hekad)
这其实对应的 go 编译命令就是:
go install 命令。
与build命令相比,install命令在编译源码后还会将可执行文件或库文件安装到约定的目录下。
- go install编译出的可执行文件以其所在目录名(DIR)命名
- go install将可执行文件安装到与src同级别的bin目录下,bin目录由go install自动创建
- go install将可执行文件依赖的各种package编译后,放在与src同级别的pkg目录下.
由于 Cmake 在此之前 已经设置好环境变量 env.bat 文件中:
set BUILD_DIR=%CD%\build
set NEWGOPATH=%BUILD_DIR%\heka
if NOT "%GOBIN%"=="" (set p=!PATH:%GOBIN%;=!) else (set p=!PATH!)
endlocal & set GOPATH=%NEWGOPATH%& set GOBIN=%NEWGOPATH%\bin& set PATH=%p%;%NEWGOPATH%\bin;
参考资料:
CMake 入门实战
http://hahack.com/codes/cmake/
CMake 使用方法 & CMakeList.txt
http://blog.csdn.net/u012150179/article/details/17852273
《你所不知的OSG》第一章:CMake初步(2)
http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229&fromuid=3434
在 linux 下使用 CMake 构建应用程序
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/
Heka 的 CMake 编译配置分析