How to port applications to KolibriOS/ru
Цель портирования состоит в переносе приложения из одной ОС в
другую, без переписывания большей части кода. Для портирования
требуется иметь исходники нужной программы.
Здесь я расскажу о процессе портирования приложений в Колибри на
примере SQLite - движка БД.
Критерии выбора приложения для портирования
Некоторые приложения портировать проще, чем другие. Поэтому из
приложений со сходными возможностями следует выбирать то,
которое портировать проще.
- Требуется, чтобы приложение было написано на языке, компилятор
которого для Колибри существует. Или же нужно перевести исходный
код на поддерживаемый язык. В общем, нет особых причин
предпочитать ЯВУ ассемблеру, или наоборот.
- Чем меньше функций ОС используется, тем лучше. Это объясняется
тем, что для каждой функции ОС, используемой приложением,
требуется найти или написать эквивалент в Колибри. В некоторых
случаях, впрочем, можно оставить вместо этого "затычку", которая
ничего не делает, так, например, я поступил с блокировкой файлов в
SQLite.
- Предпочтительнее выбирать изначально кроссплатформенные
приложения, т.к. в них уже предусмотрена возможность переноса. В
частности, все вызовы функций ОС часто сгруппированы и не
приходится их искать по всему тексту.
- Чем меньше объем исходников, тем лучше.
- Если исходники написаны в хорошем стиле, их гораздо проще читать
и редактировать. Чем меньше в коде всевозможных хитростей и
трюков, тем проще портировать приложение.
- Приложения, написанные в средах быстрой разработки, вроде Delphi,
переносить очень тяжело, т.к. код собственно приложения может быть
очень мал, однако код библиотек очень велик. Приложения, которые
используют API ОС, лучше.
- Иногда бывает полезно сократить возможности приложения, т.е.
портировать его часть, отбросив остальной код. Или же выбрать для
портирования раннюю версию программы, код которой меньше по
размеру и использует меньше внешних функций.
Определение внешних зависимостей
На этом этапе нужно написать список функций ОС (или функций
внешних библиотек, которые не были портированы в Колибри),
которые использует данная программа. Достаточно простой способ
это сделать, если программа написана на С - это удалить ссылки на h
-файлы (или спрятать от компилятора эти файлы), и посмотреть, на
что ругается компилятор.
Написание эквивалентов внешних функций
Для каждой функции, выявленной на этапе 2, требуется написать
"обертку" - функцию с теми же параметрами, но работающую в
Колибри.
Пример: приложение использует функцию malloc() стандартной
библиотеки С.
Пишем функцию:
void * malloc(int size) { __asm { mov eax, 68 mov ebx, 12 mov ecx, size int 0x40 } }
Эта функция выполняет динамическое выделение памяти, но уже в
Колибри. Соответственно все вызовы функции malloc() теперь будут
использовать системные вызовы Колибри и работать в этой ОС. Отдельного внимания заслуживают файлы, лежащие на SVN в kolibrios.org\programs\develop\ktcc\trunk\libc\ Там находятся реализации большого количества функций стандартной
библиотеки С. Есть еще menuetlibc для GNU C.
Некоторые замечания
- Для программ, которые активно используют стек, возможно,
потребуется увеличить значение в заголовке, устанавливающее
размер стека.
- Если есть возможность, следует использовать тот компилятор,
который рекомендуют авторы программы.