Неявный список всех целей сборки в SCONS? - PullRequest
3 голосов
/ 24 августа 2010

У меня есть проект scons, который принудительно включает несколько заголовочных файлов в качестве флага компилятора.

# Forced include files passed directly to the compiler
env.Append(CCFLAGS = ['/FIinclude.h'])

Эти файлы не включены ни в один файл проекта.Мне нужно добавить явную зависимость для них.

forced_include_headers = ['include.h']

# Trying to add an explicit dependency for each build target
for object in BUILD_TARGETS:
  env.Depends(object, forced_include_headers)

Проблема, с которой я сталкиваюсь, состоит в том, что список BUILD_TARGETS пуст.Кажется, он содержит только то, что передано из COMMAND_LINE_TARGETS или DEFAULT_TARGETS.Все цели в нашем проекте построены неявно.Мы не используем env.Default и т. Д. Есть ли способ получить неявный список целей или мне нужно его вручную построить?Я заметил, что TARGETS зарезервирован и, похоже, не содержит того, что я хочу.

Я могу добавить env.Depends(target, forced_include_headers) для всех целей в их соответствующих файлах SConscript, но проект довольно большой.

1 Ответ

0 голосов
/ 09 октября 2014

Я не уверен, что это лучший способ решить проблему (на самом деле, я думаю, идея создания псевдо-компоновщика работает лучше), но этот код вернет список Object целей:

# Typical SConstruct / SConscript
env = Environment()
env.Program('foo.c')
lib = env.SharedLibrary('bar.c')
env.Program('foo2.c', LIBS=[lib])
SConscript('subdir/SConscript', exports={'env':env})

# Get a list of all Object targets
def get_all_targets(env, node='.'):
    def get_all_targets_iter(env, node):
        if node.has_builder() and node.get_builder().get_name(env) in ('Object', 'SharedObject'):
            yield node
        for kid in node.all_children():
            for kid in get_all_targets(env, kid):
                yield kid
    node = env.arg2nodes(node, env.fs.Entry)[0]
    return list(get_all_targets_iter(env, node))

# Force them all to depend upon some header
env.Depends(get_all_targets(env), 'site_wide.h')
...