У меня проблема с динамическим SCons c, иерархической и вложенной сборкой.
Мой проект представляет собой набор из нескольких вложенных подпунктов Git, что-то вроде этого:
- SConstruct (root)
- Program
- SConstruct
- libs
- lib_one
- SConstruct (StaticLib)
- lib_two
- SConstruct (StaticLib)
- lib_three
- SConstruct (StaticLib)
- lib_three_one
- SConstruct (StaticLib)
Общая логика программы c такова:
- сборка каждого субмодуля,
- ссылка Программа со всеми связываемыми артефактами (* .a файлы),
- add все public_includes в глобальный env
- добавить все private_include в отдельный 'SConstruct scope' env
Основная программа Scunstruct (это может быть упрощенный псевдокод, чтобы показать мои логи c):
env = Environment()
env.Append(LIBS="m")
build_path = "build/"
libs = []
for sub in submodules:
variant_dir = build_path + "/" + sub
lib = SConscript(sub, exports=["env"], variant_dir=variant_dir)
libs.append(lib)
product = SConscript("src/SConstruct",
exports=["env", "libs"],
variant_dir=build_path)
Depends(product, submodules)
Итак, как вы можете видеть, моя идея - собрать все библиотеки в списке 'libs' и затем использовать их объекты в программе SConscript:
Import("env")
private_env = env.Clone()
private_env.Append(CPPPATH=target['includes']['private'])
private_env.Append(LIBS=libs)
private_env.Append(LIBPATH=submodules)
product = private_env.Program(target["binary_name"], target["sources"])
Но когда я пытаюсь скомпилировать программу Например, команды g cc содержат полный путь к скомпилированным артефактам вместо правильных пар -l / -L. Я проверил исходный код SCons и вообще это ожидаемое поведение. Этот список содержит вложенные списки объектов Node.FS.File (они опущены алгоритмом SCons 'ixes' Defaults.py::_concat_ixes)
Список артефактов Scons:
[[<SCons.Node.FS.File object at 0x2505630>],
[<SCons.Node.FS.File object at 0x250bfd0>],
[<SCons.Node.FS.File object at 0x250f800>],
[[<SCons.Node.FS.File object at 0x24f0060>],
[<SCons.Node.FS.File object at 0x24f2e70>],
[<SCons.Node.FS.File object at 0x2514420>],
[<SCons.Node.FS.File object at 0x25184a0>],
[<SCons.Node.FS.File object at 0x2518ac0>]],
[<SCons.Node.FS.File object at 0x251df30>],
[<SCons.Node.FS.File object at 0x2513950>],
[<SCons.Node.FS.File object at 0x24f26a0>]]
Пример команды g cc, сгенерированной scons:
arm-none-eabi-gcc -o build/src/fct.elf -lm build/libs/lib_one/libone.a ...
Примечание: пожалуйста, учтите, что lib "m" была добавлена в виде строки
Так что я, очевидно, могу разобрать этот список и извлечь файл имена и пути, но, может быть, я могу сделать это больше «Sconsy» (больше идиоматических c). Ребята, как правильно обращаться с подобной структурой?