Вывод SCons в директорию сборки

Я пытаюсь изменить мои файлы SCons, чтобы они помещали сгенерированные файлы в каталог сборки. Изначально я думал, что вариант VariantDir мог бы быть вариантом, но, судя по всему, что я прочитал и из примеров, он не выполняет то, что я хочу.

Есть ли простой способ заставить SCons поместить вывод в определенный каталог без необходимости переписывать все исходные тексты и сценарии?

4 ответа

Поработав с VariantDir некоторое время (он ничего не делал вообще), я в итоге использовал variant_dir параметр в вызове верхнего уровня SConscript, который приводит к тому, что все последующие выходные результаты сборки оказываются в параллельном дереве "сборки":SConscript(['subdirs/SConscript'], variant_dir='build', duplicate=0)Моя структура сборки представляет собой иерархию SC-сценариев в подкаталогах / под-подкаталогах и т. Д. При этом вызове выходные данные заканчиваются в сборке / под-подкаталогах того же уровня, что и в источнике.

Это съедает один уровень, хотя (подкаталоги), и использование "../build" не помогает. Решение состоит в том, чтобы иметь файл SConscript на том же уровне, что и SConstruct, и вызывать SConscript(['SConscript'], variant_dir='build', duplicate=0)

См. Также вывод Force Scons (exe, obj, lib & dll) в конкретный каталог сборки - он имеет аналогичный ответ

С помощью VariantDir с duplicate=0 должно сработать.

Столкнувшись с подобным разочарованием, я добавил site_scons, который добавил заменяющие компоновщики (например, "Exe" вместо "Program") и указал эмиттер для этого компоновщика, который заменил часть пути каталогом компоновки. Это требует использования альтернативного компоновщика в ваших скриптах SC.

В качестве альтернативы вы можете попытаться создать подкласс Environment и переписать основные цели, чтобы использовать перезаписи целей. Затем вы указываете свою среду по умолчанию (изменяя Scons.Script.DefaultEnvironment или что-то в этом роде). Этот подход сохранял статичность SConscripts, но становился очень грязным и требовал большего обслуживания с течением времени, так как внутренности scons меняются.

Вы можете использовать Install или InstallAs на выходных данных. Меня устраивает.

lib = env.SharedLibrary(target = "some_target", source = sources);
env.InstallAs( target = "folder/output_name.ext", source = lib );
Другие вопросы по тегам