标签: scons

scons:覆盖一个文件的构建选项

简单的问题,但我不知道答案.

假设我有一个scons构建我的CCFLAGS包含-O1.我有一个文件needsOptimization.cpp,我想覆盖-O1使用-O2而不是.我怎么能在scons中这样做?


更新:这是我最终根据bialix的答案做的事情:

在我的SConscript文件中:

Import('env');

env2 = env.Clone();
env2.Append(CCFLAGS=Split('-O2 --asm_listing'));

sourceFiles = ['main.cpp','pwm3phase.cpp'];
sourceFiles2 = ['serialencoder.cpp','uartTestObject.cpp'];
objectFiles = [];
objectFiles.append(env.Object(sourceFiles));
objectFiles.append(env2.Object(sourceFiles2));
   ...
Run Code Online (Sandbox Code Playgroud)

以前这个文件是:

Import('env');

sourceFiles = ['main.cpp','pwm3phase.cpp','serialencoder.cpp','uartTestObject.cpp'];
objectFiles = env.Object(sourceFiles);
   ...
Run Code Online (Sandbox Code Playgroud)

scons

7
推荐指数
2
解决办法
2571
查看次数

使用SCons作为distutils的构建引擎

我有一个python包,其中包含构建扩展所需的一些C代码(具有一些非常重要的构建需求).我使用SCons作为我的构建系统,因为它非常好而且灵活.

我正在寻找一种方法来编译我的python扩展与SCons准备与distutils一起分发.我希望用户只需键入setup.py install并获取使用SCons编译的扩展,而不是默认的distutils构建引擎.

想到的一个想法是在distutils中重新定义build_ext命令,但我找不到它的大量文档.

有什么建议吗?

python distutils scons

7
推荐指数
1
解决办法
2192
查看次数

如何为使用SCons构建的程序构建gprof支持?

问候,

这是我的SConstruct文件:

env = Environment()
env.Append(CCFLAGS=['-g','-pg'])
env.Program(target='program1', source= ['program1.c'])
Run Code Online (Sandbox Code Playgroud)

这里还有编译的输出:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o program1.o -c -g -pg program1.c
gcc -o program1 program1.o
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)

如您所见,我将"-pg"选项传递给构建环境.在我构建之后,我运行程序来生成"gmon.out",但它没有生成.

谁能证实这个问题?还是有解决方案?

谢谢.

更新:

感谢此处给出的建议,更新的工作SConstruct文件如下所示.链接器需要标志,因此要通过scons传递它,必须使用"LINKFLAGS"选项.

env = Environment()
env.Append(CCFLAGS=['-g','-pg'], LINKFLAGS=['-pg'])
env.Program(target='program1', source= ['program1.c'])
Run Code Online (Sandbox Code Playgroud)

编译输出:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o program1.o -c -g -pg program1.c
gcc -o program1 -pg program1.o
scons: …
Run Code Online (Sandbox Code Playgroud)

c scons gprof

7
推荐指数
1
解决办法
1175
查看次数

如何在SCons中使用Emacs和CEDET?

如何在不破坏语义和自动完成的情况下集成SCons和emacs + cedet?

c++ emacs scons cedet emacs-semantic

7
推荐指数
1
解决办法
883
查看次数

如何告诉scons使用C++ 11标准

我无法找到如何告诉scons接受c ++ 11标准:

SConstruct文件:

env=Environment(CPPPATH='/usr/include/boost/',
                CPPDEFINES=[],
                LIBS=[],
                SCONS_CXX_STANDARD="c++11"
                )

env.Program('Hello', Glob('src/*.cpp'))
Run Code Online (Sandbox Code Playgroud)

cpp文件:

#include <iostream>
class A{};
int main()
{
  std::cout << "hello world!" << std::endl;
  auto test = new A; // testing auto C++11 keyword
  if( test == nullptr ){std::cout << "hey hey" << std::endl;} // testing nullptr keyword
  else{std::cout << " the pointer is not null" << std::endl;}
  return 0;
};
Run Code Online (Sandbox Code Playgroud)

调用scons时出现错误消息:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o src/hello_world.o …
Run Code Online (Sandbox Code Playgroud)

c++ scons c++11

7
推荐指数
1
解决办法
5895
查看次数

SCons生成可变数量的目标

我试图SCons生成多个目标(直接编号未知SConscript).

我有这样的目录:

headers/
  Header1.h
  Header2.h
  Header3.h
  Header4.h
meta/
  headers_list.txt
Run Code Online (Sandbox Code Playgroud)

现在我想要SConscript读取headers_list.txt,基于其内容选择文件从headers/目录(即它可能只包含Header1Header3),对于我想要使用某些函数生成源的每一个.

我一直试图用env.Command它来做,但问题是它需要调用者指定目标列表,由于显而易见的原因在调用时不知道env.Command.

我唯一能想到的就是跑步:

for header in parse( headers_file ):
    source = mangle_source_name_for_header( header )
    env.Command( source, header, generator_action )
Run Code Online (Sandbox Code Playgroud)

但这意味着parse( headers_file )每次调用时我都会运行scons.如果解析成本高昂且文件不经常更改,则可以轻松缓存此步骤.

为实现缓存,我缺少什么SConsc构造/类/技术?

编辑:

看来我的问题类似于SCons目标的构建时间确定,但是没有人工虚拟文件的技术吗?

此外,即使使用临时文件,我也看不出我应该如何将target变量从Command生成可变数量的目标传递给第二个将迭代它们的目标.

编辑2:

很有希望.

python code-generation scons

7
推荐指数
1
解决办法
1697
查看次数

SCons代码生成和VariantDir

我希望SCons在我的src/目录中为我生成一些源文件,然后将它们构建为我的构建目录中的任何其他源文件build/variantX.

这是我的SCons文件:

import SCons

def my_builder(env, target, source):
    # do stuff
    pass

env = Environment()
env.VariantDir('build/variant1/', 'src', duplicate=0)
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
    'build/variant1/foobar.cc',
    'build/variant1/test.cc',
    ])
Run Code Online (Sandbox Code Playgroud)

此错误与以下消息:

src/foobar.cc找不到来源,目标需要build/variant1/foobar.o

考虑到我确实提供了构建命令,我认为这是不正确的src/foobar.cc.

现在,我尝试了一些解决方法:

  • 如果我build/variant1/foobar.cc在程序中替换src/foobar.cc它,它确实有效,但显然foobar.o是创建src/而不是build/variant1

  • 如果我src/foobar.cc在命令中替换build/variant1/foobar.cc它,它确实有效,但我希望生成代码src/; (也因为包含目录中的相对路径之类的东西不起作用,除非duplicate=1)

  • 如果duplicate=1,我得到一个类似的错误信息,但这次提到变种目录:

    build/variant1/foobar.cc找不到来源,目标需要build/variant1/foobar.o

有没有解决的办法?这是SCons的限制/错误,还是我的方面存在根本的误解?

code-generation scons

7
推荐指数
1
解决办法
1659
查看次数

'cl'不被识别为内部或外部命令

下面是我在windows7中运行"scons"到编译器时的错误消息:

-----------------------------------------------------------------------------------
'cl' is not recognized as an internal or external command,
operable program or batch file.
scons: *** [out\windows-x86-MD-unicode-vs2008-rel\obj-static\src\featuresets\ada                                      pters\im-history\AddToChatRoomHistoryVisitor.obj] Error 1
scons: building terminated because of errors.
-----------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我已经添加了环境变量的路径,但仍然遇到了这个问题.

下面是环境变量的PATH信息:

--------------------------------------------------------------------------------------------
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v
1.0\;C:\Program Files\CREDANT\Shield v7.1\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Fil
es\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\TortoiseSVN\bin;C:\Python27;C:\cygwin64\bin
;C:\Python27\scons-2.3.1;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program File
s\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Progra
m Files (x86)\Microsoft Visual Studio 10.0\VC\bin;C:\Python27\Scripts;C:\Program Files (x86)\Microso
ft Visual Studio 10.0\VC\lib;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
--------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction scons

7
推荐指数
1
解决办法
2万
查看次数

错误:不推荐使用'template <class> class std :: auto_ptr'

我正在使用scons和ubuntu.当我在使用'scons'制作一些程序时,会发生错误,如:

src/db/DBTextLoader.cc:296:3:错误:'模板类std :: auto_ptr'已弃用[-Werror = deprecated-declarations]

/usr/include/c++/5/bits/unique_ptr.h:49:28:注意:在这里声明模板类auto_ptr;

这是我的命令;

$ ./configuer

$ source something.sh

$ scons

实际上,我什么都不知道.我已经在搜索这个网站和谷歌了.但我没有找到解决方案.

这是我的g ++版本(和c ++也是同一个版本.)

g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609

有什么想法吗?谢谢.

c++ g++ scons c++11

7
推荐指数
1
解决办法
3999
查看次数

如何使用Visual Studio命令行+ SCons构建Windows XP应用程序?

使用Visual Studio 2015 IDE构建Windows xp应用程序并不难,您只需要使用正确的平台工具集(v120_xp或v140_xp),并确保在目标计算机上安装适当的可再发行的visual studio运行时dll, peasy.

现在,我一直在试图找出如何在不使用VS GUI但使用VS2015命令行+ SCons的情况下构建针对Windows XP的Windows xp应用程序

所有SCons标志都在这里发表文档,但我没有看到任何允许我更改平台工具集的内容.

如果你想知道平台工具集标志的真正含义是什么......经过一些研究我已经能够弄清楚那个标志真正做的是基本上生成适合目标机器加载器的不同PE头,你可以看到下面4个不同案例之间的比较(v120,v120_xp,v140,v140_xp):

在此输入图像描述

问题:如何在使用visual studio command line或使用时更改visual studio平台工具集visual studio command line + SCons

编辑:我发现这可以在使用VS2010的msbuild构建时从命令行设置平台工具集吗?但我不确定是否可以通过SCons使用:/

scons portable-executable visual-studio nuitka visual-studio-2015

7
推荐指数
1
解决办法
212
查看次数