我一直在使用带有基于Make的代码库的sbox而没有任何问题.现在我正在使用基于scons的代码库,并且遇到了一些奇怪的问题.
似乎在scratchbox中,scons找不到g ++.例如,它尝试执行以下操作:
你好hello.c
什么时候该做:
g ++ -o hello hello.c
所以可能它的g ++字符串变量是空的.g ++存在于PATH中 - "g ++"产生/ scratchbox/compilers/bin/g ++.
相同的源在scratchbox之外构建得很好,所以它不应该是scons或代码库的问题.工作时,没有在scratchbox之外设置的特殊环境变量.
如果我象征性地将/ usr/bin/g ++链接到/ scratchbox/compilers/bin/g ++,它会更进一步(产生正确的g ++命令)但是在执行它们时会产生:
sb_gcc_wrapper(g ++):/ scratchbox/compilers/arm-linux-cs2007q3-51sb3/bin/sbox-arm-none-linux-gnueabi-g ++:没有这样的文件或目录
列出的文件是存在.
PATH包含/ scratchbox/compilers/bin,SBOX_REDIRECT_FROM_DIRS包含/ usr/bin,SBOX_REDIRECT_TO_DIRS包含/ scratchbox/compilers/bin,所以我认为它应该能够找到它.
任何建议,将不胜感激!谢谢,雷
编辑:也许相关 - 除非我在scons文件中添加完整路径,否则它也找不到pkg-config
我正在寻找一种在scons中注册像end-build回调这样的东西的方法.例如,我现在正在做这样的事情:
def print_build_summary():
failures = SCons.Script.GetBuildFailures()
notifyExe = 'notify-send '
if len(failures) > 0:
notifyExe = notifyExe + ' --urgency=critical Build Failed'
else:
notifyExe = notifyExe + ' --urgency=normal Build Succeed'
os.system(notifyExe)
atexit.register(print_build_summary)
Run Code Online (Sandbox Code Playgroud)
这仅适用于非交互模式.我希望能够在每次构建结束时弹出类似的内容,特别是在交互式scons会话中运行多个"构建"命令时.
我发现的唯一建议,环顾四周,似乎是使用依赖系统或AddPostAction调用glom.我这样做是不对的,因为它不是真正的依赖(严格来说,它甚至不是构建的一部分) - 它只是一个需要在每个构建的结束.
谢谢!
这是工具堆栈:安装在Windows 7(x64)上的是带有CDT和SConsolidator插件的Eclipse(Juno x64).下面是安装了64位支持的TDM-GCC(x64)软件包.
如果我构建一个64位应用程序并使用Eclipse(它使用与GCC捆绑的gdb)进行调试,那么它构建时没有错误并且调试很好.
当我构建一个32位应用程序并尝试使用Eclipse调试它时,它构建正常但gdb失败:
gdb: unknown target exception 0x4000001f...
Run Code Online (Sandbox Code Playgroud)
通过命令行使用相同的gdb进行调试工作正常.
关于如何解决这个问题的任何想法?
仅供参考:以下是导致gdb异常的一些警告:
warning: `C:\Windows\system32\ntdll.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: `C:\Windows\SYSTEM32\wow64.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: `C:\Windows\SYSTEM32\wow64win.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: `C:\Windows\SYSTEM32\wow64cpu.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: Could not load shared library symbols for ntdll32.dll.
Do you …Run Code Online (Sandbox Code Playgroud) 我有非系统头,我用它来通过SCons编译程序.问题是它们有时会改变,但SCons似乎根本不会扫描标题中的变化.有没有办法告诉SCons扫描标题的变化?
我有一个脚本,让我们说"foo.py",这取决于一些文件,让我们说"dep.par",我会称之为
python foo.py --parameters=dep.par
Run Code Online (Sandbox Code Playgroud)
如果foo.py只写一个输出文件"bar.dat",我会说:
env=Environment()
env.Command("bar.dat", "dep.par", "python foo.py --parameters=dep.par")
Run Code Online (Sandbox Code Playgroud)
但是,我需要foo.py输出多个文件的情况,让我们说"bar1.dat,bar2.dat,...,barN.dat".
我很茫然,任何帮助都会受到赞赏,谢谢.
我需要从SCons Script生成version.cc文件.仅当目标的任何源文件发生更改时,才应生成此文件.
假设SCons脚本具有以下语句
#python function which generates version.cc in the same folder where libtest.a is generated. This will always generate a differnt version.cc because the version string contained inside that will have timestamp
GenerateVersionCode()
#target which uses version.cc
libtest = env.Library('test', ['a.cc', 'b.cc', 'version.cc'])
Run Code Online (Sandbox Code Playgroud)
我第一次运行上面的代码时一切都很好.但是当我再次运行相同的脚本时,由于生成了新的version.cc,目标'test'将被重建.我的要求是,如果文件已经存在并且任何源中没有任何更改(在此示例中为a.cc和b.cc),我们不应生成新版本的.cc文件
if not version_file_present:
GenerateVersionCode()
else
if no_changes_in_source:
GenerateVersionCode()
#target which uses version.cc which could be newly generated one or previous one
libtest = env.Library('test', ['a.cc', 'b.cc', 'version.cc'])
本网站上的一个相关问题提出如下建议
env.Command(target="version.c", source="version-in.c",
action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])
对于上面的建议,我想知道函数PythonFunctionToUpdateContents的内容,它检查自上一次构建以来源文件的变化.
我有一个相当复杂的scons系统,有几个子目录,有许多库和可执行文件.目前,每个SConscript都有自己的克隆环境,因此我可以在每个SConscript的基础上轻松更改CFLAGS(或任何其他可用的),但我想更改每个目标,甚至是每个目标文件.目标.
我创建了一个简单的例子SConscript和SConstruct来解释这个问题,如下所示.
SConstruct:
env = Environment()
env['CFLAGS'] = '-O2'
env.SConscript('SConscript', 'env')
Run Code Online (Sandbox Code Playgroud)
SConscript:
Import('env')
env=env.Clone()
env.Program('foo', ['foo.c', 'bar.c'])
Run Code Online (Sandbox Code Playgroud)
如果我运行scons,foo.c和bar.c都会使用-O2标志进行编译.我可以通过env['CFLAGS'] = '...'在SConscript中添加来轻松地更改SConscript范围内的标志,但是让我们说我想编译foo.c -O2,但是bar.c完全调试,-O0 -g.我该怎么做(以最简单的方式)?
该示例使用gcc,但我想要可以与任何编译器一起使用的东西.
经常发生这种情况与在没有优化将导致不可接受的性能编译所有性能敏感的项目,但有一个需要调试一个单一的文件(或其中的一个子集).
如何让scons使用Clang和libc ++?在我传递给Environment的任何标志中放入"-stdlib = libc ++"会导致未定义的引用错误,如下所示:
hello.o: In function `main':
hello.cpp:(.text+0xc): undefined reference to `std::__1::cout'
hello.o: In function `std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)':
Run Code Online (Sandbox Code Playgroud) 我想对所有.o文件(例如由Object或者StaticObject构建者生成的文件)进行一些后处理,无论用户使用什么构建器.
我试图"覆盖"或"挂钩"基础环境的构建器,但我无法想出任何有效的东西:
old = env['BUILDERS']['StaticObject']
env['BUILDERS']['StaticObject'] = something_that_calls(old)
Run Code Online (Sandbox Code Playgroud)
是否有规定的方法来挂钩或覆盖像StaticObject建设者这样的东西?
我已经看到了关于嵌套SCons Builder的问题,但它没有告诉我如何替换现有的构建器,只补充其行为.
我正在尝试使用scons将源目录中的一些头文件复制到我的构建目录中的'includes'目录.我的目标是一个静态库,我想将它与相关的标题一起分发.预期的最终结果:
build
|-- objects -> .o output files for constructing libmclib.a
|-- includes
| |-- foo.h
| `-- bar.h
`-- libmclib.a
Run Code Online (Sandbox Code Playgroud)
我的SConstruct:
#!python
target = 'mock'
env = Environment(LINKCOM = "$LINK -o $TARGET $SOURCES $LINKFLAGS $CCFLAGS")
Export('env', 'target')
build_base = 'build'
SConscript('SConscript', variant_dir=build_base, duplicate=0)
# remove build directory
if GetOption('clean'):
import subprocess
subprocess.call(['rm', '-rf', build_base])
Run Code Online (Sandbox Code Playgroud)
我的SConscript:
#!python
Import('env')
# ...
# other stuff to build 'mclib_target'
# ...
def copy_header_files(target, source, env):
Mkdir(target)
header_files = []
for d in env['CPPPATH']: …Run Code Online (Sandbox Code Playgroud)