Scons VariantDir()在编译时是否会重复使用CPPPATH和LIBPATH?

4

以下是我的简单案例。我有一个源文件结构如下:

.
├── SConstruct
└── src
    ├── SConscript
    ├── staticLib
    │   ├── classInStaticLib.cpp
    │   ├── classInStaticLib.h
    │   └── SConscript
    └── test.cpp

SConstruct:

VariantDir('build', 'src', duplicate=0)
SConscript('build/SConscript')

src/SConscript:

import os
lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'))
Program( 'test',
         'test.cpp',
         CPPPATH = lib,
         LIBS = lib,
         LIBPATH = lib )

src/staticLib/SConscript:

Library('staticLib', 'classInStaticLib.cpp')

我运行scons后,在命令行界面中看到了以下信息:

g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o
ranlib build/staticLib/libstaticLib.a
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib

scons已成功完成,但请注意第4行中有"-Ibuild/staticLib"和"-Isrc/staticLib",第5行中有"-Lbuild/staticLib"和"-Lsrc/staticLib"。应该只有一个。

这是为什么呢?


我刚在SCons用户邮件列表上提出了这个问题,想知道这是一个bug还是预期行为。请参见http://four.pairlist.net/pipermail/scons-users/2014-April/002438.html。 - jfritz42
4个回答

1
我认为这是因为您正在使用SCons VariantDir()函数,这会导致SCons查找生成目录。我从未见过它同时使用源目录和变体目录。 VariantDir()函数通常仅在您不使用SConscript()函数时使用。尝试更改SConstructSConscript()的调用以使用variant_dir参数,并删除对VariantDir()的调用,如下所示:
SConscript('src/SConscript', variant_dir='build', duplicate=0)

我会考虑按以下方式更改src/SConscript文件:
import os
lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'),
           variant_dir=os.path.join(lib, 'build'),
           duplicate=0)
Program( 'test',
         'test.cpp',
         CPPPATH = lib,
         LIBS = lib,
         LIBPATH = lib )

这是我在执行scons时得到的结果,顺便说一下,它与你的结果相同:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o
ranlib build/staticLib/libstaticLib.a
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib
scons: done building targets.

$ tree build/
build/
|-- staticLib
|   |-- classInStaticLib.o
|   `-- libstaticLib.a
|-- test
`-- test.o

1 directory, 4 files

我从来没有注意到SCons会这样做,也无法解释为什么会这样。我尝试使用不同的variant_dir选项进行测试,但结果始终相同。我想说你没有做错任何事情,这是一个奇特的SCons行为。


谢谢您的回复。但我仍然得到了相同的结果。您或其他人有时间在您的机器上测试吗?非常感激。 - faraday
@faraday,我昨晚和今早都测试了一下,并更新了答案。我得到了相同的结果,这是我以前从未注意到的 :) - Brady
@faraday 很高兴能帮助 :) - Brady

1
这是我在SCons-users邮件列表上得到的回复,使用VariantDir()的"正常和预期"效果。
请参见four.pairlist.net/pipermail/scons-users/2014-April/002440.html Pawel说:“您可能会生成源文件/标头(例如,使用SWIG或SConf),它们将进入变体目录,其他文件则直接从源目录获取,因此,在我看来,-Ibuild/staticLib -Isrc/staticLib是正确的。”

0

这是我使用过的一种解决方法:

import os

def abs_path(rel_path):
    return os.path.join(Dir('.').srcnode().abspath, rel_path)

lib = 'staticLib'
SConscript(os.path.join(lib, 'SConscript'))
Program( 'test',
         'test.cpp',
         CPPPATH = abs_path(lib),
         LIBS = lib,
         LIBPATH = lib )

-1

我创建了这个目录结构:

stest.cpp
Sconstruct
dira/hello.cpp
dira/hello.h
dirb/hello.cpp
dirb/hello.h

我的Sconstruct文件包含以下内容:

SOURCES = [ 'stest.cpp', 'hello.cpp' ]
common = Environment ()
a=common.Clone (CPPPATH='#')
a.Repository ('#/dira')
a.Object ('obja/stest.o', 'stest.cpp')
a.Object ('obja/hello.o', 'dira/hello.cpp')
a.Program ('obja/a', ['obja/stest.o', 'obja/hello.o'])
a.Alias ('a', 'obja/a')
b=common.Clone (CPPPATH='#')
b.Repository ('#/dirb')
b.Object ('objb/stest.o', 'stest.cpp')
b.Object ('objb/hello.o', 'dirb/hello.cpp')
b.Program ('objb/b', ['objb/stest.o', 'objb/hello.o'])
b.Alias ('b', 'objb/b')

运行scons -n a b会得到以下结果:

g++ -o obja/stest.o -c -I. -Idira -Idirb obja/stest.cpp
g++ -o obja/hello.o -c -I. -Idira -Idirb obja/hello.cpp
g++ -o obja/a obja/stest.o obja/hello.o
g++ -o objb/stest.o -c -I. -Idira -Idirb objb/stest.cpp
g++ -o objb/hello.o -c -I. -Idira -Idirb objb/hello.cpp
g++ -o objb/b objb/stest.o objb/hello.o

所以,这显然与VariantDir()无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接