标签: ninja

在 ninja/cmake 中操纵独立目标的构建顺序

我正在开发一个用 cmake+ninja 构建的 c++ 项目,在 64 线程计算机上有大约 1200 个构建目标。

有一个翻译单元需要 10 分钟来编译,大多数其他翻译单元都相当快,以至于所有其他目标的构建一起(在所有线程上构建)只需大约 9 分钟。慢速翻译单元与其他单元相当独立,所以它不必被安排得晚,但事实证明,默认情况下是安排得晚,这样一个完整的构建需要我 15 到 20 分钟,而在最后只有一个线程与几乎所有其他目标一起工作。如果先安排慢速翻译单元,阻塞一个线程大约 10 分钟,而所有其他线程在项目的其余部分工作,并且整个项目在 10 分钟内构建,那么构建对我来说会更快。

在 cmake 或 ninja 中有没有办法改变调度的优先级以指出缓慢或“请尽早”的目标而不会弄乱依赖关系?

cmake ninja

10
推荐指数
1
解决办法
227
查看次数

Linux上的libswiftDemangle.so

在Mac机器上编译Swift时,会libswiftDemangle.dylib创建一个动态库.我也需要在Linux机器上创建的动态库,但是,在编译源代码之后不会创建动态库.

该文件CMakeLists.txtlib/SwiftDemangle/CMakeLists.txt包含:

add_swift_library(swiftDemangle SHARED
  SwiftDemangle.cpp
  MangleHack.cpp
  LINK_LIBRARIES swiftBasic)
Run Code Online (Sandbox Code Playgroud)

指令,但是没有创建库.

我使用此命令./swift/utils/build-script -R -c --build-subdir build --install-prefix /mnt/servers/swift/install -j4来构建项目,最终运行cmakeninja构建项目.

有任何想法吗?

compilation cmake demangler ninja swift

9
推荐指数
1
解决办法
257
查看次数

忍者:错误:加载“build.ninja”:系统找不到指定的文件

我安装了巧克力,然后使用 choco install ninja 安装了 ninja。它安装在 C:\ProgramData\chocolatey\lib\ninja\tools.

我也添加了环境变量的路径。当我现在启动 ninja 时,它抛出并出错:

ninja: error: loading 'build.ninja': The system cannot find the file specified.

我刚刚在 powerShell 提示符下输入了 ninja 并抛出了这个错误!有没有人知道实际发生了什么?

build chocolatey ninja

9
推荐指数
1
解决办法
6106
查看次数

使用ninja和clang ++时vim中的Quickfix列表

我有一个C++项目,我使用ninja和clang ++编译,并希望在编译过程中出现错误出现在quickfix列表中.目前,当我设置makeprg=ninja然后运行时:make,忍者生成的所有输出都只出现在quickfix窗口中,并且不能用于跳转到相应的文件/行等.

我不是在寻找由syntastic(我已经在使用)提供的功能,但我也希望看到项目中其他文件的错误,类似于IDE提供的.

如果这不能(轻松)使用忍者,使用make的解决方案也是受欢迎的(该项目使用cmake,所以两者都是可能的),但我想留下忍者,如果可能的话.

c++ vim clang++ ninja

8
推荐指数
1
解决办法
1381
查看次数

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

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

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

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

cmake ninja

8
推荐指数
2
解决办法
2437
查看次数

如何在 gn 文件中添加包含路径

我有一个包含在源变量中的源文件列表。我已经包含了包含变量中所需的所有头文件。所以我的 gn 文件看起来像这样。

shared_library(mylib) {
   sources = [
      <all the source files>
   ]
   includes = [
      <all the header files>
   ]
}
Run Code Online (Sandbox Code Playgroud)

然后我就跑了ninja -C out/Output <mytarget>。但它给了我这个错误:You set the variable "includes" here and it was unused before it went out of scope.

现在在源文件中,标头被包装在其中,<>如果我更改为"",所有错误都会得到解决,但必须有一种方法来定义包含路径,以便自动解决所有依赖项。

header-files ninja

7
推荐指数
0
解决办法
1559
查看次数

使用 Ninja Generator 为 Windows (clang-cl) 构建的 CMake

我正在尝试使用 CMake 作为主要构建工具在 Windows 机器上构建一个简单的应用程序。一旦在项目上调用 CMake,配置阶段就会出现错误:

> cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe" -DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe"

-- The C compiler identification is Clang 7.0.0
-- The CXX compiler identification is Clang 7.0.0
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe --broken
CMake Error at C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCCompile
r.cmake:52 (message):
  The C compiler

    "C:/Program Files/LLVM/bin/clang-cl.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: C:/Users/mak/Desktop/cmake-test/build/CMakeFiles/CMakeTmp

    Run …
Run Code Online (Sandbox Code Playgroud)

cmake ninja clang-cl

7
推荐指数
1
解决办法
4681
查看次数

忍者语言中是否有比 make 更快的东西?

我经常看到有人声称 Ninja 比 Make 更快,更擅长支持增量构建,并且更擅长并行化。这是实现质量问题还是 Ninja 语言中的某些内容可以实现这一点?

我知道 Ninja 和 Make 使用不同的文件格式来描述任务的依赖关系图。我知道 Make 允许使用比 ninja 更高级的功能,例如 globs。如果使用这样的高级功能,那么 Make 执行的任务比 Ninja 更复杂,我们不能指望 Make 更快。这是一种不公平的比较。

但是,假设不使用这种高级功能。没有通配符,没有模式规则,只是一遍又一遍地重复基本的“out_file: in_file1, in_file2\n\tcommand to build”。不使用这种高级功能会使 Make 和 Ninja 之间的竞争环境在他们执行的任务方面保持平衡。

我的理解是,如果我们以这种方式限制 Makefile,那么 Ninja 文件和 Makefile 可以很容易地相互转换。这样对吗?

为什么在有限的 Makefile 上执行的 Make 比 Ninja 慢?或者仅仅是标准 Make 实现没有针对以这种方式构建的 Makefile 进行优化的情况?

makefile build ninja

7
推荐指数
1
解决办法
3392
查看次数

将“-j”参数从 gradle 传递给 ninja

-j在使用 gradle 构建 Android 应用程序时,我需要将参数传递给 ninja。(在 Windows 上)

为什么我需要这个?- 我们有巨大的统一 C++ 文件,需要大量内存才能编译。目前我没有足够的内存(约 10GB 可用)来在 8 个内核上并行编译它们。因此,当内存耗尽时,clang 会失败。

我看到 gradlecmake使用--buildkey运行,所以我试图在-j1那里添加我的arg。但似乎arguments字段仅用于 cmake 生成,因为它不会影响在构建阶段传递给 cmake 的命令行。

externalNativeBuild {
    cmake {
        cFlags "..."
        cppFlags "..."
        arguments "... -- -j1"
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在看到的唯一方法是ninja用一些包装器替换-j从那里传递。但这是我想使用的最后一个选项。感谢有关如何实现这种有效方式的任何想法。

cmake gradle android-studio ninja

6
推荐指数
1
解决办法
634
查看次数

如何使用自定义 CMake 版本执行 Visual Studio 2019 Ninja 构建?

我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建项目。我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本。我已经cmakeExecutable在我的CMakeSettings.json文件中设置了变量指向我的 CMake 系统安装,并且使用 Visual Studio 生成器构建工作正常。但是,如果我使用 Ninja 作为生成器,Visual Studio 将使用 VS 集成版本的 CMake 回退。有没有办法使用 Ninja 和来自 IDE 的自定义 CMake 版本进行构建?

cmake ninja visual-studio-2019

6
推荐指数
0
解决办法
913
查看次数