标签: scons

SCons问题 - 不了解Variables类

我正在为一个项目开发一个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)

不知道这应该如何工作

python variables scons

3
推荐指数
1
解决办法
1565
查看次数

SCons不会清除所有文件

我有一个包含"builds"目录的文件系统,每个目录都包含一个名为"build-info.xml"的文件.然而一些构建脚本生成的"集结info.xml"所以在这种情况下,我有一个有点不平凡SCons的SConstruct用来生成一个骨架集结info.xml,以便它可以被用作建立之前发生对进一步规则的依赖.

即:对于每个目录:

  • 如果build-info.xml已存在,则不执行任何操作.更重要的是,不要在'scons --clean'上删除它.
  • 如果build-info.xml不存在,则生成一个骨架 - build-info.xml不依赖于任何其他文件 - 骨架基本上是最小的默认值.
  • 在--clean期间,删除build-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 …

generator scons

3
推荐指数
1
解决办法
4113
查看次数

如何将构建版本添加到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

3
推荐指数
1
解决办法
1448
查看次数

scons喊道"没有图书馆这样的属性"!

我是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的介绍?我没有时间浏览整个联机帮助页或官方文档.

build scons

3
推荐指数
1
解决办法
1335
查看次数

从零开始构建Native Client应用程序

从头开始构建Native Client应用程序需要什么?我查看了文档,并摆弄了几个应用程序,但是,我现在正在制作自己的应用程序,我没有看到任何与创建本机客户端应用程序的基础相关的内容.

c++ scons google-nativeclient

3
推荐指数
1
解决办法
1260
查看次数

如何让SCons不包含zip文件中的基础目录?

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一样.有更好的解决方案吗?

python zip scons

3
推荐指数
1
解决办法
995
查看次数

如何过滤SCons Glob结果?

我有时想要从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)

但这很丑陋,如果要过滤掉多个文件,那就更加丑陋了.

有更明确的方法吗?

scons

3
推荐指数
1
解决办法
2667
查看次数

使用不同的预处理器宏在同一源树上构建多个目标

我对makeautotools(我还没有用于这个项目)的知识充其量是最基本的,尽管在很长一段时间内进行了大量的谷歌搜索和实验.我有一个像下面这样的源层次结构,我正试图找到尽可能无缝的构建方式.

该应用程序由一个主应用程序组成,其中包含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实用程序生成的目标文件不兼容.

目前要构建项目的每个部分,我必须清理它们之间的源树.这很痛苦,当然不是我想要的.解决这个问题的最佳方法是什么?我所拥有的那些我无法付诸实践的想法是:

  1. 为项目的每个部分分离构建目录
  2. 在构建外部工具时,以某种方式在主应用程序源代码树中标记它们的目标文件(util.file1.o?)

我不太确定我有时间和耐心需要掌握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)

c++ makefile build cmake scons

3
推荐指数
1
解决办法
1231
查看次数

将环境状态显式附加到SCons Builder依赖关系MD5指纹

我修改了我的SCons Builder动作subprocess.Popen()而不是使用env.Execute().但是我仍然需要在内容中添加一些md5-sum依赖性检查,env以便重建和缓存新的目标文件.如何附加到SCons内部MD5哈希?

caching build builder scons

3
推荐指数
1
解决办法
244
查看次数

使用scons时如何将--start-group和--end-group标志传递给gcc?

在scons中,如何实现--start-group和--end-group gcc标志?这些应该包装一组特定的LIBS,但是我找不到将全部(或部分)输入包装到LIBS的PREFIX / SUFFIX选项。

如果您想知道我在说什么gcc标志,请在此处阅读更多信息:

GCC:--start-group和--end-group命令行选项是什么?

gcc scons

3
推荐指数
1
解决办法
668
查看次数

标签 统计

scons ×10

build ×3

c++ ×2

python ×2

builder ×1

caching ×1

cmake ×1

gcc ×1

generator ×1

google-nativeclient ×1

makefile ×1

variables ×1

zip ×1