scons是否知道SConscript文件所在的目录?

时间:2012-03-21 14:25:24

标签: scons

我们正在评估scons作为构建系统,并且我在容纳旧系统时遇到了问题。在我们的一些源代码子目录中,我们有一个“sources.lib”文件,其中列出了需要编译以组装该目录的目标库的C ++文件的名称。但是,在同一目录中还有其他C ++文件,所以我不能只使用Glob()来找到合适的文件。

如何找出SConscript文件所在的目录? os.getcwd()始终返回构建目录。即使文档声明SConscript中的路径相对于源目录(或者Glob('*。cpp')也不起作用),只是执行open('sources.lib')会失败,因为它会查找文件在构建目录中。最后,该SConscript文件中的构建环境不包含实际的当前源目录。

修改this reply看起来像是

File('sources.lib').srcnode().abspath

返回正确的文件名和目录,它不会告诉你它是否存在(必须使用os.path.isfile)。它似乎也是

Dir('.').srcnode().abspath

将告诉您SConstruct文件所在的位置。

示例在定义要为库编译的源文件时,我不想使用

lib = env.SharedLibrary('mylib', Glob('*.cpp'))

但是宁愿构造一个首先检查“sources.lib”是否存在的函数,如果它不存在,则使用globbing。所以我正在定义我的库

lib = env.SharedLibrary('mylib', env.getSources('*.cpp'))

并创建一个读取文件的函数(如果存在)

def getSources(self, pattern):

    # list of source files to assign to a target
    sources = []
    # srcFile = 'sources.lib' # failed
    # srcFile = os.path.join(os.getcwd(), 'sources.lib') # failed
    srcFile = File('sources.lib').srcnode().abspath # works

    # look for sources.lib
    try:
        infile = open(srcFile,'r')
    except IOError:
        #print "Globbing to get sources"
        sources = Glob(pattern, strings=True)
    else:
        #print "Reading sources.lib"
        for line in infile.readlines():
            line = line.rstrip('\n\r')
            if line != '':
                sources.append(line)

    return sources

buildEnv.AddMethod(getSources)

这似乎有效。直到今天我才知道File.srcnode()。abspath。

2 个答案:

答案 0 :(得分:5)

我使用以下代码:

this_sconscript_file = (lambda x:x).func_code.co_filename
code_base = os.path.dirname(this_sconscript_file)

答案 1 :(得分:2)

SCons中有三种类型的路径:

  1. 相对于根SConstruct在路径前加上“#”
  2. 相对于SConscript不使用'#'。
  3. 绝对路径。我认为这是不言自明的:)
  4. 如果你需要处理SConscript所在目录之外的路径,你应该使用'#'

    在这个例子中它应该是双向的,但带有'#'的路径对我来说似乎更直观和直观:

    ./SConstruct
    ./dirA/SConscript - use '#dirA/sources.lib' OR 'sources.lib'
    ./dirB/SConscript - use '#dirB/sources.lib' OR 'sources.lib'
    

    希望这有帮助,

    贝迪