1 SCons是什么
说真的,关于构建,我写的真的够多了,真的不想再写了。
SCons 是Python 写的、基于依赖的全自动构建工具,替代 Make,自带内置规则,不用手写复杂 Makefile,配置文件是 SConstruct / SConscript(纯 Python 脚本)。
Make:shell + 文件时间戳 CMake:生成中间文件 (Makefile/ninja) 再编译 SCons:自己就是完整构建引擎,不需要调用外部 make
核心底层机制
1、依赖扫描(最关键优势)
SCons 自动扫描头文件依赖 .h Make 需要你手动维护头文件依赖;改一个 .h,经常漏编译 SCons 会递归分析 #include,自动找出哪些 .c 需要重编。
2、MD5 哈希签名,而不是只看文件修改时间
Make 判断要不要重新编译:文件时间戳 mtime SCons 默认:文件内容哈希 (MD5) 只要文件内容没变,哪怕你手动改了时间,也不会重复编译。 反过来,内容变了、时间没更新,也一定会重编。 这个机制叫 Decider(),可以切换回时间戳模式。
3、环境 Environment
所有编译器、编译选项、头文件路径、库路径全部封装在 Environment 对象
env = Environment()
env.Program("demo", ["main.c"])
env 就是一套完整编译环境,可以复制、修改、多环境并存(Debug / Release)。 相当于 Make 里面 CC CFLAGS LDFLAGS 的集合,但是是可编程对象。
4、Builder 构建器
内置一堆预制规则,不用手写命令:
env.Program()→ 可执行程序env.Object()→ .o 目标文件env.Library()→ 静态库env.SharedLibrary()→ 动态库 底层 Builder 知道怎么调用 gcc /clang/msvc。
5、DAG 有向无环图
SCons 第一步:解析脚本,生成任务依赖树 (DAG) 比如:main.c → main.o → demo.exe 然后拓扑排序,决定编译顺序,支持自动多线程 -jN。
和 Make / CMake 的本质区别
表格
| 项目 | Make | CMake | SCons |
|---|---|---|---|
| 配置文件 | Makefile (sh 语法) | CMakeLists.txt | SConstruct(Python) |
| 工作方式 | 自己执行 shell 命令 | 生成 Make/Ninja | 自带完整编译引擎 |
| 依赖 | 需要手动维护头文件依赖 | 靠编译器生成依赖 | 自动扫描头文件 |
| 更新判断 | 文件修改时间 mtime | 时间戳 | 默认文件 MD5 哈希 |
| 可编程性 | 极弱 | 有限脚本 | 完整 Python |
2 例子
编译脚本
# SConstruct
env = Environment()
env.Program("hello", ["main.c"])
命令行
scons # 编译
scons -c # clean清理
scons -j4 # 4线程并行编译
&spm=1001.2101.3001.5002&articleId=163804688&d=1&t=3&u=d0c84987f77d48c694d37b9e320a3d80)
316

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



