Мы оцениваем работу scons как системы сборки, и у меня возникает проблема размещения нашей старой системы. В некоторых наших подкаталогах исходного кода у нас есть файл «sources.lib», в котором перечислены имена файлов C++, которые необходимо скомпилировать для сборки целевой библиотеки этого каталога. Но есть дополнительные файлы C++ в одном каталоге, поэтому я не могу просто использовать Glob(), чтобы найти соответствующие.Знаете ли вы, что в каком каталоге хранится файл 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
Я не понимаю вашу проблему, создать небольшой пример, иллюстрирующий это. – Torsten
Ваш вопрос спас меня :) 'Dir ('.'). Srcnode(). Abspath' работал для меня. Я использую эту опцию 'env.SConscriptChdir (0)', чтобы избежать слайдов каталога. Благодаря! – Destroyica