Как заставить вывод Scons (exe, obj, lib & dll) в определенный каталог сборки? - PullRequest
12 голосов
/ 15 сентября 2010

Я пытался заставить 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 ]

10 голосов
/ 16 сентября 2010

Самый простой способ, который я нашел, это использовать 2 файла, файл SConstruct и отдельный SConscript.

В SConstruct вы просто вызываете другой файл и указываете каталог для вывода сборки:

# content SConstruct
SConscript('main.scons', variant_dir='build', duplicate=0)

Затем в 'main.scons' вы делаете основную часть вашей сборки. Вы можете забыть о различных каталогах в этом файле.

# content of main.scons
env = Environment()
env.Program('Hierarchy',
            source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp'])
8 голосов
/ 13 июля 2011

Не так сложно заставить 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, чтобы избежать путаницы (без особого успеха).

3 голосов
/ 15 сентября 2010

VariantDir (также описанный в руководстве пользователя ) указывает scons помещать сгенерированные файлы в отдельный каталог.В более старых версиях scons эта функция называлась BuildDir.

Вы также можете прочитать о том, как избежать дублирования исходного каталога (описано как в руководстве пользователя, так и в вики).

1 голос
/ 31 июля 2015

Я использовал двухфайловый метод, такой как ответ richq, но, хотя конечные продукты сборки (библиотеки, программы) собирались в правильном каталоге вариантов, объектные файлы все еще шли в исходный каталог.

Оказалось, что решение заключается в добавлении исходных файлов по относительному пути, а не по абсолютному. Понятия не имею почему.

Мой второй файл scons изначально выглядел так. Обратите внимание, что глобализация происходит по абсолютному пути - когда я впервые написала это, я не знала, что пути будут автоматически относиться к файлу 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)

Использование абсолютных путей, вероятно, является ошибкой нуба - я относительно новичок как в scons, так и в Python - но я подумал, что поделюсь этим на случай, если у кого-то возникнет такая же неприятная проблема.

...