scons不尊重带有目标文件的variant_dir

时间:2016-06-05 18:15:43

标签: scons

为了简单起见,我能够重现这个问题,我有以下例子...

我目前有两个文件,一个SConstruct和一个SConscript。

我的目录树如下:

- .
    - SConstruct
    - build (dir)
    - dir1 (dir)
        - mysrc.cpp
        - proj (dir)
            - SConscript

以下是 SConstruct 的内容:

SConscript('dir1/proj/SConscript', variant_dir='build/out', duplicate=0)

以下是 dir1 / proj / SConscript 的内容:

src = Dir('.').srcnode().abspath + '/../mysrc.cpp'
StaticLibrary('mylib', src)

当我在根目录下运行scons时,我看到以下输出

g++ -o dir1/mysrc.o -c dir1/mysrc.cpp
ar rc build/out/libmylib.a

ar命令看起来很棒,它输出到variant_dir,即build / out。 这里的问题是mysrc.o的输出位置。它转到dir1而不是build / out。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您需要指定源文件的路径,就好像它们位于变体目录路径中一样。

将您的顶级SConstruct更改为此...

SConscript('dir1/proj/SConscript', variant_dir='build/out', src_dir='dir1', duplicate=0)

将您的dir1/proj/SConscript更改为此...

src = Dir('.').srcnode().abspath + '/../../build/out/mysrc.cpp'
StaticLibrary('mylib', src)

然后当你跑步时,你会看到以下内容。

>> scons --version
SCons by Steven Knight et al.:
    script: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
    engine: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
    engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2015 The SCons Foundation

>> tree
.
├── dir1
│   ├── mysrc.cpp
│   └── proj
│       └── SConscript
└── SConstruct

2 directories, 3 files

>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/out/mysrc.o -c dir1/mysrc.cpp
ar rc build/out/proj/libmylib.a build/out/mysrc.o
ranlib build/out/proj/libmylib.a
scons: done building targets.

>> tree
.
├── build
│   └── out
│       ├── mysrc.o
│       └── proj
│           └── libmylib.a
├── dir1
│   ├── mysrc.cpp
│   └── proj
│       └── SConscript
└── SConstruct

5 directories, 5 files