zoukankan      html  css  js  c++  java
  • 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目录下.
    参考: http://www.cnblogs.com/ghj1976/archive/2013/04/23/3038347.html

    由于 Cmake 在此之前 已经设置好环境变量 env.bat 文件中:

    set BUILD_DIR=%CD%uild
    set NEWGOPATH=%BUILD_DIR%heka
    if NOT "%GOBIN%"=="" (set p=!PATH:%GOBIN%;=!) else (set p=!PATH!)
    endlocal & set GOPATH=%NEWGOPATH%& set GOBIN=%NEWGOPATH%in& set PATH=%p%;%NEWGOPATH%in;

     

    参考资料:

    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/

  • 相关阅读:
    duplicate symbols for architeture arm64 linker command failed with code 1(use-c to see invocation)
    Operation not permitted
    [笔试]常考算法
    过滤ST/退市股票
    python动态调用函数
    dataFrame 切片操作
    DataFrame概念与创建
    DataFrame 加减乘除
    DataFrame查找
    DataFrame操作
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4082709.html
Copyright © 2011-2022 走看看