scons, -u и псевдонимы

Вот минимальные шаги воспроизведения для проблемы, над которой я экспериментирую.

Допустим, у меня есть следующие SConscripts и SConsctruct:

# / SConstruct:

SConscript( "SConscript", variant_dir="build" )

# / SConscript:

SConscript( "lib1/SConscript" )
SConscript( "lib2/SConscript" )

# / Lib1 / SConscript:

Alias( "lib", SharedLibrary( "lib1", "codeLib1.cpp" ) )

# / Lib2/SConscript:

Alias( "lib", SharedLibrary( "lib2", "codeLib2.cpp" ) )

В руководстве по scons указано, что при вызове scons -u будут создаваться только указанные цели, найденные в текущем каталоге и под ним.

Это означает, что вызов

scons -u lib

Внутри каталога #/lib1 будет создана цель "lib" (мой псевдоним в этом сценарии) в lib1 и всех ее зависимостях.

Из того, что я понимаю, "scons -u lib" будет создавать цель "lib" только в том случае, если в текущей папке есть одна цель с именем lib (псевдоним в нашем случае). Если бы я попросил целевые "тесты", которые существовали бы в другом месте (скажем, в корне проекта), они бы не были скомпилированы.

Похоже, алгоритм использует scons:

  • Прочитать все SConscript и построить дерево зависимостей
  • Посмотрите, существует ли запрошенная цель командной строки ("lib") в текущем каталоге или под ним ( "-u")
  • Если его не существует, ничего не делай
  • Если это так, скомпилируйте все зависимости этой цели.

К сожалению, "lib" зависит от lib1 и lib2, и scons приступает к их компиляции. Я надеялся, что поскольку lib2 не был под lib1, он не был бы добавлен в сборку.

Одним из решений было бы иметь библиотеки, каждый из которых имеет свои собственные псевдонимы с суффиксом lib, но тогда систему будет сложнее использовать. Другой способ - проверить, откуда создается псевдоним (заменив метод Alias ​​в среде на мой собственный, использующий глобальный вызов call_stack, чтобы узнать, из какого SConscript я вызываю Alias, и создавать или нет в зависимости от местоположения. SConscript) и вернуть вновь созданный псевдоним или объект как есть.

Я бы не стал возиться с этим, поэтому мне было интересно, пропустил ли я что-то или нет.

Поблагодарить

1 ответ

Если вы хотите, чтобы lib1 и lib2 обрабатывались по-разному с помощью функции Alias ​​(), вам нужно назначить разные псевдонимы для каждого из них, например, так:

/ Lib1 / SConscript:

Alias( "lib1", SharedLibrary( "lib1", "codeLib1.cpp" ) )

/ Lib2/SConscript:

Alias( "lib2", SharedLibrary( "lib2", "codeLib2.cpp" ) )

Если вы назначите одно и то же имя псевдонима для обеих целей, то вы добавите обе цели к одному и тому же имени псевдонима, и они будут скомпилированы / оценены (рассмотрены для компиляции) при компиляции этой цели псевдонима.

Если вы хотите скомпилировать только то, что находится в определенном каталоге, вы сможете сделать следующее:

# cd lib1
# scons .

Или вы можете указать путь для компиляции, предполагая, что вы находитесь в корневом каталоге проекта:

# scons ./lib1
Другие вопросы по тегам