在安装之前和之后使用CMake一致配置文件路径

时间:2015-10-05 14:29:58

标签: c++ cmake configuration-files

我的层次结构中有不同的库和可执行文件作为子项目。他们中的大多数都是守护进程。所以我有相应的cfg文件,这些应用程序在启动时读取。

我有两个问题。

  1. 让我们有一个简单的场景:单个项目没有层次结构。我必须使用/不使用install来运行应用程序。因此,如果我放置一个安装指令来保持cfg在/etc中,我可以得到一个不变的cfg路径。但在我不希望安装的情况下。我想在执行make之后立即运行可执行文件。那么如何以/不使用install
  2. 的方式管理cfg
  3. 接下来是我的场景,我有一个子项目的层次结构。监视器需要a.cfgb.cfg的位置。并且所有cfg都分别保存在另一个子项目中。这个设计可用吗?在这种情况下,我可以在abmonitor处理cfg文件的路径吗?
  4. 但是我可以在monitor.cfg中放入include指令来包含a.cfg和b.cfg。但这归结为同样的问题。使用/不使用install来寻址cfg文件的路径。

    abcd
        cfg                         # configuration files
            abcd                    # to be copied to /etc/abcd on install
                a.cfg               # configuration 
                b.cfg
                monitor.cfg
            includes/cfg
            sources
            -> libabcd-cfg.so       # target library that abstracts configurations as objects
        components
            a: cfg                  # sub project a (requires abcd/a.cfg)
                -> a                # target executable
            b: cfg                  # sub project b (requires abcd/b.cfg)
                -> b                # target executable
            monitor: cfg            # sub project monitor (requires abcd/a.cfg, b.cfg, monitor.cfg)
                -> monitor          # target executable
    

    一个简单的解决方案是在cfg/includes/cfg/defs.h之类的内容中保留一组全局搜索路径,首先在.中进行搜索,然后在/etc中进行搜索。但是,配置文件保存在不同的项目.中将无效。

1 个答案:

答案 0 :(得分:1)

前几次我遇到了类似的问题:我希望在构建之后立即拥有项目 testable (无需安装)。据我所知,这个问题没有共同的模式。可能的方法是:

  1. 在构建一中重现安装树的相对路径。在这种情况下,可执行文件应使用地址cfg文件的相对路径。如果将所有可执行文件安装到同一目录中,则可以将变量CMAKE_RUNTIME_OUTPUT_DIRECTORY设置为二叉树内的某个目录。因此,所有二进制文件都将在给定目录中生成。 (如果使用add_subdirectory()方法构建子项目,则在顶级项目中设置变量将影响所有子项目。对于配置文件,您可以使所有子项目使用相同的变量来构建它们:

    if(NOT DEFINED CFG_OUTPUT_DIRECTORY)
         # Use in-subproject path by default.
        set(CFG_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/cfg")
    endif()
    
    configure_file(a.cfg.in `${CFG_OUTPUT_DIRECTORY}`/a.cfg)
    

    同样,在顶级项目中设置此类CFG_OUTPUT_DIRECTORY变量会影响子项目。

  2. 使用可选环境变量指向cfg-file。因此,对于从构建树运行可执行文件,您可以在构建树中将此变量设置为cfg-file:

    A_CFG_PATH=${CMAKE_CURRENT_BINARY_DIR}/a.cfg a.exe <args>
    

    (对于运行已安装的可执行文件,您根本不需要设置环境变量。)

  3. 根本不支持从构建树运行可执行文件。从测试的结果来看,它有原因:我们为什么要测试构建树,而预期的用户将使用安装树。