各位新老朋友们大家好呀,我是阿尔法!
这篇SCons 一款基于 Python 的自动化构建工具中我们了解了 SCons 构建工具,并通过编写一个简单的 SConstruct 脚本来构建了一个简单的测试工程。
然而当构建完成后使用 tree 命令查看工程目录时,突然发现,工程构建产物(如 .o 文件)和测试工程文件都混一起了。

目前我们创建的测试工程较小,但是当项目工程越来越复杂的时候,构建产物和源文件混在一起就会显得非常混乱。
通过重新编写 SConstruct 脚本,依靠 Python 标准库 os 模块来做文件处理,将构建产物统一放到指定的 build 文件夹下。
import os# 创建构建环境env = Environment()# 设置编译选项env.Append(CCFLAGS=["-g", "-Wall"])# 指定头文件路径env.Append(CPPPATH=["inc"])# 定义构建目录build_path = "build"# 定义目标名称target_name = "test"# 确保构建目录存在if not os.path.exists(build_path): os.makedirs(build_path)# 定义源文件列表src_files = ["src/main.c", "src/helloworld.c"]# 将每个源文件编译为目标文件(.o),存放在 build 目录obj_files = []for src in src_files:# 获取文件名,如 "main.c" base_name = os.path.basename(src)# 去掉扩展名,如 "main" obj_name = os.path.splitext(base_name)[0]# 编译源文件,生成目标文件到 build 目录 obj_file = env.Object(target=f"{build_path}/{obj_name}.o", source=src)# 添加到目标文件列表 obj_files.append(obj_file[0])# 指定目标文件目录exe_file = f"{build_path}/{target_name}"# 构建目标文件program = env.Program(target=exe_file, source=obj_files)# 设置默认构建目标Default(program)# 清理构建目录env.Clean(program, build_path)scons 命令构建工程,构建过程以及运行效果如下图,可以看到构建产物都放在了 build 文件夹下面:
scons -c 命令清除构建,可以看到构建产物以及 build 目录都被清除了:
VariantDir 功能,可以更优雅地实现构建产物和源文件的分离:# 创建构建环境env = Environment()# 设置编译选项env.Append(CCFLAGS=["-g", "-Wall"])# 指定头文件路径env.Append(CPPPATH=["inc"])# 定义源文件目录src_path = "src"# 定义构建目录build_path = "build"# 定义目标名称target_name = "test"# 将构建产物都放在 build 目录中# duplicate=0 表示不复制源文件到构建目录env.VariantDir(build_path, src_path, duplicate=0)# 定义源文件列表src_files = env.Glob(f"{src_path}/*.c")# 将源文件路径转换为构建目录中的对应路径build_source_files = [ src_file.path.replace(src_path, build_path, 1) for src_file in src_files]# 指定目标文件目录exe_file = f"{build_path}/{target_name}"# 构建目标文件program = env.Program(target=exe_file, source=build_source_files)# 设置默认构建目标Default(program)# 清理构建目录env.Clean(program, build_path)scons 命令构建工程:
scons -c 命令清除构建:
未完待续…
The End



扫一扫加我好友!
欢迎随时滴滴我哦~
还有技术交流群等你来
爱电子的发烧友都来这儿



我点赞、我分享、我推荐
欢 迎 留 言!
