Иерархическая, динамическая c и структура вложенных библиотек и SCons - PullRequest
0 голосов
/ 23 января 2020

У меня проблема с динамическим 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). Ребята, как правильно обращаться с подобной структурой?

...