标签: scons

在scons中,我如何注入要构建的目标?

我想注入一个"清理"目标,它取决于许多其他目标在它关闭之前完成和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中.

scons

5
推荐指数
2
解决办法
4735
查看次数

如何根据编译器类型在SConstruct for C编译器中设置选项?

我需要为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的方式做到这一点?

c compiler-construction scons compiler-options

5
推荐指数
1
解决办法
3188
查看次数

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中的讨论没有为这个主题带来更多的洞察力.

感谢您的输入!

environment build variant scons

5
推荐指数
1
解决办法
2133
查看次数

如何让SCons替换已安装文本文件中的文本

我希望能够在从scons安装一些python脚本时替换模板变量('$(SOFTWARE_VERSION)').scons已经有这样的功能吗?如果没有,那么挂钩scons安装过程的最佳方式是什么,所以我可以在安装过程中执行此操作?

variables templates install replace scons

5
推荐指数
2
解决办法
1614
查看次数

SCons:防止构造变量中的$ TEXT扩展

当我调用构建器时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

5
推荐指数
2
解决办法
650
查看次数

Scons AddPostAction导致依赖性检查错误解决方法

在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 unittest++

5
推荐指数
1
解决办法
712
查看次数

Python&SCons&Matlab:错误的命令输入

我正在使用SCons来安装软件包,但是当我尝试使用mex(matlab编译器)进行编译时,它会运行来自pdfTeX的其他命令.要在bash上解决这个问题,我刚刚更改了.bashrc:

别名mex ="/ Applications/MATLAB_R2009b.app/bin/mex"

但我不知道如何在SCons环境中改变它.有人知道怎么做吗?

谢谢.

python matlab scons mex tex

5
推荐指数
1
解决办法
266
查看次数

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,则相同.

我该如何解决这个问题?

scons

5
推荐指数
1
解决办法
3730
查看次数

使用SCons构建相对于src /目录

我有一个以下的应用程序(我认为很常见)目录层次结构:

/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)

由于以下几个原因,这是有问题的:

  1. 在我的程序中,我#include提供了相对于src目录的路径.例如,more.c可能包括foo.h#include "foo.h".这会失败,因为GCC是从父目录运行的.我不想改变我的包含#include "src/foo.h".
  2. 我使用__FILE__特殊的宏来记录日志.当从顶级目录构建时,GCC将" src/"放在所有文件名的前面,因为那是它被编译的路径.这可能看起来很挑剔,但我不希望这样,因为我认为我的源树是相对于src目录的. …

scons

5
推荐指数
1
解决办法
723
查看次数

忽略构建错误并尽可能使用scons -i或scons -k或两者构建?

我正在为scons扩展命令,但是源代码不完整.一些xml pdf文档不存在.根据scons wiki,我可以使用 scons -i(--ignore-errors,忽略执行的命令中的所有错误来重建文件.)或 scons -k( - 保持运行,在出错后尽可能多地继续.失败的目标和那些取决于它将不会被重新制作,但命令行中指定的其他目标仍将被处理.)

我想这scons -k是我的目的的正确命令(测试后面的步骤,而一些第一步可能会失败)但我仍然想知道,何时使用-i,因为忽略错误应该导致构建越来越多的东西.或者-i忽略异常,只要所有目标文件仍然成功创建,如果没有创建文件,-k甚至会继续?

scons

5
推荐指数
1
解决办法
2331
查看次数