标签: 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:如果目标是在另一个存储库中构建的,我如何创建指向另一个存储库目标的链接

当我添加RepositorySConstruct文件(链接),如果在我的仓库的任何目标已在此修建了其他存储库(和依赖关系并没有改变),那么SCons不会建立目标-这是真的很酷。不幸的是,我有一些工具依赖于放置在某个位置的目标。当我SCons决定不在本地构建时,如何在我当前的存储库中创建指向该其他存储库目标的链接,因为另一个存储库已经构建了目标?

编辑: 它看起来SCons有一个“本地”功能,它将文件从另一个存储库复制到本地存储库(链接)。我真正需要的是一个软链接,因为这些目标很大并且有很多冗余。

python build-automation build-process build scons

6
推荐指数
0
解决办法
479
查看次数

什么是SCons替代品?

我有C++,Java和Python的项目.C++中的项目导出SWIG接口,因此Java和Python项目可以使用它们.

我的问题是:我可以使用什么构建机制来管理依赖项并构建这些项目?

我使用过SCons和GYP.它们相当容易使用并允许插件(代码生成器,编译器,打包器).我想知道是否有替代方案,特别是对C++,Java和Python的原生支持.

我在Linux平台上开发,但我希望能够构建mac并赢得平台.

c++ python java scons gyp

6
推荐指数
2
解决办法
2059
查看次数

使用scons管理版本的最佳实践?

我希望我的Qt/C++应用程序知道它是哪个版本.它应该知道不是来自某些配置文件,而是将版本号编译成应用程序二进制文件.版本本身就是字符串,如"XYZ",其中X是主要版本号,Y是次要版本号,Z是SVN下的修订版(或SVN下的版本号减去版本"XY0"出来时的版本号) .您认为用scons实现这一目标的最简单方法是什么?

c++ qt scons

6
推荐指数
1
解决办法
999
查看次数

使用scons确定复杂构建的源文件列表(*.[ch])

假设您有一个C项目的复杂源代码树,许多目录包含大量文件.scons构建支持多个目标(i386,sparc,powerpc)和多个变体(调试,发布).这里有一个sconstruct在根(引用各种sconscripts,做正确的事情所有这些,当参数指定的目标和变异,如调用)scons target=i386 variant=release.

有没有一种简单的方法来确定每个构建将使用哪些源文件(*.c和*.h)(它们都略有不同)?我的理论是,scons需要计算这个文件集,以便知道要编译哪些文件以及何时重新编译.它能提供这些信息吗?

我确实想要做的:

  • 记录一个详细的构建并对其进行后处理(可能不会告诉*.h文件)
  • find . -name '*.[ch]' 还会打印不需要的文件以进行单元测试和其他伪装,并且不是特定于目标的

理想情况下,我想做,scons target=i386 variant=release printfileset并看到正确的*.[ch]文件列表.然后,该列表可以作为doxygen等其他源文件管理工具的输入.

build-process build scons

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

SCons自定义构建器 - 使用多个文件构建并输出一个文件

如果我有一个可执行文件,一次生成多个文件的输出 -

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)

builder scons

6
推荐指数
1
解决办法
4100
查看次数

scons - 编译后运行程序

我想在编译后直接运行构建的程序,以便我可以构建和启动我的程序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)

但两者都不起作用,我的程序永远不会被执行.我究竟做错了什么?

c++ python scons

6
推荐指数
1
解决办法
5122
查看次数

SCons:保存/重定向gcc文本输出(警告)

我正在使用SCons在工作中构建一个项目,我正在尝试解析GCC的文本输出,以便为每个目标编写所有编译器警告的摘要报告,因为我们的构建脚本很长,并且有一个很多文本输出到控制台.

我搜索谷歌和这个网站已经有一段时间了,我找不到SCons内置的方法来实现这一目标.我已经尝试将整个stdout和stderr流重定向到每个示例的文件,但只捕获SCons本身的输出而不是它调用的任何工具的输出.

我的下一个想法是找到SCons编译参数以发送到GCC并将重定向添加到参数字符串末尾的位置.看完文档后,似乎构造变量CCCOMCXXCOM包含用于编译的命令行.但是,当我将下面的行添加到我的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中的所有内容.输出也不一定要转到文件.它可以保存在任何地方,只要我可以访问它来解析并保存到构建结束时的文件.

我已经搜索了这么久,没有提出任何问题,所以我不知道还有什么可以尝试的.我不得不相信我不是第一个想做这样的事情的人.

gcc scons io-redirection

6
推荐指数
1
解决办法
2014
查看次数

c ++使用scons编译std :: thread示例

我无法让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)

c++ g++ pthreads scons

6
推荐指数
1
解决办法
3774
查看次数

如何让 SCons 在 Windows 10 命令行上工作?

一段时间以来,我一直在尝试让 SCons 在 Windows 10 cmd 上工作。我通过 pip 安装了它,所以我相信它位于正确的目录中,因为当我使用py. 当我尝试使用时scons,我收到消息

“scons”不被识别为内部或外部命令、可操作程序或批处理文件。

因此,我尝试编辑用户和系统路径变量以在目录下包含 scons 'C:\Users\dwayn\AppData\Local\Programs\Python38\Lib\site-packages\scons\',但出现相同的错误。

我应该编辑什么才能使 scons 在命令行上运行?

注意:如果有影响的话,我的系统上确实安装了 Anaconda 3。

python windows cmd scons windows-10

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