Журнал ошибок, проявившихся при разработке проекта 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); более того, и компилятор в это время не должен работать


  1. Получилось нечто вроде, кхм, компромата... :) (1)

  2. Пока качеством зависимостей доволен (за исключением ffmpeg/libav!), хотя, конечно же, хотелось вообще без сюрпризов. (2)

Get_Involved/Bug_Journal (последним исправлял(а) anonymous 2012-10-04 13:28:56)