我的层次结构中有不同的库和可执行文件作为子项目。他们中的大多数都是守护进程。所以我有相应的cfg
文件,这些应用程序在启动时读取。
我有两个问题。
install
来运行应用程序。因此,如果我放置一个安装指令来保持cfg在/etc
中,我可以得到一个不变的cfg路径。但在我不希望安装的情况下。我想在执行make
之后立即运行可执行文件。那么如何以/不使用install
?a.cfg
和b.cfg
的位置。并且所有cfg都分别保存在另一个子项目中。这个设计可用吗?在这种情况下,我可以在a
,b
和monitor
处理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
中进行搜索。但是,配置文件保存在不同的项目.
中将无效。
答案 0 :(得分:1)
前几次我遇到了类似的问题:我希望在构建之后立即拥有项目 testable (无需安装)。据我所知,这个问题没有共同的模式。可能的方法是:
在构建一中重现安装树的相对路径。在这种情况下,可执行文件应使用地址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>
(对于运行已安装的可执行文件,您根本不需要设置环境变量。)
根本不支持从构建树运行可执行文件。从测试的结果来看,它有原因:我们为什么要测试构建树,而预期的用户将使用安装树。