Ninja相当于Make的"从这个目录构建下来"功能(使用CMake)?

Kyl*_*and 8 cmake ninja

使用CMake和Make构建项目时,您可以make从构建树的子目录(即从包含顶层的任何目录下面的目录Makefile)执行,并且make(据我所知)将在或以下构建所有目标那个目录.这是因为CMake Makefile为包含目标的每个目录生成一个,因此当您在目标目录中时,make找到Makefile用于构建这些目标的目录.

但是,当CMake生成Ninja文件时,它只会生成一个 build.ninja文件,该文件位于构建树的顶层.因此,ninja从顶级目录以外的目录调用失败(即使该-f选项不起作用,因为ninja找不到该rules.ninja文件).

有没有办法模仿在目录下和目标下构建目标的"类似"行为?据我所知,没有Ninja目标对应于"特定目录下的所有目标".(这可以使用以每个目录命名的虚假目标来模拟,这些目标依赖于该目录下的所有目标,但CMake默认情况下不会生成此类目标.)

Una*_*dra 6

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 功能。(我不确定为什么 1.3.4 版本不支持它。)最近版本的 CMake 生成具有适当依赖项的目标;Ninja 本身并不了解它们的语义。不幸的是,我的 CMake (3.2.2) 版本似乎不够新。 (3认同)

Bru*_*ams 1

好问题。如果您找到了答案,我很想知道。我自己正处于过渡到 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 目标依赖于它。