我想注入一个"清理"目标,它取决于许多其他目标在它关闭之前完成和gzip的一些日志文件.重要的是我不要早点gzip,因为这会导致一些工具失败.
如何为Scons注入一个清理目标来执行?
例如,我有目标foo和bar.我想注入一个名为'cleanup'的新自定义目标,它依赖于foo和bar,并在它们完成后运行,而无需用户指定
% scons foo cleanup
Run Code Online (Sandbox Code Playgroud)
我希望他们输入:
% scons foo
Run Code Online (Sandbox Code Playgroud)
但是让scons像用户输入一样执行
% scons foo cleanup
Run Code Online (Sandbox Code Playgroud)
我已经尝试创建清理目标并附加到sys.argv,但似乎scons在到达我的代码时已经处理了sys.argv,因此它不处理我手动附加到的'cleanup'目标sys.argv中.
我需要为C编译器设置其他选项,例如添加标志以打开所有警告,具体取决于编译器的类型.例如,我应该使用MSVC
env.Append(CPPFLAGS = "/Wall")
Run Code Online (Sandbox Code Playgroud)
但对于mingw(gcc)我需要使用:
env.Append(CCFLAGS = "-Wall")
Run Code Online (Sandbox Code Playgroud)
我怎样才能以scons的方式做到这一点?
SCons用户指南讲述了使用多个构造环境构建单个程序的构建多个版本,并给出了以下示例:
opt = Environment(CCFLAGS = '-O2')
dbg = Environment(CCFLAGS = '-g')
o = opt.Object('foo-opt', 'foo.c')
opt.Program(o)
d = dbg.Object('foo-dbg', 'foo.c')
dbg.Program(d)
Run Code Online (Sandbox Code Playgroud)
而不是手动为使用不同环境编译的对象分配不同的名称,VariantDir()/ variant_dir听起来像是一个更好的解决方案......
但是如果我将Program()构建器放在SConscript中:
Import('env')
env.Program('foo.c')
Run Code Online (Sandbox Code Playgroud)
如何将不同的环境导出到同一个SConscript文件?
opt = Environment(CCFLAGS = '-O2')
dbg = Environment(CCFLAGS = '-g')
SConscript('SConscript', 'opt', variant_dir='release') #'opt' --> 'env'???
SConscript('SConscript', 'dbg', variant_dir='debug') #'dbg' --> 'env'???
Run Code Online (Sandbox Code Playgroud)
不幸的是,SCons Wiki中的讨论没有为这个主题带来更多的洞察力.
感谢您的输入!
我希望能够在从scons安装一些python脚本时替换模板变量('$(SOFTWARE_VERSION)').scons已经有这样的功能吗?如果没有,那么挂钩scons安装过程的最佳方式是什么,所以我可以在安装过程中执行此操作?
当我调用构建器时Program(Target, Source, CXXFLAGS=CompileFlags),CompileFlags字符串的值包含-Wl,-rpath,lib:$ORIGIN/../lib导致$ ORIGIN扩展为空字符串,而它应该保持原样.
我试图逃避美元符号,在里面添加单引号,没有任何帮助.
env['RPATH'] = Literal('lib:$ORIGIN/../lib')
它也不起作用:它产生
g++ -o main -Wl,-rpath=lib:/../lib
在命令行中,即使man页面说"添加到RPATH的路径没有被scons以任何方式转换",所以它应该在没有Literal()的情况下工作,我想.
那么如何在没有SCons的情况下添加包含$ TEXT的编译器标志来尝试将其扩展为变量?
谢谢.
在scons中,我试图建立一个UnitTest系统(见下面的代码),基于这里的一个很好的例子:http://spacepants.org/blog/scons-unit-test
然而,由于最近的scons 2.0.1及更新版本中存在问题,这会产生依赖性循环,如下所述:http://old.nabble.com/AddPostAction-executes-on-first-build-but-not-subsequent- td18360675.html(和其他地方).
有谁知道这个问题的良好解决方案或替代解决方案?
码:
def UnitTest(env, target, source, **kwargs):
curTest = env.Program(target, source, **kwargs)
env.AddPostAction(curTest, curTest[0].abspath)
env.Alias('unit_tests', curTest)
env.AlwaysBuild(curTest)
return curTest
SConsEnvironment.UnitTest = UnitTest
mandolineTest = env.UnitTest(target='./codeTest',
source = mix(['test.cc', 'base.cc'),
LIBS = default_libs + ['bgl',],
LIBPATH = default_libs_path,
CPPPATH = default_includes )
Run Code Online (Sandbox Code Playgroud) 我正在使用SCons来安装软件包,但是当我尝试使用mex(matlab编译器)进行编译时,它会运行来自pdfTeX的其他命令.要在bash上解决这个问题,我刚刚更改了.bashrc:
别名mex ="/ Applications/MATLAB_R2009b.app/bin/mex"
但我不知道如何在SCons环境中改变它.有人知道怎么做吗?
谢谢.
我正在尝试使用与SCons相同的源构建静态库和共享库.
如果我只构建一个或另一个,一切正常,但是一旦我尝试构建它们,只构建静态库.
我的SConscript看起来像:
cppflags = SP3_env['CPPFLAGS']
cppflags += ' -fPIC '
SP3_env['CPPFLAGS'] = cppflags
soLibFile = SP3_env.SharedLibrary(
target = "sp3",
source = sources)
installedSoFile = SP3_env.Install(SP3_env['SP3_lib_dir'], soLibFile)
libFile = SP3_env.Library(
target = "sp3",
source = sources)
installedLibFile = SP3_env.Install(SP3_env['SP3_lib_dir'], libFile)
Run Code Online (Sandbox Code Playgroud)
我还在SharedLibrary之前尝试过SharedObject(sources)(传递来自SharedObject的返回,而不是源代码),但它没有什么不同.如果我在.so之前构建.a,则相同.
我该如何解决这个问题?
我有一个以下的应用程序(我认为很常见)目录层次结构:
/src
subdir1/ # Subdirs with more source files.
more.c
SConscript
foo.c # Source files.
foo.h
SConscript
/other # Other top-level directories with no source code.
/stuff # However, there are other assets I may want to build.
README # Other top-level files.
SConstruct
Run Code Online (Sandbox Code Playgroud)
问题是,当我scons从顶级目录运行时,它gcc从该目录调用而不cd进入src,如下所示:
gcc -o src/foo.o src/foo.c
Run Code Online (Sandbox Code Playgroud)
由于以下几个原因,这是有问题的:
#include提供了相对于src目录的路径.例如,more.c可能包括foo.h与#include "foo.h".这会失败,因为GCC是从父目录运行的.我不想改变我的包含#include "src/foo.h".__FILE__特殊的宏来记录日志.当从顶级目录构建时,GCC将" src/"放在所有文件名的前面,因为那是它被编译的路径.这可能看起来很挑剔,但我不希望这样,因为我认为我的源树是相对于src目录的. …我正在为scons扩展命令,但是源代码不完整.一些xml pdf文档不存在.根据scons wiki,我可以使用
scons -i(--ignore-errors,忽略执行的命令中的所有错误来重建文件.)或
scons -k( - 保持运行,在出错后尽可能多地继续.失败的目标和那些取决于它将不会被重新制作,但命令行中指定的其他目标仍将被处理.)
我想这scons -k是我的目的的正确命令(测试后面的步骤,而一些第一步可能会失败)但我仍然想知道,何时使用-i,因为忽略错误应该导致构建越来越多的东西.或者-i忽略异常,只要所有目标文件仍然成功创建,如果没有创建文件,-k甚至会继续?