构建工具make,cmake,scons对比
make 语法/语义不明,即像shell, 又不是shell, 处理字符串,变量晦涩难懂
cmake 语法/语义比较明确,熟悉关键字, 处理字符串,变量比较方便; 缺点语法自成一派, 有学习成本
scons 使用python语法,pythonb库,处理字符串,逻辑判断清晰明了, 可以调用python库,作为跨平台构建工具, 很合适
1.scons构建c/c++实例
SConstruct
Program('1_hello.cpp')
scons
g++ -o 1_hello.o -c 1_hello.cpp
g++ -o 1_hello 1_hello.o
2.scons生成.out后缀,可执行文件
2.1 方法1: python字符串-截取-拼接
SConstruct
import os
def gen_exec_file(file):
return os.path.splitext(file)[0]+'.out'
env = Environment()
env['CCFLAGS'] = '-g'
env['CXXFLAGS'] = '-g'
env.Append(CXXFLAGS=['-Ddebug','-Wall'])
def build_out(src_file):
src = Split(src_file)
target = gen_exec_file(src[0])
env.Program(target, src)
build_out('1_hellp.cc')
g++ -o 1_hello.o -c -g -Ddebug -Wall -g 1_hello.cpp
g++ -o 1_hello.out 1_hello.o
2.2 方法2: scons内置环境变量
官网文档说明: https://scons.org/doc/production/HTML/scons-man.html#cv-PROGSUFFIX
SConstruct
## 模板1
env = Environment()
env["PROGSUFFIX"] = ".out" # 可执行文件后缀.out
env["CCFLAGS"] = " -g3 -O0 -Wall" # gdb 调试
env.Program("demo.c")
或
## 模板2
DefaultEnvironment(PROGSUFFIX = '.out') # 可知程序后缀为.out
ccflags = "-g3 -O0 -Wall" # gdb 调试
libs = "pthread"
Program("demo.cc", CCFLAGS=ccflags, LIBS=libs)
生成.out后缀 原因:
.gitignore
不能识别二进制文件, 只能通过后缀名匹配. 提交代码时, 容易误添加.- 故可执行文件后缀名添加
.out
, 方便git过滤
其它
.gitignore如果过滤二进制文件--> bing搜索, 大模型无解决方法scons是否有更简洁的, 生成.out后缀方法--> 方法2: scons内置环境变量