---
title: "Ninja与Makefile比较"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/ninja-vs-makefile/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/Ninja与Makefile比较.md"
content_hash: 9ba546ba1172f054f9c8bfcbe454be24a99532351452f0ddfc4780ae101f3851
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Ninja与Makefile比较

﻿# Ninja与Makefile比较

Ninja 和 Makefile 是两个构建系统，它们各自具有不同的设计理念和使用场景。以下是它们的主要区别：

### 设计理念

- **Ninja**:

    - **速度优化**：Ninja 是为速度而设计的。它通过高效的依赖管理和最小化磁盘 I/O 操作来加快构建速度。
    - **简洁**：Ninja 的文件格式非常简洁和直接，目标是尽可能少地处理非必要的构建步骤。
    - **自动化生成**：Ninja 构建文件通常不是手写的，而是通过工具（如 CMake）自动生成。
- **Makefile**:

    - **灵活性**：Makefile 提供了高度的灵活性，可以用来描述复杂的构建过程。
    - **手动控制**：Makefile 文件通常是手写的，用户可以精细控制构建过程。
    - **广泛支持**：Makefile 是一种老牌构建工具，几乎在所有平台上都得到广泛支持。

### 使用方式

- **Ninja**:
    - 需要先通过 CMake 或其他生成工具生成 Ninja 构建文件，然后再使用 Ninja 进行构建。
    - 示例命令：

```xml
cmake -G Ninja -S <source_dir> -B <build_dir> ninja -C <build_dir>
```

- **Makefile**:
    - 用户需要编写 Makefile 来定义构建规则，然后直接使用 make 命令进行构建。
    - 示例 Makefile：

```makefile
all: main.o 	gcc -o main main.o  main.o: main.c 	gcc -c main.c
```

 构建命令：
```text
make
```


### 依赖管理

- **Ninja**:
    - 高效的依赖管理系统，能够快速检测文件变更并仅重新构建需要更新的部分。
    - 使用基于哈希的依赖管理，避免不必要的文件检查。
- **Makefile**:
    - 依赖管理通过显式规则定义，用户需要手动更新依赖关系。
    - 依赖管理相对较慢，特别是在大型项目中，容易出现重建过多的情况。

### 平台支持

- **Ninja**:
    - 专为现代开发环境设计，支持跨平台构建，尤其在 Linux 和 macOS 上表现出色。
    - 需要 CMake 等工具生成构建文件。
- **Makefile**:
    - 在所有主流平台上广泛使用，几乎所有 Unix-like 操作系统都内置了 make 工具。
    - 更容易在各种不同的开发环境和工具链上使用。

### 具体命令比较

- **Ninja**:
    - `ninja`: 构建目标。
    - `ninja -t clean`: 清理构建文件。
    - `ninja -t reconfigure`: 重新配置项目。
- **Makefile**:
    - `make`: 构建目标。
    - `make clean`: 清理构建文件（根据 Makefile 定义）。
    - `make install`: 安装目标（根据 Makefile 定义）。
