使用CMake和Make构建项目时,您可以从构建树的子目录(即从包含顶级make
的任何目录下面的目录)执行Makefile
,并{{ (据我所知)将在该目录下或之下构建所有目标。这是因为CMake为包含目标的每个目录生成make
,因此当您在目标中的目标时,Makefile
会找到make
来构建这些目标。
但是,当CMake生成Ninja文件时,它只会生成一个 Makefile
文件,该文件位于构建树的顶层。因此,从顶级目录以外的目录中调用build.ninja
会失败(即使ninja
选项也不起作用,因为-f
无法找到ninja
文件。
有没有办法模仿在目录下和目标下构建目标的“类似”行为?据我所知,没有Ninja目标对应于“特定目录下的所有目标”。 (这可以使用以每个目录命名的虚假目标来模拟,该目标依赖于该目录下的所有目标,但CMake默认情况下不会生成此类目标。)
答案 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目标依赖于它。