scons无法解析相对源路径

时间:2017-11-17 05:36:19

标签: scons

我有以下项目结构:

/prj
    SConstruct
    /src
        /app
        /lib1
        /lib2
        /...

' / PRJ / SRC / LIB1'结构:

/lib1
    /src
    /test
    SConscript

' LIB1 / SConscript':

SConscript('test/test1/SConscript',
            exports = 'env',
            variant_dir = '#build/release/lib1/test', 
            duplicate = 0)

最后,'测试'目录:

/test
    /common
        helpers.cpp
    /test1
        SConscript
        main.cpp

在&test; test / test1 / SConscript'来源指定为:

Sources = ['../common/helpers.cpp', 'main.cpp']

结果:

scons: *** [build/release/lib1/common/helpers.o] 
Source `build/release/lib1/common/helpers.cpp' not found, 
needed by target `build/release/lib1/common/helpers.o'

可以看出问题是scons试图找出源文件' helpers.cpp'在构建目录中,而不是在源代码目录中。

一些研究表明,当源文件路径以' ../'开头时引发的问题。当所有来源定义在' SConscript'文件全部没问题。

Scons v2.5.1和v3.0.1表现出相同的行为。

我做错了什么?我发现了this answer作者建议的地方:

  

你可以使用../test.cpp作为文件名

但我做的完全一样。是这样的scons行为还是这个bug?

1 个答案:

答案 0 :(得分:0)

您的"代码"在" lib1/SConscript":

SConscript('test/test1/SConscript',
            exports = 'env',
            variant_dir = '#build/release/lib1/test', 
            duplicate = 0)

使用给定" test/test1/SConscript"的名称并隐式链接文件夹" test/test1"作为"变体文件夹" (= variant_dir)到目标目录" #build/release/lib1/test"。因此,如果无法在" #build/release/lib1/test"中找到所需文件, SCons 会尝试进行替代"查找"在" test/test1/"。但是,此链接不会自动设置为" common"文件夹以及查找" helpers.cpp"的原因。失败。这是预期的行为,并在 SCons 中正确。

解决当前问题的方法是移动" test/test1/SConscript"一个文件夹级别更高,包括那里的来源" common/helpers.cpp"和" test/main.cpp"并从" lib1/SConscript"中调用这个新的SConscript为:

SConscript('test/SConscript',
            exports = 'env',
            variant_dir = '#build/release/lib1/test', 
            duplicate = 0)