简单的问题,但我不知道答案.
假设我有一个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) 我有C++,Java和Python的项目.C++中的项目导出SWIG接口,因此Java和Python项目可以使用它们.
我的问题是:我可以使用什么构建机制来管理依赖项并构建这些项目?
我使用过SCons和GYP.它们相当容易使用并允许插件(代码生成器,编译器,打包器).我想知道是否有替代方案,特别是对C++,Java和Python的原生支持.
我在Linux平台上开发,但我希望能够构建mac并赢得平台.
我希望我的Qt/C++应用程序知道它是哪个版本.它应该知道不是来自某些配置文件,而是将版本号编译成应用程序二进制文件.版本本身就是字符串,如"XYZ",其中X是主要版本号,Y是次要版本号,Z是SVN下的修订版(或SVN下的版本号减去版本"XY0"出来时的版本号) .您认为用scons实现这一目标的最简单方法是什么?
假设您有一个C项目的复杂源代码树,许多目录包含大量文件.scons构建支持多个目标(i386,sparc,powerpc)和多个变体(调试,发布).这里有一个sconstruct在根(引用各种sconscripts,做正确的事情所有这些,当参数指定的目标和变异,如调用)scons target=i386 variant=release.
有没有一种简单的方法来确定每个构建将使用哪些源文件(*.c和*.h)(它们都略有不同)?我的理论是,scons需要计算这个文件集,以便知道要编译哪些文件以及何时重新编译.它能提供这些信息吗?
我确实不想要做的:
find . -name '*.[ch]' 还会打印不需要的文件以进行单元测试和其他伪装,并且不是特定于目标的理想情况下,我想做,scons target=i386 variant=release printfileset并看到正确的*.[ch]文件列表.然后,该列表可以作为doxygen等其他源文件管理工具的输入.
如果我有一个可执行文件,一次生成多个文件的输出 -
generate_output -o a.out -f input1.txt input2.txt input3.txt
Run Code Online (Sandbox Code Playgroud)
有没有办法为此编写这样的自定义构建器?我目前所拥有的是 -
builder = Builder(
action='generate_output -o $TARGET -f $SOURCE',
suffix='.out', src_suffix='.txt')
Run Code Online (Sandbox Code Playgroud)
然后它只生成一个序列中的文件,这不是我真正想要的 -
generate_output -o input1.out -f input1.txt
generate_output -o input2.out -f input2.txt
# etc...
Run Code Online (Sandbox Code Playgroud) 我想在编译后直接运行构建的程序,以便我可以构建和启动我的程序scons.
我认为这个SConstruct-File会在重建时启动程序.
main = Program( "main", [ "main.cc" ] )
test = Command( None, None, "./main >testoutput" )
Depends( test, main )
Run Code Online (Sandbox Code Playgroud)
每次我跑,这都会启动它 scons
main = Program( "main", [ "main.cc" ] )
test = Command( None, None, "./main >testoutput" )
Requires( test, main )
Run Code Online (Sandbox Code Playgroud)
但两者都不起作用,我的程序永远不会被执行.我究竟做错了什么?
我正在使用SCons在工作中构建一个项目,我正在尝试解析GCC的文本输出,以便为每个目标编写所有编译器警告的摘要报告,因为我们的构建脚本很长,并且有一个很多文本输出到控制台.
我搜索谷歌和这个网站已经有一段时间了,我找不到SCons内置的方法来实现这一目标.我已经尝试将整个stdout和stderr流重定向到每个示例的文件,但只捕获SCons本身的输出而不是它调用的任何工具的输出.
我的下一个想法是找到SCons编译参数以发送到GCC并将重定向添加到参数字符串末尾的位置.看完文档后,似乎构造变量CCCOM并CXXCOM包含用于编译的命令行.但是,当我将下面的行添加到我的SConstruct时,SCons正在执行命令行中没有任何更改.
baseEnv['CCCOM'] += " 2> gcc-c-output.txt"
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt"
Run Code Online (Sandbox Code Playgroud)
有效的一件事是在整个SCons命令上重定向stderr流:
scons 2> stderr.txt
Run Code Online (Sandbox Code Playgroud)
但是,我想避免这种情况,并尽可能包含SCons中的所有内容.输出也不一定要转到文件.它可以保存在任何地方,只要我可以访问它来解析并保存到构建结束时的文件.
我已经搜索了这么久,没有提出任何问题,所以我不知道还有什么可以尝试的.我不得不相信我不是第一个想做这样的事情的人.
我无法让scons正确编译一个小的线程示例(在Linux上).
如果我运行scons,它会这样做:
jarrett@jarrett-laptop:~/projects/c++_threads$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/main.o -c -std=c++11 -pthread -Wall -g src/main.cpp
g++ -o build/c++threads build/main.o
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)
然后,如果我运行./build/c++threads它会抛出此错误:
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted
Run Code Online (Sandbox Code Playgroud)
如果我从命令行编译:
g++ -std=c++11 -pthread -Wall -g src/main.cpp
Run Code Online (Sandbox Code Playgroud)
它编译成a.out,如果我运行a.out它运行程序(为线程做一些输出等).
这是我的SConstruct文件:
# Tell SCons to create our build files in the 'build' directory
VariantDir('build', 'src', duplicate=0)
# …Run Code Online (Sandbox Code Playgroud) 一段时间以来,我一直在尝试让 SCons 在 Windows 10 cmd 上工作。我通过 pip 安装了它,所以我相信它位于正确的目录中,因为当我使用py. 当我尝试使用时scons,我收到消息
“scons”不被识别为内部或外部命令、可操作程序或批处理文件。
因此,我尝试编辑用户和系统路径变量以在目录下包含 scons 'C:\Users\dwayn\AppData\Local\Programs\Python38\Lib\site-packages\scons\',但出现相同的错误。
我应该编辑什么才能使 scons 在命令行上运行?
注意:如果有影响的话,我的系统上确实安装了 Anaconda 3。