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

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

我有两个问题.

>让我们有一个简单的场景:单个项目没有层次结构.我必须使用/不安装运行应用程序.所以如果我把一个安装指令保存在/ etc中,我可以获得一个常量的cfg路径.但在我不希望安装的情况下.我想在make之后立即运行可执行文件.那么如何以这样的方式管理cfg呢?
>接下来是我的场景,我有一个子项目的层次结构.监视器需要a.cfg和b.cfg.并且所有cfg都分别保存在另一个子项目中.这个设计可用吗?我可以在这种情况下解决来自a,b和监视器的cfg文件的路径吗?

但是我可以在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.但是配置文件保存在不同的项目中.不管用.

最佳答案 很久以前我遇到过类似的问题:我想在构建之后立即测试项目(没有安装).据我所知,这个问题没有共同的模式.可能的方法是:

>从构建一中的安装树重现相对路径.在这种情况下,可执行文件应使用地址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变量将影响子项目.
>使用可选环境变量指向cfg-file.因此,对于从构建树运行可执行文件,您可以在构建树中将此变量设置为cfg-file:

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

(对于运行已安装的可执行文件,您根本不需要设置环境变量).
>根本不支持从构建树运行可执行文件.从测试的结果来看它有原因:我们为什么要测试构建树,而预期的用户将使用安装树.

点赞