Журнал ошибок, проявившихся при разработке проекта Bombono DVD
Pазработка современного ПО построена по модульному принципу. Так, Bombono DVD использует такие проекты, как Boost, Gtk, SCons и другие (всего 10 явных зависимостей, есть и неявные). Однако помимо преимуществ наследуются недостатки и ошибки, включая будущие. С некотого момента я решил завести журнал заметок, в который записываю технические проблемы, проявившиеся в ходе разработки, которые зависели/зависят не от меня (но решать-то все равно пришлось).
Смысл в том, чтоб на основе полученных данных более объективно подходить к выбору с кем "дружить", а с кем не "дружить".1 Критерием попадания в список являются все случаи, когда ошибка/поведение/смена API/ABI/... проявилась или добавилась уже после того, когда соответствующий функционал уже прочно задействован в проекте.2
Список
SCons: - с версии 2.0.1 стал вылетать при работе нелатинскими названиями файлов - несколько раз менял свое поведение до версии 1.2.0; однако благодаря природе Python выходы находились. - INSTALLSTR, начиная с версии 1.0 может принимать только строковые значения (не функции) - явная ошибка. - расчет md5 путем чтения содержимого файла в строку; при гигабайтовом файле валился авторинг GraphicsMagick: - отсутствие функции OpenCache() в новых версиях сильно попортило нервы; к тому сложности в узнавании какая версия GM используется бесит. Дистрибутивы: - замена toolame -> twolame не дает возможности сделать одну версию для всех дистров. - убрали /proc/scsi/devices из Debian Sid, пришлось изучать исходники ядра. (2 дня потратил). Gtk: - диалог-помощник мой поломали (в Karmic, Sid) - 2 места - синхронизацию ломали (в Hardy) между текущей вкладкой и текущим пунктом в меню Go. - GtkButton - чего-то поменяли в стилях по умолчанию и значки на них перестали показываться - GtkAssistant: - убрали возможность устанавливать страницу до show_all() - поменяли порядок OnApply и OnPrepare (делать что ли нечего!) - GtkDialog - провозился целый день с открытием диалога, если в нем есть метка со ссылкой (бесконечный цикл) - GtkFileChooser (c gtk >= 2.30.0): - выпадение из-за неправильного мониторинга - set_filename() не работает в паре c get_filename() для SELECT_FOLDER GCC: - ужесточили препроцессор так, что код Boost (1.33) перестал компилиться (починил) Winff: - неправильно генерит видео для DVD (опция -target *-dvd должна быть всегда) Totem: - с версии 2.27.1 авторы перестали поддерживать xine backend. FFmpeg: - c версии 0.6 опция -formats разбита на 2, -formats и -codecs - c версии 0.6 поменяли принцип отображения потоков (спасает опция -map) - в будущей 0.7 убрали -padX, а вместо нее — -vf pad=w:h:x:y:black ; само по себе не страшно, но учитывая, что в Packman/openSUSE, например, используют нестабильную версию, то так и хочется взять и ... - в ffmpeg/libav >= 0.7 поменяли имена функций, включая dump_format->av_dump_format, av_open_input_file->avformat_open_input и т.д., смысл ошибочных кодов (ушел AVERROR_NOFMT) - в версиях libavcodec 53.4.x-53.9.x есть ошибка, портящая размеры для h.264, в процессе вызова avcodec_open() (попало в Ubuntu Oneiric); хочется взять и наказать автора патча - прямой доступ, в частности, к ff_codec_bmp_tags закрыт => линковка не производится; узнать имя проблемного кодека стало сложнее - сюрпризы libav 0.8: - качество кодирования сломали в libav 0.8 => сломали в ffmpeg 0.9, но в ffmpeg 0.10 уже исправлено - libav завел свой конвертор, avconv (ffmpeg теперь там только для виду) - поменяли параметр -ab => -b:a - -newaudio убрали, теперь все делается через параметр -map - в ffmpeg заменили точку в выводе "Stream #0.1: Audio" на ":", теперь "Stream #0:1: Audio" (мелочь, а неприятно) - закрыли доступ к ffurl_register_protocol() (политика) MS Windows: - GetStdHandle(STD_OUTPUT_HANDLE) возвращает мусор под XP и 2000, если процесс не присоединен к консоли (но практически всегда этим мусором оказывается "магическое" значение 0x00010001); в документации же (http://msdn.microsoft.com/en-us/library/ms683231) утверждается, что будет возвращен нуль; в 7-ке поведение поправили (стало так, как описано в документации) - в 7-ке системные вызовы kernel32.dll реализованы в kernelbase.dll, и вызов реально идет так: GetStdHandle()->kernel32.dll->api-ms-win-core-processenvironment-l1-1-0.dll(чистая прокся!) ->kernelbase.dll. Смысл усложнять все это - разве что для тех, кто реально хочет знать, что происходит, но не имеет доступа к исходникам. Aх да, ставить "палки в колеса" программистам - любимое занятие Microsoft'а же! - в одной весьма популярной операционке сигналы есть только для вида; пользоваться ими практически невозможно, и вот почему: - послать из одного процесса в другой можно только 2 сигнала, SIGINT(Ctrl-C) и SIGBREAK(Ctrl-Break), все остальные работают только внутри одного процесса - это будет работать, только если оба процесса присоединены к одной и той же (!) консоли - целенаправленная посылка сигнала работает только для SIGBREAK (GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)), и только если процесс, которому посылают сигнал, был создан с флагом CREATE_NEW_PROCESS_GROUP; в ином случае сигнал пошлется всем процессам, присоединенных к консоли (включая того, кто посылал) Вывод: какую-либо инфу лучше передавать по-другому, например, с помощью именованных труб (CreateNamedPipe()) - почему стандартная библиотека C++ от MSVC не гут: - std::streamoff 32-битный, потому работать с файлами >= 2GB затруднительно (исправлено только в vs2010) - стандартная библиотека собрана без флага (компилятора) /vd2; последний нужен для полноценной поддержки С++ в компиляторе, и, если он используется (что, вроде как, естественно), то линковать код с MSVC STL нельзя (теряется бинарная совместимость, будут неисправимые ошибки, например, при использовании iostreams) Вывод: STLPort - для паралелльной компиляции есть ключ /MP, но линковщик от MS можно запускать только один (он требует эксклюзивный доступ к PDB); более того, и компилятор в это время не должен работать