Ninja是一个小型构建系统,专注于速度。它以文件间的相互依赖关系(通常是源代码和输出的可执行文件)作为输入,并快速地协调构建过程。它的独特目标是速度。构建始终并行运行,默认情况下基于系统CPU的数量。源码地址:https://github.com/ninja-build/ninja,license为Apache-2.0,最新发布版本为v1.13.2。
Windows、Linux和Mac操作系统上可直接下载二进制可执行文件,无需安装,如Windows上下载ninja-win.zip,解压后就仅有一个ninja.exe文件。注:Ninja是一个独立的程序,而不是库,因此没有公共API。
Ninja可以构建C/C++、Rust、Fortran、Go、Java、Python项目,甚至任何"能够通过命令行执行构建命令"的东西,Ninja本身基本不关心"语言",Ninja只是根据build.ninja中定义的规则执行命令。
运行Ninja:默认情况下,它会在当前目录中查找名为build.ninja的文件,并构建所有过期的目标。
较新版本的VS已自带ninja。
Ninja在Windows上使用简单示例:
1.main.cpp文件内容如下:
#include <iostream>
int main()
{
std::cout << "hello ninja" << std::endl;
return 0;
}
2.CMakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 3.21.0)
project(ninja_demo)
message(STATUS "build type: ${CMAKE_BUILD_TYPE}")
set(CMAKE_CXX_STANDARD 20)
add_executable(${PROJECT_NAME}
main.cpp
)
3.打开终端"x64 Native Tools Command Prompt for VS 2022"
4.将其定位ninja示例目录下
5.执行命令"cmake -S . -B build -G Ninja" ,执行完此命令后会产生build目录,结果如下图所示:

6.build目录会生成build.ninja文件,内容如下:
# CMAKE generated file: DO NOT EDIT!
# Generated by "Ninja" Generator, CMake Version 4.3
# This file contains all the build statements describing the
# compilation DAG.
# =============================================================================
# Write statements declared in CMakeLists.txt:
#
# Which is the root file.
# =============================================================================
# =============================================================================
# Project: ninja_demo
# Configurations: Release
# =============================================================================
#############################################
# Minimal version of Ninja required by this file
ninja_required_version = 1.5
#############################################
# Set configuration variable for custom commands.
CONFIGURATION = Release
# =============================================================================
# Include auxiliary files.
#############################################
# Include rules file.
include CMakeFiles\rules.ninja
# =============================================================================
#############################################
# Logical path to working directory; prefix for absolute paths.
cmake_ninja_workdir = D$:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build\
# =============================================================================
# Object build statements for EXECUTABLE target ninja_demo
#############################################
# Order-only phony target for ninja_demo
build cmake_object_order_depends_target_ninja_demo: phony || .
build CMakeFiles\ninja_demo.dir\main.cpp.obj: CXX_COMPILER__ninja_demo_unscanned_Release D$:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\main.cpp || cmake_object_order_depends_target_ninja_demo
CONFIG = Release
FLAGS = /DWIN32 /D_WINDOWS /EHsc /O2 /Ob2 /DNDEBUG -std:c++20 -MD
OBJECT_DIR = CMakeFiles\ninja_demo.dir
OBJECT_FILE_DIR = CMakeFiles\ninja_demo.dir
TARGET_COMPILE_PDB = CMakeFiles\ninja_demo.dir\
TARGET_PDB = ninja_demo.pdb
TARGET_SUPPORT_DIR = CMakeFiles\ninja_demo.dir
# =============================================================================
# Link build statements for EXECUTABLE target ninja_demo
#############################################
# Link the executable ninja_demo.exe
build ninja_demo.exe: CXX_EXECUTABLE_LINKER__ninja_demo_Release CMakeFiles\ninja_demo.dir\main.cpp.obj
CONFIG = Release
FLAGS = /DWIN32 /D_WINDOWS /EHsc /O2 /Ob2 /DNDEBUG -MD
LINK_FLAGS = /machine:x64 /INCREMENTAL:NO /subsystem:console
LINK_LIBRARIES = kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
OBJECT_DIR = CMakeFiles\ninja_demo.dir
POST_BUILD = cd .
PRE_LINK = cd .
TARGET_COMPILE_PDB = CMakeFiles\ninja_demo.dir\
TARGET_FILE = ninja_demo.exe
TARGET_IMPLIB = ninja_demo.lib
TARGET_PDB = ninja_demo.pdb
TARGET_SUPPORT_DIR = CMakeFiles\ninja_demo.dir
#############################################
# Utility command for edit_cache
build CMakeFiles\edit_cache.util: CUSTOM_COMMAND
COMMAND = C:\Windows\system32\cmd.exe /C "cd /D D:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build && D:\soft\cmake-4.3.2-windows-x86_64\bin\cmake-gui.exe -SD:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage -BD:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build"
DESC = Running CMake cache editor...
pool = console
restat = 1
build edit_cache: phony CMakeFiles\edit_cache.util
#############################################
# Utility command for rebuild_cache
build CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND
COMMAND = C:\Windows\system32\cmd.exe /C "cd /D D:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build && D:\soft\cmake-4.3.2-windows-x86_64\bin\cmake.exe --regenerate-during-build -SD:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage -BD:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build"
DESC = Running CMake to regenerate build system...
pool = console
restat = 1
build rebuild_cache: phony CMakeFiles\rebuild_cache.util
# =============================================================================
# Target aliases.
build ninja_demo: phony ninja_demo.exe
# =============================================================================
# Folder targets.
# =============================================================================
#############################################
# Folder: D:/GitCode/Linux_Code_Test/Samples_CMake/ninja_usage/build
build all: phony ninja_demo.exe
# =============================================================================
# Built-in targets
#############################################
# Re-run CMake if any of its inputs changed.
build build.ninja D$:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\build\cmake_install.cmake: RERUN_CMAKE | CMakeCache.txt CMakeFiles\4.3.2\CMakeCCompiler.cmake CMakeFiles\4.3.2\CMakeCXXCompiler.cmake CMakeFiles\4.3.2\CMakeRCCompiler.cmake CMakeFiles\4.3.2\CMakeSystem.cmake D$:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\CMakeLists.txt D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCXXInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCommonLanguageInclude.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeGenericSystem.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeInitializeConfigs.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeLanguageInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeRCInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeSystemSpecificInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeSystemSpecificInitialize.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\CMakeCommonCompilerMacros.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCXXLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCommonLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-Initialize.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\WindowsPaths.cmake
pool = console
#############################################
# A missing CMake input file is not an error.
build CMakeCache.txt CMakeFiles\4.3.2\CMakeCCompiler.cmake CMakeFiles\4.3.2\CMakeCXXCompiler.cmake CMakeFiles\4.3.2\CMakeRCCompiler.cmake CMakeFiles\4.3.2\CMakeSystem.cmake D$:\GitCode\Linux_Code_Test\Samples_CMake\ninja_usage\CMakeLists.txt D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCXXInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeCommonLanguageInclude.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeGenericSystem.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeInitializeConfigs.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeLanguageInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeRCInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeSystemSpecificInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\CMakeSystemSpecificInitialize.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\CMakeCommonCompilerMacros.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Compiler\MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCXXLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Internal\CMakeCommonLinkerInformation.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Linker\MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Linker\Windows-MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-Initialize.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC-C.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC-CXX.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows-MSVC.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\Windows.cmake D$:\soft\cmake-4.3.2-windows-x86_64\share\cmake-4.3\Modules\Platform\WindowsPaths.cmake: phony
#############################################
# Clean all the built files.
build clean: CLEAN
#############################################
# Print all primary targets available.
build help: HELP
#############################################
# Make the all target the default.
default all
7.执行命令"ninja -C build",在build目录下生成可执行文件ninja_demo.exe,结果如下图所示:

3742

被折叠的 条评论
为什么被折叠?



