如何将对象放入SCons中的单独构建文件夹中?

时间:2018-02-21 06:59:39

标签: scons

我有一个非常简单的项目:

.
├── hello.c
├── lib
│   ├── foo.c
│   ├── foo.h
│   └── SConstruct
├── Makefile
└── SConstruct

构建之后我想得到这个:

.
├── build
│   ├── hello
│   ├── hello.o
│   └── lib
│       ├── libfoo.a
│       └── foo.o
│
├── config.log
├── hello.c
├── lib
│   ├── foo.c
│   ├── foo.h
│   └── SConstruct
├── Makefile
└── SConstruct

我尝试添加

VariantDir('build', '.')

但它不起作用。这是我的SConstruct文件

env = Environment(CC = 'gcc',
    CCFLAGS=['-O2', '-std=c99'],
)

Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5)
env.Program('Hello', 'hello.c',
    LIBS=['foo'],
    LIBPATH='lib/',
    CPPPATH=['lib']
)
Decider('MD5-timestamp')

VariantDir('build', '.')
SConscript(['lib/SConstruct'])

修改

我还尝试将variant_dir直接添加到SConscript指令:

SConscript(['lib/SConstruct'], variant_dir='build')

但我有一个错误:

$ scons -Q
gcc -o Hello hello.o -Llib -lfoo
/usr/bin/ld: cannot find -lfoo
collect2: error: ld returned 1 exit status
scons: *** [Hello] Error 1

SCons似乎不再考虑CPPPATH因为我在构建过程中没有-Ilib

2 个答案:

答案 0 :(得分:1)

请勿直接使用nodetool describecluster方法,而应使用VariantDir()来电的variant_dir关键字。为此,最好将您的资源转移到单独的“SConscript”文件夹中(参见下面的示例)。

User Guide中的相关章节是“分离源和构建目录”。

您还可以在src文件夹中的https://bitbucket.org/dirkbaechle/scons_talks找到一个有效的示例。

答案 1 :(得分:0)

从阅读上述内容:

env = Environment(CC = 'gcc',
    CCFLAGS=['-O2', '-std=c99'],
)

Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5)

# explicitly specify target dir and file base so object 
# isn't in source directory.
object = env.Object('build/hello','hello.c')

env.Program('Hello', object,
    LIBS=['foo'],
    LIBPATH='build/lib/',
    CPPPATH=['build/lib']
)


Decider('MD5-timestamp')

VariantDir('build', '.')
SConscript('lib/SConstruct','build/lib')

由于您不希望将源文件移动到SConstruct要使其工作的目录的子目录中,因此您需要手动指定目标目录(这与make&#39一致) ; s功能)