Исправление модуля CRT в исходных файлах компилятора.
На всех ОС, кроме Windows, компилятор FreePascal предоставляет в модуле CRT (используется для написания полноэкранных программ) такие глобальные константы, как ScreenWidth и ScreenHeight. Они отвечают за ширину и высоту консоли соответственно. Поэтому если, допустим, на Linux’е программа спокойно пройдёт этап компиляции, то при переносе на Windows будут выходить ошибки. Здесь будет описана инструкция по устранению этой проблемы.
Итак, чтобы компилятор знал об этих переменных, их нужно внести в исходный файл модуля CRT. Однако самим разбираться во всём этом – было бы довольно долго. К счатью, во время поиска решения проблемы, был найден патч, который как раз добавляет нужные строки в файл.
Собирать библиотку буду на Linux’е, но при желании это можно сделать и из Windows. При этом необходимо уже иметь установленный компилятор, который будет использоваться при сборке.
Скачиваем исходные файлы компилятора:
git clone https://github.com/fpc/FPCSource
Теперь нужно скачать патч. Он находится по ссылке: ссылка на патч. На этой странице будет прикреплён файл wincrtscrsize.diff. Скачиваем его.
Затем надо применить патч. Для этого перемещаем файл wincrtscrsize.diff в
директорию по пути: /home/%name%/%builds/source/packages/rtl-console/src/win/
,
где %name – имя Вашей домашней директории, %builds%/ – директория, где
расположены исходные файлы компилятора. Применяем патч командой:
patch crt.pp < wincrtscrsize.diff
Теперь можно собрать компилятор. Но перед этим нужно сконфигурировать Makefile. Для Windows 32-bit это можно сделать так:
fpcmake -Ti386-win32 -v
make clean all Crossinstall OS_TARGET=win32 CPU_TARGET=i386 NOGDB=1
После выполнения этих команд в директории source/compiler будет ppc386.exe – это и будет исполняемый файл компилятора.
В Windows должен быть установлен компилятор с модулем CRT без ScreenHeight и
ScreenWidth, который как раз мешает нам собирать программы. Получив новый
собранный компилятор, заменяем исходный. Лично я перещал файл ppc386.exe из
Linux’a в виртуальную машину с Windows 7. Там нужно найти директорию
C:\FPC\3.2.2\bin\i386-win32
(по умолчанию для версии 3.2.2) и сделать замену.
Также заменяем, собственно, сам модуль CRT.
Из source/packages/rtl-console/units/i386-win32
в
C:\FPC\3.2.2\units\i386-win32\rtl-console
И дополнительно ещё заменить модули: sysinitpas.o, sysinitpas.ppu, fpintres.o,
fpintres.ppu, objpas.o, objpas.ppu, system.o, system.ppu, windows.o,
windows.ppu. Из source/rtl/units/i386-win32
в C:\FPC\3.2.2\units\i386-win32\rtl
После всех проделанных шагов можно компилировать программу на Windows.
Как видно, все проходит успешно.
Надеюсь, что эти советы помогут тем, кто хочет перенести pascal программу на Windows платформу со всеми возможностями модуля CRT.