7 个版本
0.1.6 | 2021 年 3 月 1 日 |
---|---|
0.1.5 | 2021 年 1 月 23 日 |
0.1.4 | 2020 年 10 月 12 日 |
0.1.2 | 2020 年 9 月 21 日 |
0.1.0 | 2020 年 7 月 5 日 |
#322 在 构建工具 中
305KB
8K SLoC
尺规
尺规是一个用于管理文件依赖图的工具。它适用于任何命令行可执行程序以文件作为输入(源)并生成文件作为输出(目标)的情况。大规模的 C/C++ 项目是一个很好的例子。C/C++ 项目通常分为库和目标文件。有了正确的依赖图,尺规可以帮助通过仅在必要时重新构建来加速增量构建。然而,C/C++ 不是唯一的用例。许多问题可以通过依赖管理来解决。
依赖关系编码在名为 .rules
的文件中。一个 .rules
文件包含换行符分隔的称为 规则 的块。每个 规则 由三个部分组成:目标、源 和 命令。目标和源是换行符分隔的文件路径列表。命令是命令行调用,它假定以源作为输入并更新目标。每个部分以一行上的单个 ":" 结尾。例如,一个 .rules
可能包含此单个规则
build/game
:
src/game.h
src/game.cpp
:
c++
src/game.cpp
--std=c++17
-o build/game
:
该规则声明可执行文件 build/game
依赖于三个源文件,并按此行构建
c++ game.cpp --std=c++17 -o build/game
(注意:尺规使用略微不寻常的语法来处理命令行,以便一个调用可以跨越多行而无需使用反斜杠。要获取多行调用,请用一行上的单个 ";" 分隔。)
使用上面的.rules
文件,如果我们键入此
ruler build
尺规检查目标文件 build/game
是否与其源文件同步
src/game.h
src/game.cpp
如果不同步,尺规将运行该命令
c++ game.cpp --std=c++17 -o build/game
通常,一个 .rules
文件可以包含很多规则,每个规则之间由一个单独的空行分隔,如下所示
build/game
:
src/include/math.h
src/include/physics.h
build/math.o
build/physics.o
src/game.cpp
:
c++
build/math.o
build/physics.o
src/game.cpp
--std=c++17
-o
build/game
:
build/math.o
:
src/include/math.h
src/math.cpp
:
c++
--std=c++17
-c
src/math.cpp
-o
build/math.o
:
build/physics.o
:
src/include/math.h
src/physics.cpp
:
c++
--std=c++17
-c
src/physics.cpp
-o
build/physics.o
:
使用该 .rules
文件,如果我们键入...
ruler build
...标尺将执行命令以构建中间目标:build/math.o
和 build/physics.o
,然后最终构建 build/game
。更重要的是,标尺只会执行构建过时目标的命令,所以如果 build/math.o
和 build/physics.o
已经被构建,标尺将不会再次构建它们。
这一行
ruler clean
删除了在 .rules
文件中列出的所有目标文件。实际上,这并不完全正确。它不是删除文件,而是将它们重新定位到缓存中。如果在构建过程中标尺确定某些文件已经存在于缓存中,标尺将恢复它们而不是重新构建。
当中间构建结果被替换时,缓存也会被填充。所以,如果你编辑了一个源文件,输入 ruler build
,然后撤销编辑并再次输入 ruler build
,标尺将调用缓存并恢复目标而不是重新构建。
依赖项
~6–15MB
~155K SLoC