Ninja相当于Make' s"从这个目录构建下来"功能(与CMake)?

时间:2015-02-20 18:59:59

标签: cmake ninja

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

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

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

3 个答案:

答案 0 :(得分:4)

ninja <DIR>/all适用于最新版本的Ninja(1.7.2)。版本1.3.4不允许这样做。

我在the manual上找不到对此的引用。但是,CMake记录了here

  

忍者程序的最新版本可以通过“所有”目标构建项目。还提供了“安装”目标。

     

对于项目的每个子目录sub / dir,将生成其他目标:

     
      
  • 子/目录/所有
      取决于子目录所需的所有目标。
  •   
  • 子/目录/安装
      运行子目录中的安装步骤(如果有)。
  •   
  • 子/目录/测试
      运行子目录中的测试步骤(如果有)。
  •   
  • 子/目录/包
      运行子目录中的包步骤(如果有)。
  •   

答案 1 :(得分:1)

这对我有用:

cd <build-root>
DIRECTORY=<path-relative-to-build-root>
ninja -t targets all | egrep "^${DIRECTORY}/" | egrep CXX_EXECUTABLE_LINKER | \
    sed -e 's/:.*//g' | xargs ninja

ninja -t target all - 列出所有目标(包括目标类型)

egrep“^ $ {DIRECTORY} /” - 过滤目标列表,仅包含所需目录中的目标

egrep CXX_EXECUTABLE_LINKER - 将目标限制为仅限C ++可执行文件。您可以删除或调整它以获得您感兴趣的目标集。

sed -e's /:.*// g' - 删除目标类型,例如“:CXX_EXECUTABLE_LINKER”

xargs ninja - 调用忍者来构建目标

答案 2 :(得分:0)

好问题。如果你找到了,我想知道答案。 我本人正在过渡到cmake +忍者。

我发现我无法在不同级别创建具有相同名称的目标 (如果我有兴趣知道的方式)。 所以我采用了不同目标的命名约定 例如。 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()并添加适当的依赖项来实现的。我使用自动执行此操作 一个宏&#34; add_doxygen()&#34;将为程序添加doxygen目标,并使用 add_dependencies()使每个更高级别的doxygen目标依赖于它。