SCons构建(TODO)

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 的本质区别

表格

项目MakeCMakeSCons
配置文件Makefile (sh 语法)CMakeLists.txtSConstruct(Python)
工作方式自己执行 shell 命令生成 Make/Ninja自带完整编译引擎
依赖需要手动维护头文件依赖靠编译器生成依赖自动扫描头文件
更新判断文件修改时间 mtime时间戳默认文件 MD5 哈希
可编程性极弱有限脚本完整 Python

2 例子

编译脚本

# SConstruct
env = Environment()
env.Program("hello", ["main.c"])

命令行

scons          # 编译
scons -c       # clean清理
scons -j4      # 4线程并行编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值