我们正在评估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直到今天。
要确定文件是否存在,你可以使用os.path.exists() – Brady 2012-03-21 14:46:47
我不明白你的问题,建立小例子说明吧。 – Torsten 2012-03-21 14:50:38
你的问题救了我:)'Dir('。')。srcnode()。abspath'为我工作。我使用这个选项'env.SConscriptChdir(0)'来避免目录“幻灯片”。谢谢! – Destroyica 2013-10-29 16:23:09