我正在为一个项目开发一个SConstruct构建文件,我正在尝试从Options更新为Variables,因为Options已被弃用.我不明白如何使用变量.我有0 python经验,这可能有助于此.
例如,我有这个:
opts = Variables()
opts.Add('fcgi',0)
print opts['fcgi']
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
AttributeError: Variables instance has no attribute '__getitem__':
Run Code Online (Sandbox Code Playgroud)
不知道这应该如何工作
我有一个包含"builds"目录的文件系统,每个目录都包含一个名为"build-info.xml"的文件.然而一些构建脚本生成的"集结info.xml"所以在这种情况下,我有一个有点不平凡SCons的SConstruct用来生成一个骨架集结info.xml,以便它可以被用作建立之前发生对进一步规则的依赖.
即:对于每个目录:
我的SConstruct看起来像这样:
def generate_actions_BuildInfoXML(source, target, env, for_signature):
cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,)
return cmd
bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1)
env.Append(BUILDERS = { "BuildInfoXML" : bld })
...
# VERSION = some arbitrary string, not important here
# path = filesystem path, set elsewhere
build_info_xml = "%s/build-info.xml" % (path,)
if not os.path.exists(build_info_xml):
env.BuildInfoXML(build_info_xml, None, VERSION = build)
Run Code Online (Sandbox Code Playgroud)
我的问题是'scons …
目前我正在使用一些魔法将当前的git修订版本添加到我的scons版本中.我只是抓住它的版本将其粘贴到CPPDEFINES中.它工作得非常好......直到版本发生变化并且scons想要重建所有内容,而不仅仅是已经更改的文件 - 因为所有文件使用的定义都已更改.
理想情况下,我使用调用的自定义构建器生成一个文件,git_version.cpp并在其中只有一个返回正确标记的函数.这样只会重建一个文件.
现在我确定我已经看过一个教程,显示如何做到这一点..但我似乎无法追踪它.我发现自定义构建器的东西在scons中有点奇怪......
所以任何指针都会受到赞赏......
无论如何只是为了参考这是我目前正在做的事情:
# Lets get the version from git
# first get the base version
git_sha = subprocess.Popen(["git","rev-parse","--short=10","HEAD"], stdout=subprocess.PIPE ).communicate()[0].strip()
p1 = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE )
p2 = subprocess.Popen(["grep", "Changed but not updated\\|Changes to be committed"], stdin=p1.stdout,stdout=subprocess.PIPE)
result = p2.communicate()[0].strip()
if result!="":
git_sha += "[MOD]"
print "Building version %s"%git_sha
env = Environment()
env.Append( CPPDEFINES={'GITSHAMOD':'"\\"%s\\""'%git_sha} )
Run Code Online (Sandbox Code Playgroud) 我是scons的新手,一直试图建立一些文件,徒劳无功.我在Linux上,擅长Python.这是我的示例SConstruct文件:
vstPlugName = 'again'
vstSDKDir = '/home/yati/Projects/Sound/vstsdk2.4'
env = Environment(CPPPATH=vstSDKDir, tools=['g++'])
env['CCFLAGS'] = ['-Wall -O3']
src_dir = vstSDKDir + '/public.sdk/source/vst2.x'
env.Library(vstPlugName, [
vstPlugName + '.cpp',
src_dir + '/audioeffect.cpp',
src_dir + '/audioeffectx.cpp',
src_dir + '/vstplugmain.cpp'
])
Run Code Online (Sandbox Code Playgroud)
目的是从显示的cpp文件中构建一个".o" - 我尝试了env.Object(),但它引发了一个异常,说"为一个目标文件提供了多个来源......" - 这是可以理解的.但是当我运行scons上面的SConstruct脚本时,我得到了这个:
scons: Reading SConscript files ...
AttributeError: 'SConsEnvironment' object has no attribute 'Library':
File "/home/yati/Projects/Sound/development/again/source/SConstruct", line 10:
env.Library(vstPlugName, [
Run Code Online (Sandbox Code Playgroud)
请帮忙.Linux上有没有一个简短的,适合scons的介绍?我没有时间浏览整个联机帮助页或官方文档.
从头开始构建Native Client应用程序需要什么?我查看了文档,并摆弄了几个应用程序,但是,我现在正在制作自己的应用程序,我没有看到任何与创建本机客户端应用程序的基础相关的内容.
SCons提供了一个Zip构建器,用于从文件组生成zip文件.例如,假设我们有一个如下所示的文件夹foo:
foo/
foo/blah.txt
Run Code Online (Sandbox Code Playgroud)
我们foo.zip从文件夹创建zip文件foo:
env.Zip('foo.zip', 'foo/')
Run Code Online (Sandbox Code Playgroud)
这会产生一个zip文件:
$ unzip -l foo.zip
Archive: foo.zip
foo/
foo/foo.txt
Run Code Online (Sandbox Code Playgroud)
但是,假设我们使用的是一个VariantDir包含foo的bar:
bar/
bar/foo/
bar/foo/foo.txt
Run Code Online (Sandbox Code Playgroud)
因为我们在a中VariantDir,我们仍然使用相同的命令来创建zip文件,即使它具有稍微不同的效果:
env.Zip('foo.zip', 'foo/')
Run Code Online (Sandbox Code Playgroud)
这会生成zip文件:
$ unzip -l bar/foo.zip
Archive: bar/foo.zip
bar/foo/
bar/foo/foo.txt
Run Code Online (Sandbox Code Playgroud)
问题是bar/zip中每个文件的额外前缀.如果这不是SCons,那么简单的解决方案就是bar使用类似的东西进入并调用zip cd bar; zip -r foo.zip foo/.然而,这对SCons来说很奇怪/困难,而且无论如何看起来都非常像SCons一样.有更好的解决方案吗?
我有时想要从SCon中的Glob结果中排除某些源文件.通常是因为我想用不同的选项编译该源文件.像这样的东西:
objs = env.Object(Glob('*.cc'))
objs += env.Object('SpeciallyTreatedFile.cc', CXXFLAGS='-O0')
Run Code Online (Sandbox Code Playgroud)
当然,这会给SCons带来问题:
scons: *** Two environments with different actions were specified
for the same target: SpeciallyTreatedFile.o
Run Code Online (Sandbox Code Playgroud)
我通常使用以下习语解决这个问题:
objs = env.Object([f for f in Glob('*.cc')
if 'SpeciallyTreatedFile.cc' not in f.path])
Run Code Online (Sandbox Code Playgroud)
但这很丑陋,如果要过滤掉多个文件,那就更加丑陋了.
有更明确的方法吗?
我对make和autotools(我还没有用于这个项目)的知识充其量是最基本的,尽管在很长一段时间内进行了大量的谷歌搜索和实验.我有一个像下面这样的源层次结构,我正试图找到尽可能无缝的构建方式.
该应用程序由一个主应用程序组成,其中包含app/src下各种子文件夹中的源代码.这些是使用该文件夹的根目录中的相应Makefile构建的.
然后我有多个其他实用程序驻留在app/tools下的不同文件夹,每个文件夹都有自己的Makefile.
app/src/module1/file1.cpp
app/src/module1/file1.hpp
app/src/module2/file2.cpp
app/src/module2/file2.hpp
app/src/module3/file3.cpp
app/src/module3/file3.hpp
app/src/main.cpp
app/src/main.hpp
app/src/Makefile
app/tools/util1/file1.cpp
app/tools/util1/file1.hpp
app/tools/util1/Makefile
app/tools/util2/file2.cpp
app/tools/util2/file2.hpp
app/tools/util2/Makefile
Run Code Online (Sandbox Code Playgroud)
对我来说问题是,其中一些工具依赖于app/src源文件夹中的源文件,但启用了预处理宏EXTERNAL_TOOL.因此,编译主应用程序和varous实用程序生成的目标文件不兼容.
目前要构建项目的每个部分,我必须清理它们之间的源树.这很痛苦,当然不是我想要的.解决这个问题的最佳方法是什么?我所拥有的那些我无法付诸实践的想法是:
我不太确定我有时间和耐心需要掌握make/autotools.可能其他一个构建工具(scons?cmake?)使这种任务更容易实现?如果是这样的话?
更新:这就是我现在所拥有的
SOURCES := util1.cpp util2.cpp util3.cpp \
../../src/module1/file1.cpp \
../../src/module1/file2.cpp \
../../src/module1/file3.cpp \
../../src/module2/file4.cpp \
../../src/module3/file5.cpp \
../../src/module3/file6.cpp \
../../src/module4/file7.cpp \
../../src/module4/file8.cpp \
../../src/module3/file9.cpp \
../../src/module4/file10.cpp \
../../src/module5/file11.cpp \
../../src/module3/file12.cpp \
../../src/module1/file13.cpp \
../../src/module3/file14.cpp \
../../src/module3/file15.cpp
OBJECTS = $(join $(addsuffix .util/, $(dir $(SOURCES))), $(notdir $(SOURCES:.cpp=.o)))
.PHONY: all mkdir
all: util
util: $(OBJECTS) …Run Code Online (Sandbox Code Playgroud) 我修改了我的SCons Builder动作subprocess.Popen()而不是使用env.Execute().但是我仍然需要在内容中添加一些md5-sum依赖性检查,env以便重建和缓存新的目标文件.如何附加到SCons内部MD5哈希?
在scons中,如何实现--start-group和--end-group gcc标志?这些应该包装一组特定的LIBS,但是我找不到将全部(或部分)输入包装到LIBS的PREFIX / SUFFIX选项。
如果您想知道我在说什么gcc标志,请在此处阅读更多信息: