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