14 декабря 2011

Как я CMake на SCons променял

Привет. Когда я начинал Tank Of Destiny я решил что буду использовать CMake. Тогда мне казалось что все что нужно он умеет, но когда мне понадобилось чуть больше, начались трудности. Я конечно попытался их решить, и честно убил на это пол дня.

В CMake почему-то решили что работать с pkg-config из коробки, это лишнее. Я не знаю как можно пренебречь такой классной программой, но есть модуль FindPkgConfig результат работы которого куча магических переменных, половину которых нельзя использовать в стандартных командах CMake. Наверняка это проблему можно решить, CMake хорошая система автоматизации сборки, но я выбираю SCons потому что он оказался для меня гораздо удобнее.

Что же такого крутого в SCons? Для меня это ParseConfig которому можно скормить pkg-config и все будет круто. Причем в ParseConfig можно передать простой набор флагов и все будет круто.

Типичное использование ParseConfig:

env = DefaultEnvironment()
env.ParseConfig('pkg-config --cflags --libs gl glu sdl')

Еще одна на мой взгляд нужная для системы автоматизированной сборки фича, это умения хранить переменные окружения в файле. Что бы было понятнее что за ерунду я сказал, проиллюстрирую.

name = "exec_file"
if env['debug']:
    env.AppendUnique(CCFLAGS=["-O0", "-g"])
    name += "_debug"
else:
  env.AppendUnique(CCFLAGS=["-O2"], CPPDEFINES=["-DNDEBUG"])

Речь пойдет о том, как запомнить что я велел SCons собрать мне версию для отладки не указывая постоянно это в виде аргумента при сборке.

Для этого существует Variables:

vars = Variables('build.conf')
vars.AddVariables(BoolVariable('debug', 'compile for debuging', 'no'))
vars.Update(env)
vars.Save('build.conf', env)

В итоге вызвав один раз scons debug=yes или scons debug=y, мы всегда будем собирать отладочную версию программы при вызове scons.

В build.conf будете храниться вот такой вот текст:

debug = True

Мелочь, а приятно.


Полезное: