标签: scons

有了scons,你如何链接到预建的库?

我最近开始使用scons构建几个小型跨平台项目.其中一个项目需要链接到预先构建的静态库......这是如何完成的?

在make中,我只是在windows上追加"link/LIBPATH:libstxxl.lib",在unix上追加"stxxl.a".

c++ build-process build-tools scons

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

是否可以自动生成Xcode项目?

简单的问题.是否有任何工具可以从命令行生成Xcode项目?我们使用SCons构建我们的跨平台应用程序,但这不支持内在的Xcode项目生成.我们希望避免手动创建项目,因为这将涉及维护多个文件列表.

xcode scons

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

SCONS的Visual Studio解决方案?

是否有任何工具可以将大型复杂的*Visual Studio 2005(或2008)解决方案转换为SCons项目?

*多个平台/编译器上的大量项目和多种配置

projects-and-solutions scons visual-studio

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

如何使用scons获取像``libhello.so.0.0.1'这样的共享库名?

我正在使用scons实用程序生成共享库.当我写下面的规则时:

SharedLibrary('hello','hello.c')

我会得到``libhello.so''文件.

有没有办法自动获取像``libhello.so.version'这样的文件?

naming-conventions shared-libraries scons

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

什么触发scons在我有自定义构建器时构建文件?

我很难控制何时在scons中构建文件.我有一个非常简单的构建树示例(见下文),其中一个Poem构建器只接受一个.txt文件并将其转换为相应.eectxt文件中的小写.

在我的SConstruct和SConscript文件中,我声明了3个.txt文件的依赖项.

但我无法弄清楚是什么将这些放入默认构建中!

sconstest/
    SConstruct
    tiger.txt
    src/
        SConscript
        hope.txt
        jabberwocky.txt
Run Code Online (Sandbox Code Playgroud)

其中*.txt文件是诗歌,我的SConstruct和SConscript看起来像这样:

SConstruct:

env = Environment();

def eecummings(target, source, env):
  if (len(target) == 1 and len(source) == 1):
    with open(str(source[0]), 'r') as fin:
        with open(str(target[0]), 'w') as fout:
            for line in fin:
                fout.write(line.lower());
  return None

env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt');

Export('env');
poems = SConscript('src/SConscript');
tigerPoem = env.Poem('tiger.txt');
Run Code Online (Sandbox Code Playgroud)

SRC/SConscript:

Import('env');

input = ['jabberwocky.txt', 'hope.txt'];
output = [env.Poem(x) for x in input];
Return('output');
Run Code Online (Sandbox Code Playgroud)

我想要做的是声明.eectxt文件与相应.txt …

scons

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

如何使用Scons在Glob的不同环境中编译相同的对象?

我有一个用Scons构建的C++项目.起初我只有优化版本才能编译,它运行正常.然后我还需要一个调试版本,然后我为它添加另一个环境.这是Scons代码:

env = Environment()

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall'])
opt_objs = opt.Glob('src/*.cpp')
prog = opt.Program('prog', opt_objs)

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0'])
dbg_objs = dbg.Glob('src/*.cpp')
dbg_prog = dbg.Program('dbg_prog', dbg_objs)
Run Code Online (Sandbox Code Playgroud)

使用此代码,我遇到了错误:

scons: *** Two environments with different actions were specified for the same target: 
src/CometReadService.o
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,由opt.Glob('src/.cpp')和dbg.Glob('src / .cpp')创建的那些.o文件目标完全相同.通过阅读文档Multiple Construction Environments我知道我可以将对象重命名为"opt.Object('xxx-opt','xxx.c')",但是,它是Glob而不是Object.我怎么解决这个问题?

glob scons

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

使用类似规则构建多个可执行文件

我写的东西像C++的互动教程.本教程将由两部分组成:一部分编译成一个库(我使用Scons构建它),另一部分(课程)随最终用户编译的教程一起提供.我正在寻找一种方便人们建立这些课程的好方法.

基本上,第二部分是一个包含所有课程的目录,每个目录都在自己的目录中.每课至少有一个lesson.cppmain.cpp文件,还可以存在其他文件,其中存在的我不知道,直到它被运后-最终用户将创建这些.它看起来像这样:

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        main.cpp
        user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)

这些中的每一个都需要根据几乎相同的规则进行编译,并且编译命令应该可以从其中一个课程目录(helloworld/等等)运行.

看到项目的其余部分是使用Scons构建的,因此将它用于此部分也是有意义的.然而,使用SCons将搜索SConstruct它从运行目录下的文件:这是可以接受的把SConstruct每节课目录中的文件,再加上一个SConscriptall_lessons/给出的一般规则目录?这似乎违背了Scons期望项目组织的典型方式:这种方法的潜在缺陷是什么?我可以放一个SConstruct文件而不是SConscript文件,从而可以从任一目录构建(使用导出来避免无休止的递归,我猜)?

另外,我可能在某一时刻要替换lesson.cpp一个lesson.py生成所需的文件; Scons是否允许我轻松地与构建者一起完成这项工作,或者是否有一个更方便的框架?

最后,我想最终得到以下内容(或具有不同构建系统的等效内容):

all_lessons/
    SConstruct
    helloworld/
        SConstruct
        lesson.cpp
        main.cpp
    even_or_odd/
        SConstruct
        lesson.py
        main.cpp
    calculator/
        SConstruct
        lesson.cpp
        main.cpp
        user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)

scons allall_lessons目录中运行需要:

  • 运行even_or_odd/lesson.py生成even_or_odd/lesson.cpp.
  • 意识到user_created_add.cpp还需要编译.
  • 为每节课制作可执行文件.

运行sconseven_or_odd/,或者scons even_or_oddall_lessons/应该产生一个可执行与上面的一个(相同的编译标志).

摘要:

  1. Scons是否适合/能够做到这一点?
  2. 当 …

c++ build-automation build scons

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

在Build目录中输出SCons

我正在尝试修改我的SCons文件,以便将生成的文件放入构建目录中.最初我虽然VariantDir可能是一个选项,但从我阅读的所有内容和示例来看,它并没有做我想要的.

有没有简单的方法强制SCons将输出放在某个目录中而不必重写所有的源和脚本?

scons

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

SCons将编译后的程序复制到父目录

我试图在自动编译后将生成的程序文件复制到父目录.

我尝试过这个,但这不起作用.

env.Program( "program_name", [ "file1.cc", "file2.cc" ] )
Copy( "../program_name", "program_name" )
Run Code Online (Sandbox Code Playgroud)

我怎么能用SCons做到这一点?

c++ makefile build scons

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

如何确定请求的编译器

我的项目使用SCons来管理构建过程.我想支持多个编译器,所以我决定使用,AddOption这样用户就可以在命令行中指定使用哪个编译器(默认情况下是当前编译器所用的编译器).

AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
Run Code Online (Sandbox Code Playgroud)

我希望能够为各种编译器提供内置的编译器设置(包括特定编译器的最大警告级别等).这是我目前首次尝试解决方案的方式:

if is_compiler('g++'):
    from build_scripts.gcc.std import cxx_std
    from build_scripts.gcc.warnings import warnings, warnings_debug, warnings_optimized
    from build_scripts.gcc.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
elif is_compiler('clang++'):
    from build_scripts.clang.std import cxx_std
    from build_scripts.clang.warnings import warnings, warnings_debug, warnings_optimized
    from build_scripts.clang.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
Run Code Online (Sandbox Code Playgroud)

但是,我不确定该is_compiler()功能是什么样的.我的第一个想法是直接比较编译器名称(例如'clang ++')与用户传入的内容.但是,当我尝试使用时,这立即失败了scons --compiler=~/data/llvm-3.1-obj/Release+Asserts/bin/clang++.

所以我觉得我会变得更聪明并且使用这个功能

cxx = GetOption('compiler')
def is_compiler (compiler):
    return cxx[-len(compiler):] == compiler
Run Code Online (Sandbox Code Playgroud)

这只会查看编译器字符串的结尾,以便忽略目录.不幸的是,'clang …

c++ python scons

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