如何在scons中修改文件名列表?

时间:2013-12-29 11:18:19

标签: scons

我用这个简单的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)

1 个答案:

答案 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.oexample.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()函数不是递归的,所以如果你需要递归列出文件,那么你需要采用不同的方式。