2013-10-23 126 views
2

我有一个C++应用程序,我试图用scons构建,它由几个子程序组成。构建多个源目录到相同的目标目录中

每个子程序在源目录的子目录中都有自己的源文件。这些源文件,例如source/prog1/prog1.cpp)被编译成驻留在对象目录e.e中的目标文件。 object/prog1/prog1.o

这很好,因为每个源目录都有其目标目录,并且不存在冲突的可能性。

但是,我试图做的是将这些目标文件链接到可执行文件,这将在相同的bin目录中。因此,多个源文件(object/prog1,object/prog2等)将全部进入相同的目标目录(bin)。

的目录布局如下:

application 
    source 
     prog1 
      prog1.cpp 
      something.cpp 
     prog2 
      prog2.cpp 
      somethingelse.cpp 
    object 
     prog1 
      prog1.o 
      something.o 
     prog2 
      prog2.o 
      somethingelse.o 
    bin 
     ??? <- what I'm concerned with 

我试图实现与以下SConstruct脚本:

env = Environment() 
Export('env') 

#common objects 
common=env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0) 
Export('common') 

#sub-programs 
env.SConscript("source/prog1/SConscript_bin", variant_dir="bin", duplicate=0) 
env.SConscript("source/prog2/SConscript_bin", variant_dir="bin", duplicate=0) 

然而,scons的与以下错误提示:

scons: *** 'bin' already has a source directory: 'source/prog1'. 

错误消失,如果我让它使每个子程序都有自己的目录bin目录中的ectory,例如variant_dir="bin/prog1"

所以,我的问题是这样的:如何将多个源的目标文件链接到同一个变体目录中?

+1

我能够重现此行为。我尝试将一个调用与VariantDir()与SConscript()结合起来,并得到同样的问题。我无法解释它,但似乎SCons不喜欢一个独特的variant_dir的多个源代码目录。您可以尝试在SCons用户的群组邮件列表上询问:[email protected] – Brady

回答

1

在你的情况下,我会让SCons在它们各自的文件夹中构建不同的二进制文件,然后使用Install builder将二进制文件复制到bin/目录。

你会得到这样的:

env = Environment() 
Export('env') 

common = env.SConscript("source/common/SConscript_object", variant_dir="object/common", duplicate=0) 
Export('common') 

prog1 = env.SConscript("source/prog1/SConscript_bin", variant_dir="object/prog1", duplicate=0) 
prog2 = env.SConscript("source/prog2/SConscript_bin", variant_dir="object/prog2", duplicate=0) 

env.Install('bin', prog1) 
env.Install('bin', prog2) 

随着子程序的SConscript是像

Import('env') 
Import('common') 

prog1 = env.Program('prog1', [ env.Glob(*.cpp), common ]) 

Return('prog1') 

我认为SCons的拒绝建立不同的指标纳入一个独特的变种目录,因为变体设计使用不同的构建设置构建给定的目标,如调试和发布模式。