Мы оцениваем scons как систему сборки, и у меня возникла проблема с размещением нашей старой системы. В некоторых из наших подкаталогов исходного кода у нас есть файл «sources.lib», в котором перечислены имена файлов C ++, которые необходимо скомпилировать для сборки целевой библиотеки этого каталога. Но в том же каталоге есть дополнительные файлы C ++, поэтому я не могу просто использовать Glob (), чтобы найти подходящие.
Как узнать, в каком каталоге находится файл 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):
# 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 до сегодняшнего дня.