我们正在评估scons作为一个构建系统,但我在适应我们旧有系统时遇到了问题。在一些源代码子目录中,我们有一个"sources.lib"文件,其中列出了需要编译以组装该目录的目标库的C++文件的名称。但是,在同一目录中还有其他C++文件,因此我不能只使用Glob()查找适当的文件。
怎样才能找到SConscript文件所在的目录?os.getcwd()总是返回构建目录。即使文档规定SConscript中的路径是相对于源目录的(否则Glob('*.cpp')将无法正常工作),仅仅执行open('sources.lib')也会失败,因为它在构建目录中查找该文件。最后,该SConscript文件中的构建环境也不包含实际的当前源目录。 编辑 根据这个回答,看起来......
怎样才能找到SConscript文件所在的目录?os.getcwd()总是返回构建目录。即使文档规定SConscript中的路径是相对于源目录的(否则Glob('*.cpp')将无法正常工作),仅仅执行open('sources.lib')也会失败,因为它在构建目录中查找该文件。最后,该SConscript文件中的构建环境也不包含实际的当前源目录。 编辑 根据这个回答,看起来......
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):
# 用于分配给目标的源文件列表 sources = [] # srcFile = 'sources.lib' # 失败 # srcFile = os.path.join(os.getcwd(), 'sources.lib') # 失败 srcFile = File('sources.lib').srcnode().abspath # 成功
# 查找 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 这个方法。
Dir('.').srcnode().abspath
对我有用。我使用选项env.SConscriptChdir(0)
来避免目录幻灯片。谢谢! - Destroyica