我正在开发一个用 cmake+ninja 构建的 c++ 项目,在 64 线程计算机上有大约 1200 个构建目标。
有一个翻译单元需要 10 分钟来编译,大多数其他翻译单元都相当快,以至于所有其他目标的构建一起(在所有线程上构建)只需大约 9 分钟。慢速翻译单元与其他单元相当独立,所以它不必被安排得晚,但事实证明,默认情况下是安排得晚,这样一个完整的构建需要我 15 到 20 分钟,而在最后只有一个线程与几乎所有其他目标一起工作。如果先安排慢速翻译单元,阻塞一个线程大约 10 分钟,而所有其他线程在项目的其余部分工作,并且整个项目在 10 分钟内构建,那么构建对我来说会更快。
在 cmake 或 ninja 中有没有办法改变调度的优先级以指出缓慢或“请尽早”的目标而不会弄乱依赖关系?
在Mac机器上编译Swift时,会libswiftDemangle.dylib
创建一个动态库.我也需要在Linux机器上创建的动态库,但是,在编译源代码之后不会创建动态库.
该文件CMakeLists.txt
在lib/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
来构建项目,最终运行cmake
并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 并抛出了这个错误!有没有人知道实际发生了什么?
我有一个C++项目,我使用ninja和clang ++编译,并希望在编译过程中出现错误出现在quickfix列表中.目前,当我设置makeprg=ninja
然后运行时:make
,忍者生成的所有输出都只出现在quickfix窗口中,并且不能用于跳转到相应的文件/行等.
我不是在寻找由syntastic(我已经在使用)提供的功能,但我也希望看到项目中其他文件的错误,类似于IDE提供的.
如果这不能(轻松)使用忍者,使用make的解决方案也是受欢迎的(该项目使用cmake,所以两者都是可能的),但我想留下忍者,如果可能的话.
使用CMake和Make构建项目时,您可以make
从构建树的子目录(即从包含顶层的任何目录下面的目录Makefile
)执行,并且make
(据我所知)将在或以下构建所有目标那个目录.这是因为CMake Makefile
为包含目标的每个目录生成一个,因此当您在目标目录中时,make
找到Makefile
用于构建这些目标的目录.
但是,当CMake生成Ninja文件时,它只会生成一个 build.ninja
文件,该文件位于构建树的顶层.因此,ninja
从顶级目录以外的目录调用失败(即使该-f
选项不起作用,因为ninja
找不到该rules.ninja
文件).
有没有办法模仿在目录下和目标下构建目标的"类似"行为?据我所知,没有Ninja目标对应于"特定目录下的所有目标".(这可以使用以每个目录命名的虚假目标来模拟,这些目标依赖于该目录下的所有目标,但CMake默认情况下不会生成此类目标.)
我有一个包含在源变量中的源文件列表。我已经包含了包含变量中所需的所有头文件。所以我的 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.
现在在源文件中,标头被包装在其中,<>
如果我更改为""
,所有错误都会得到解决,但必须有一种方法来定义包含路径,以便自动解决所有依赖项。
我正在尝试使用 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) 我经常看到有人声称 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 进行优化的情况?
-j
在使用 gradle 构建 Android 应用程序时,我需要将参数传递给 ninja。(在 Windows 上)
为什么我需要这个?- 我们有巨大的统一 C++ 文件,需要大量内存才能编译。目前我没有足够的内存(约 10GB 可用)来在 8 个内核上并行编译它们。因此,当内存耗尽时,clang 会失败。
我看到 gradlecmake
使用--build
key运行,所以我试图在-j1
那里添加我的arg。但似乎arguments
字段仅用于 cmake 生成,因为它不会影响在构建阶段传递给 cmake 的命令行。
externalNativeBuild {
cmake {
cFlags "..."
cppFlags "..."
arguments "... -- -j1"
}
}
Run Code Online (Sandbox Code Playgroud)
我现在看到的唯一方法是ninja
用一些包装器替换-j
从那里传递。但这是我想使用的最后一个选项。感谢有关如何实现这种有效方式的任何想法。
我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建项目。我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本。我已经cmakeExecutable
在我的CMakeSettings.json文件中设置了变量指向我的 CMake 系统安装,并且使用 Visual Studio 生成器构建工作正常。但是,如果我使用 Ninja 作为生成器,Visual Studio 将使用 VS 集成版本的 CMake 回退。有没有办法使用 Ninja 和来自 IDE 的自定义 CMake 版本进行构建?
ninja ×10
cmake ×6
build ×2
c++ ×1
chocolatey ×1
clang++ ×1
clang-cl ×1
compilation ×1
demangler ×1
gradle ×1
header-files ×1
makefile ×1
swift ×1
vim ×1