使用CMake和Make构建项目时,您可以make
从构建树的子目录(即从包含顶层的任何目录下面的目录Makefile
)执行,并且make
(据我所知)将在或以下构建所有目标那个目录.这是因为CMake Makefile
为包含目标的每个目录生成一个,因此当您在目标目录中时,make
找到Makefile
用于构建这些目标的目录.
但是,当CMake生成Ninja文件时,它只会生成一个 build.ninja
文件,该文件位于构建树的顶层.因此,ninja
从顶级目录以外的目录调用失败(即使该-f
选项不起作用,因为ninja
找不到该rules.ninja
文件).
有没有办法模仿在目录下和目标下构建目标的"类似"行为?据我所知,没有Ninja目标对应于"特定目录下的所有目标".(这可以使用以每个目录命名的虚假目标来模拟,这些目标依赖于该目录下的所有目标,但CMake默认情况下不会生成此类目标.)
ninja <DIR>/all
适用于最新版本的 Ninja (1.7.2)。1.3.4 版不允许这样做。
我在手册上找不到对此的参考。但是,CMake在此处记录了这一点:
忍者程序的最新版本可以通过“all”目标构建项目。还提供了“安装”目标。
对于项目的每个子目录 sub/dir,会生成额外的目标:
- sub/dir/all
取决于子目录所需的所有目标。- sub/dir/install
在子目录中运行安装步骤(如果有)。- sub/dir/test
在子目录中运行测试步骤(如果有)。- sub/dir/package
在子目录中运行包步骤(如果有)。
好问题。如果您找到了答案,我很想知道。我自己正处于过渡到 cmake+ninja 的过程中。
我发现我无法在不同级别创建具有相同名称的目标(如果有一种方法我有兴趣知道)。所以我对不同的目标采用了命名约定,例如
name - builds program or library
test.name - runs tests for the named program or library
doxygen.name - build doxygen for the named program or library
对于更深的层次结构,您可以执行以下操作:
doxygen.subproject
doxygen.subproject.name
使用此模式,您可以精确控制构建的内容,但必须从顶级构建目录发出命令。我想在习惯了这一点之后,我会发现它更有效率,因为在构建或运行某些东西之前不需要更改目录,尽管有时需要一些额外的输入,但 shell 历史记录通常已经涵盖了它。
这是通过使用add_custom_target()并添加适当的依赖项在后台实现的。我使用宏自动执行此操作,以便宏“ add_doxygen() ”将为程序添加 doxygen 目标,并使用add_dependency()使每个更高级别的 doxygen 目标依赖于它。
归档时间: |
|
查看次数: |
2437 次 |
最近记录: |