#build #build-tool #command-line #cc #rules #file #source-file

build ruler

一个简单直观的通用构建工具

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构建工具

MIT 许可证

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.obuild/physics.o,然后最终构建 build/game。更重要的是,标尺只会执行构建过时目标的命令,所以如果 build/math.obuild/physics.o 已经被构建,标尺将不会再次构建它们。

这一行

ruler clean

删除了在 .rules 文件中列出的所有目标文件。实际上,这并不完全正确。它不是删除文件,而是将它们重新定位到缓存中。如果在构建过程中标尺确定某些文件已经存在于缓存中,标尺将恢复它们而不是重新构建。

当中间构建结果被替换时,缓存也会被填充。所以,如果你编辑了一个源文件,输入 ruler build,然后撤销编辑并再次输入 ruler build,标尺将调用缓存并恢复目标而不是重新构建。

依赖项

~6–15MB
~155K SLoC