Как заставить вывод Scons (exe, obj, lib & dll) в конкретный каталог сборки?
Я пытался получить scons для вывода exe, obj, lib и dll-файлов в определенный каталог сборки.
моя файловая структура выглядит так:
/projectdir
/build
/bin
/obj
/source
/subdirs
/..
SConstruct
в основном, то, что я получаю сейчас, - это мой исходный каталог, загрязненный файлами obj. Я бы предпочел, чтобы все это было в одном месте.
файл SConstruct выглядит следующим образом:
env.VariantDir('build', 'source', duplicate = 0)
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp'])
4 ответов
самый простой способ, который я нашел, - использовать 2 файла, файл SConstruct и отдельный SConscript.
в SConstruct вы просто вызываете другой файл и указываете каталог для вывода сборки:
# content SConstruct
SConscript('main.scons', variant_dir='build', duplicate=0)
затем в ' main.лепешки делают мясо твоего телосложения. Вы можете забыть о каталогах variant в этом файле.
# content of main.scons
env = Environment()
env.Program('Hierarchy',
source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp'])
Не так сложно заставить VariantDir работать, используя только один файл SConstruct (для небольшого проекта), но это очень запутанный, поскольку конфигурация отличается для случая использования одного файла и двух файлов.
Только SConstruct:
env = Environment()
env.VariantDir('build', 'src', duplicate=0)
files = Glob('build\*.c')
env.Program("build\program", files)
обратите внимание, как расположены исходные файлы в .\src
но .\build
указан в качестве места. Выход должен быть также "с префиксом" с .\build
в противном случае скомпилированная программа будет находиться в каталоге файл SConstruct.
при выполнении скрипта SCons скомпилирует *.c
файлы .\src
и поместите результирующие объекты в .\build
.
неудивительно, что они переименовали BuildDir в VariantDir, чтобы попытаться избежать путаницы (без особого успеха).
на VariantDir
(также описано в руководство пользователя) говорит scons поместить сгенерированные файлы в отдельный каталог. В более старых версиях scons эта функция называлась BuildDir
.
вы также можете прочитать об избежании дублирования исходного каталога (описано как в руководстве пользователя, так и в вики).
я использовал метод двух файлов, такой как ответ richq, но, хотя конечные продукты сборки (библиотеки, программы) шли в правильный каталог вариантов, объектные файлы все еще шли в исходный каталог.
решение оказалось для Глоб исходные файлы по относительному пути, а не абсолютные. Понятия не имею почему.
мой второй файл scons изначально выглядел так. Примечание globbing по абсолютному пути - когда я впервые написал это, я не понял путей будет автоматически относительно файла scons.
import os, inspect
env = Environment()
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True)
env.Program('Foo', source = src)
и это привело к *.obj заканчивается под src/ и программой под моим вариантом dir. Когда я изменил его на следующий, объектные файлы также пошли в вариант dir:
env = Environment()
src = Glob("src/*/*.c*", strings=True, source=True)
env.Program('Foo', source = src)
использование абсолютных путей, вероятно, является ошибкой noob - я относительно новичок как в scons, так и в Python, но я думал, что поделюсь ею, если у кого - то еще есть такая же неприятная проблема.