Вопрос по python, c – Почему SCons VariantDir () не помещает вывод в данный каталог?

8

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

У меня есть простой проект с несколькими исходными файлами C в одной директории, и я хочу создать «нормальный» и «профильный» режимы - с двумя различными наборами опций для gcc. Я хочу, чтобы выходные данные помещались в каталоги normal / и profile / соответственно.

Для тестирования я сократил до одного исходного файла, t.c, который имеетmain() в этом. МойSConstructайл @ находится в том же каталоге и выглядит следующим образом:

normal = DefaultEnvironment(tools=['mingw'], CCFLAGS = '-O2')
normal.VariantDir('release', '.', duplicate=0)
normal.Program('t', ['t.c'])

#profile = normal.Clone(CCFLAGS='-O2 -pg', LINKFLAGS = '-pg')
#profile.VariantDir('profile', '.', duplicate=0)
#profile.Program('t', ['t.c'])

Когда я запускаю scons, я ожидаю, что он поместит t.o и t.exe в релиз /, но он поместит их в текущий каталог. И я не могу запустить его вообще с 3 строками профиля без комментариев - если я это сделаю, я получу эту ошибку:

scons: *** Для одной и той же цели были указаны две среды с разными действиями: t.o

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

(Я довольно много читал в документах и новостных группах, но ничего, что могло бы ответить на этот вопрос. Самое близкое, что я получил, этоэта страниц, которая описывает похожую вещь, но включает в себя отдельный каталог src / и два отдельных файла scons, а также импорт / экспорт переменных между ними. Это не кажется приятным.)

Ваш Ответ

3   ответа
8

VariantDir сбивает с толку. Хотя это не очень хорошо рекламируется, вы можете поместить и SConstruct, и SConscript в один и тот же каталог, используя текущий каталог в качестве исходного каталога

# SConstruct
SConscript('SConscript', build_dir='build', src='.')

а такж

# SConscript
Program('main.c')

Я никогда не находил способ избежать использования двух файлов, сохраняя здравомыслие, пытаясь понять вариант dir:)

8

ва:

# SConstruct
SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0)

Если вы хотите поместить двоичные файлы в каталог на два уровня ниже, сделайте это:

# SConstruct
SConscript('SConscript', variant_dir='build/release', src_dir='../..', duplicate=0)

В основном, предоставьтеsrc_dir параметр как путь от вашего каталога сборки до вашего исходного каталога.

3

http: //www.scons.org/wiki/VariantDir%28%2 сказал

Обратите внимание, что если вы не используете файл SConscript в подкаталоге src, вы должны указать, что программа должна быть собрана из файла build / hello.c, который SCons будет дублировать в подкаталоге сборки.

VariantDir('release','.',duplicate=0)
env=Environment()
env.Program('release/t',['release/t.c'])

когда я запускаю его сscons в Linux.

scons -u . 
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: release
gcc -o release/t.o -c t.c
gcc -o release/t release/t.o
scons: done building targets.

Полагаю, это будет работать и на Win32

Да, это единственный важный момент, когда не используется SConscript. Rafael Reiter

Похожие вопросы