2010-09-15 76 views
11

我一直试图让scons输出exe,obj,lib和dll文件到特定的编译目录。强制Scons输出(exe,obj,lib和dll)到特定的编译目录

我的文件结构如下:

/projectdir 
    /build 
    /bin 
    /obj 
    /source 
    /subdirs 
    /.. 
    SConstruct 

基本上,我现在得到的是我的源目录是越来越有OBJ文件污染。我宁愿将它全部放在一个地方。

的SConstruct文件看起来是这样的:

env.VariantDir('build', 'source', duplicate = 0) 
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 

我读过关于这个网站其他一些类似的问题,但没有带发现了一个很好的解决方案呢。

由于

回答

8

我发现的最简单的方法是使用2个文件,一个SConstruct文件和一个单独的SConscript。然后

# content SConstruct 
SConscript('main.scons', variant_dir='build', duplicate=0) 

在“main.scons”你做你构建的肉:

在SConstruct只需调用其他文件,并指定目录中生成输出。你可以忘记这个文件中的变体目录。

# content of main.scons 
env = Environment() 
env.Program('Hierarchy', 
      source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 
+0

谢谢,工作。虽然只有一个文件更清洁,我想我只需要忍受它! – 2010-09-15 21:07:59

3

VariantDir(在user guide还描述)告诉scons的以在一个单独的目录放生成的文件。在旧版本的scons中,该函数被命名为BuildDir

您可能还想了解避免重复源目录(在用户指南和wiki中均有介绍)。

+1

是的,这是我的尝试: env.VariantDir( '建设', '源',重复= 0) env.Program( '层次',源= [ '源/ sconstest.cpp',“源/utils/IntUtil.cpp']) 并且这完全没有任何影响:( – 2010-09-15 19:25:58

+0

要编译的文件不应该在源代码中,而是在构建文件夹中:'env.Program('Hierarchy',source = ['build/sconstest.cpp','build/utils/IntUtil.cpp'])' – Phong 2014-03-24 06:08:03

5

这并不是说很难获得只使用一个SConstruct文件(一个小项目)VariantDir工作,但它是非常混乱的配置是一个文件和两个文件使用情况不同。

只有SConstruct:

env = Environment() 
env.VariantDir('build', 'src', duplicate=0) 
files = Glob('build\*.c') 
env.Program("build\program", files) 

通知源文件的方式位于.\src.\build被指定为位置。输出也必须用.\build“前缀”,否则编译的程序将驻留在SConstruct文件的目录中。

当您执行脚本时,SCons会编译*.c文件.\src并将结果对象置于.\build

难怪他们将BuildDir重命名为VariantDir以避免混淆(没有太多成功)。

1

我正在使用像richq的答案这样的双文件方法,但尽管最终的构建产品(libs,程序)进入了正确的变体目录,但目标文件仍然会进入源目录。

解决方案竟然是通过相对路径而不是绝对路径来源文件。我不知道为什么。

我的第二个scons文件最初看起来像这样。注意绝对路径的globbing - 当我第一次写这个时,我没有意识到路径会自动地相对于scons文件。

import os, inspect 
env = Environment() 
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True) 
env.Program('Foo', source = src) 

而这导致* .obj以src /结尾,而我的变体dir下的程序结束了。当我把它改成以下,目标文件也到了变型DIR:

env = Environment() 
src = Glob("src/*/*.c*", strings=True, source=True) 
env.Program('Foo', source = src) 

使用绝对路径可能是一个小白错误 - 我是比较新的都使用SCons和Python - 但我认为我” d分享它以防其他人遇到同样令人沮丧的问题。

+0

你的中间文件结果在源目录中是因为你从那里请求它们,如果你从变体目录或相对目录请求它们,那么S缺点将填充变量中的源代码,然后在那里生成输出。 (当然,如果你要求变体dir不要复制,那么它不会复制那里的源代码,但会产生变体dir中的输出文件) – bdbaddog 2015-07-31 22:46:36

+0

Aha,这样做更有意义。感谢您的线索! – Soleil 2015-07-31 23:38:10