我用这个简单的Makefile来编译当前目录中的所有.cc
文件
SRCS:=$(wildcard *.cc)
OBJS:=$(SRCS:.cc=)
CXX := clang++
CXXFLAGS := -std=c++11 -g
all: $(OBJS)
我正在尝试将其转换为SConstruct
文件。我可以使用scons'Glob
内置来获取.cc
文件列表但我不知道如何删除它们的后缀(例如OBJS := $(SRCS:.cc=)
)。当然我可以编写Python代码来进行修改,但scons是否内置了对这种修改的支持?
更新:
我的原始SConstruct
文件(字面上列出了所有.cc
文件)
env = Environment(CXX="clang++", CXXFLAGS=['-std=c++11', '-g'])
env.Program("1.1.cc")
env.Program("1.2.cc")
env.Program("1.3.cc")
env.Program("1.4.cc")
一个有效的版本
import glob
env = Environment(CXX="clang++", CXXFLAGS=['-std=c++11', '-g'])
sources = glob.glob("./*.cc")
for s in sources:
env.Program(s)
答案 0 :(得分:1)
根据您在上述评论中对我的问题的回答,您似乎希望SCons根据源文件自动创建二进制文件或目标文件。
这可以在SCons中完成,如下所示:
env = Environment()
# This will build example.o
env.Object('example.cc')
# This will build main
env.Program('main.cc')
以下是此版本的输出:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o example.o -c example.cc
g++ -o main.o -c main.cc
g++ -o main main.o
scons: done building targets.
如果您需要构建包含多个源文件的二进制文件,则需要指定二进制名称,如下所示:
Program(target = 'myBinary', source = ['main.cc', 'example.cc'])
这将创建main.o
和example.o
,但无法知道二进制文件/程序的名称,因此您必须指定它。
对于glob
的示例,Scons有一个内置的Glob()
函数,因此您可以执行以下操作:
env = Environment(CXX="clang++", CXXFLAGS=['-std=c++11', '-g'])
sources = Glob("./*.cc")
for s in sources:
env.Program(s)
SCons Glob()函数不是递归的,所以如果你需要递归列出文件,那么你需要采用不同的方式。