我们正在评估 scons 作为构建系统,但我在适应我们的旧系统时遇到了问题。在我们的一些源代码子目录中,我们有一个“sources.lib”文件,其中列出了需要编译以组装该目录的目标库的 C++ 文件的名称。但是,同一目录中还有其他 C++ 文件,因此我不能仅使用 Glob() 来查找合适的文件。
如何找出 SConscript 文件所在的目录? os.getcwd() 始终返回构建目录。尽管文档指出 SConscript 中的路径是相对于源目录的(否则 Glob('*.cpp') 将不起作用),但仅执行 open('sources.lib') 就会失败,因为它会查找构建目录中的文件。最后,该 SConscript 文件中的构建环境不包含实际的当前源目录。
Edit From 这个回复 https://stackoverflow.com/questions/6066545/scons-get-abspath-of-original-file-as-though-i-hadnt-set-variant-dir看起来像
File('sources.lib').srcnode().abspath
返回正确的文件名和目录,but它不会告诉您它是否存在(必须使用 os.path.isfile )。看来还
Dir('.').srcnode().abspath
会告诉您 SConstruct 文件所在的位置。
Example在定义要为库编译哪些源文件时,我不想使用
lib = env.SharedLibrary('mylib', Glob('*.cpp'))
而是宁愿构造一个函数,首先检查“sources.lib”是否存在,如果不存在,则使用通配符。所以我像这样定义我的图书馆
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 。