2012-03-21 136 views
7

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

如何找出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直到今天。

+0

要确定文件是否存在,你可以使用os.path.exists() – Brady 2012-03-21 14:46:47

+0

我不明白你的问题,建立小例子说明吧。 – Torsten 2012-03-21 14:50:38

+0

你的问题救了我:)'Dir('。')。srcnode()。abspath'为我工作。我使用这个选项'env.SConscriptChdir(0)'来避免目录“幻灯片”。谢谢! – Destroyica 2013-10-29 16:23:09

回答

2

有在SCons的3种类型的路径:

  1. 相对于根SConstruct前面加上 '#' 的路径
  2. 相对于SConscript不使用 '#'。
  3. 绝对路径。我认为这是不言自明的:)

如果您需要处理,其中SConscript是,你应该使用“#”

应该是双向的在这个例子中,目录之外的路径,但与 '#' 路径似乎更加明确,更加直观的对我说:

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

希望这有助于

布雷迪

+0

根据文档,默认相对路径是curretn SConstruct文件,而不是执行scons的地方。 – 2012-03-22 14:15:00

+0

你说得对,我也只是测试过。对不起,我会纠正我的答案。我曾经遇到过一个问题,并且确信它与scons被执行的地方相关,例如,如果你在一个子目录中并使用'scons -u',但看起来并非如此。感谢您的更正。 – Brady 2012-03-23 08:38:01

+1

但是,与当前调用构建器的SConscript相比,* current * SConscript呢?在我的情况下,我试图设置许多子模块使用的公共环境 - 这包括在当前SConscript目录中添加一个include /'dir到CPPPATH。 – 2014-12-26 11:07:01

4

我使用下面的代码:

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

不'os.path.dirname(__ file __)'做同样的事情吗? – tutuca 2013-07-26 16:58:34

+2

不,因为scons以某种方式包含SConscript,即使在包含的脚本中,__file__也始终引用根脚本。 – olpa 2013-07-26 20:33:53

+0

良好的解决方法。我仍然认为'Dir('。')。srcnode()。abspath'是更好的解决方案。 – gg349 2014-05-11 13:58:07

相关问题