Как заставить вывод 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, но я думал, что поделюсь ею, если у кого - то еще есть такая же неприятная проблема.