[scons] установка двух разных версий собираемой либы
tfx:~/tmp/scons-install$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o goodbye.o -c -g goodbye.c
gcc -o goodbye goodbye.o
Install file: "goodbye" as "bin/goodbye_debug"
gcc -o hello.o -c -g hello.c
gcc -o hello hello.o
Install file: "hello" as "bin/hello_debug"
scons: done building targets.
tfx:~/tmp/scons-install$ scons --release
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o goodbye.o -c -O2 goodbye.c
gcc -o goodbye goodbye.o
Install file: "goodbye" as "bin/goodbye_release"
gcc -o hello.o -c -O2 hello.c
gcc -o hello hello.o
Install file: "hello" as "bin/hello_release"
scons: done building targets.
tfx:~/tmp/scons-install$ cat SConstruct
AddOption('--release', action='store_true', help='Build release version of everything.')
env = Environment
if GetOption('release'):
env.Append(CFLAGS=['-O2'])
env.Append(CXXFLAGS=['-O2'])
suffix = 'release'
else:
env.Append(CFLAGS=['-g'])
env.Append(CXXFLAGS=['-g'])
suffix = 'debug'
hello = env.Program('hello.c')
goodbye = env.Program('goodbye.c')
env.InstallAs('/home//tmp/scons-install/bin/hello_' + suffix, hello)
env.InstallAs('/home//tmp/scons-install/bin/goodbye_' + suffix, goodbye)
tfx:~/tmp/scons-install$ scons -v
SCons by Steven Knight et al.:
script: v1.2.0.r3842, 2008/12/20 22:59:52, by scons on scons-dev
engine: v1.2.0.r3842, 2008/12/20 22:59:52, by scons on scons-dev
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
только вот, насколько я понимаю, он несколько противоречит философии scons, которая заключается в том, чтобы все варианты сборки описать в scons, а настраивать какой собирать - из консоли. причём по-умолчанию должно собираться всё. В приведённом же примере собрать одновременно оба варианта сборки точно не получится. придётся последовательно выполнять scons && scons --release ну и т.п.
К тому же в этом варианте не совсем понятно, как сделать так, чтобы одна сборка зависела от другой (то есть, к примеру, я могу собрать релиз сборку только тогда, когда у меня уже есть дебаг сборка) - с точки зрения scons существует только одна сборка, параметры которой меняются в зависимости от опций, заданных в консоле. мне такой вариант не подходит
Зависимости билдов друг от друга можешь ручками с помощью Depends прописать.
Но ИМХО тебе уже начинает странного хотеться. :-)
это не я такой, это сборка такая.. если в двух словах, то мне надо сделать примерно следующий последовательность:
1) собрать библиотеку core в особом режиме сборки NOMSG
2) собрать приложение msg, используя core, в особом режиме сборки NOMSG
3) собрать два файла используя свой собственный билдер на основе msg
4) собрать библиотеку core и приложение msg в режимах debug/release
5) (опционально) заинсталлить и либу, и приложение
на сколько я понял, если ему сделать что-то типа
InstallAs('/usr/lib/libsome_debug.so' , 'debug/libsome.so')
InstallAs('/usr/lib/libsome_release.so' , 'release/libsome.so')
то для него будет существовать только последний инсталл, то есть инсталлировать он будет только релиз. и если пробовать вызывать scons /usr/lib , то он будет пытаться установить только релиз
к тому же. если install делать в том SConscript, который вызывается при билде в VariantDir, то я не знаю, как передать таргет именно ему. то есть при вызове рутового scons можно указать ему таргет типа нужного варианта сборки (VariantDir а вот если каждый вариант сборки делает свой Install, то как указать, что нужно делать только инсталл только нужного варианта сборки - по-моему такого в scons сделать нельзя.
не могу почувствовать разницу между VriantDir и BuildDirГугл говорит, что второе - deprecated вариант первого. Мог бы и сам глянуть.
то он будет пытаться установить только релиз
tfx:~/tmp$ scons /home//lib
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Install file: "debug/lib_debug.so" as "/home//lib/lib_debug.so"
Install file: "release/lib_release.so" as "/home//lib/lib_result.so"
scons: done building targets.
tfx:~/tmp$ cat SConstruct
InstallAs('/home//lib/lib_debug.so', 'debug/lib_debug.so')
InstallAs('/home//lib/lib_result.so', 'release/lib_release.so')
а вот если каждый вариант сборки делает свой Install, то как указать, что нужно делать только инсталл только нужного варианта сборки - по-моему такого в scons сделать нельзя.В Scons можно всё. Он алгоритмически полный, чем он меня и привлёк, когда я выбирал средство сборки для проекта. :-) В данном случае можно тупо добавить опцию вроде --install-version=[debug|release|both], в зависимости от которой будут или не будут создаваться правила install-а для различных вариантов сборки.
Оставить комментарий
oleg1331
Пусть исходники проекта лежат в ./src . Делается несколько вариантов сборки (библиотеки .so) в ./dist/debug и ./dist/releaseКаким образом можно организовать установку обоих вариантов с разными суффиксами? например в /usr/lib/libsome_release.so и /usr/libsome_debug.so ?
Я пробовал двумя способами:
1) в ./SConscript экспортируем переменную libsuffix, в которую записываем '_debug' или '_release' соответственно. в ./src/SConscript после того, как сделаем target = env.SharedObject добавляем env.InstallAs('/usr/lib/libsome' + libsuffix + '.so', target). Но такой способ не работает - scons при этом распознаёт только тот install, который ему встречается последний. То есть каждый следующий вызов InstallAs заменяет предыдущий в том случае, если папки, куда происходит инсталляция ('/usr/lib' в нашем случае) совпадают. Я так понимаю, это происходит из-за того, что данная папка является "целью" сборки.
2) пробовал сделать InstallAs прям из рутового ./SConscript, но в этом случае scons пишет ворнинги о том, что окружение того, что я собираюсь инсталлировать не совпадает с тем окружением, в котором либа собиралась (Environment). С чего он вдруг на это смотрит, если я просто указываю файл который просто по чистому совпадению является так же целью какой-то сборки.
Может быть это решается какими-то стандартными средствами, я просто их не смог найти?