Msgstr "Ошибка типа: попытался найти Dir '...' как файл." в scons вариант_dir построить - PullRequest
0 голосов
/ 18 июня 2019

Я работаю над иерархической многовариантной сборкой с помощью scons.Для библиотеки с именем "lib" общий источник находится под src/lib, в то время как специфичный для варианта источник находится под src/lib/variant.(Например, src/lib/linux на машинах Linux.) Если для конкретного варианта не существует специфического для варианта кода, каталог может не существовать.Когда моя установка использует функцию Progress() для печати, так как каждый файл оценивается scons, она выдает ошибку TypeError, сообщающую мне TypeError: Tried to lookup Dir 'src/lib/subdir_1' as a File.

У меня есть scons версии 3.0.1-1 в Ubuntu.Мой python по умолчанию - 2.7.16.

Я не могу точно определить, где я мог бы заставить scons создать узел File для несуществующего каталога src/lib/subdir_1, но для воспроизведения ошибки янужно включить $TARGET в вызов Progress().Удаление src_subdirs из среды устраняет ошибку, как и сборка только одного варианта.Кроме того, кажется, что функция Glob() также необходима для воспроизведения ошибки.

В моем случае воспроизведения есть три файла (и в этом минимальном примере нет фактического источника, только файлы scons и каталоги, содержащие их).):

SConstruct:

base_env = Environment()
Progress('Evaluating $TARGET\n')

env = base_env.Clone(src_subdirs = ['subdir_1'])
Export('env')
SConscript('src/SConscript', variant_dir = 'build/variant_1', duplicate = 0)

env = base_env.Clone(src_subdirs = ['subdir_2'])
Export('env')
SConscript('src/SConscript', variant_dir = 'build/variant_2', duplicate = 0)

src / SConscript:

SConscript(Glob('*/SConscript'))

src / lib / SConscript:

Import('env')

src = []
src_subdirs = env['src_subdirs']
for s in src_subdirs:
    src += env.Glob(s + '/*.c')

Полная ошибкасообщение:

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Evaluating SConstruct
Evaluating src/SConscript
Evaluating src/lib/SConscript
Evaluating build/variant_1/lib/subdir_1
Evaluating build/variant_1/lib
Evaluating build/variant_1
Evaluating src/SConscript
Evaluating src/lib/SConscript
scons: done building targets.
TypeError: Tried to lookup Dir 'src/lib/subdir_1' as a File.:
  File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
    _exec_main(parser, values)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
    _main(parser)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
    nodes = _build_targets(fs, options, targets, target_top)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
    jobs.run(postfunc = jobs_postfunc)
  File "/usr/lib/scons/SCons/Job.py", line 111:
    self.job.start()
  File "/usr/lib/scons/SCons/Job.py", line 227:
    task.failed()
  File "/usr/lib/scons/SCons/Script/Main.py", line 271:
    nodename = ', '.join(map(str, node))
  File "/usr/lib/scons/SCons/Node/FS.py", line 639:
    return self._save_str()
  File "/usr/lib/scons/SCons/Node/FS.py", line 652:
    result = SCons.Util.silent_intern(self._get_str())
  File "/usr/lib/scons/SCons/Node/FS.py", line 660:
    srcnode = self.srcnode()
  File "/usr/lib/scons/SCons/Node/FS.py", line 742:
    srcnode.must_be_same(self.__class__)
  File "/usr/lib/scons/SCons/Node/FS.py", line 602:
    (self.__class__.__name__, self.get_internal_path(), klass.__name__))

Как видите, он завершил анализ моего кода во время ошибки.Предположительно что-то во время синтаксического анализа SConscript создало проблемную ситуацию, но, поскольку это не указывает на мой код, у меня возникли проблемы с предположением, как это исправить.

...