Кросс-компиляция Common Lisp для Windows из Linux стала одной из востребованных задач среди разработчиков, стремящихся создавать кроссплатформенные приложения с использованием мощных возможностей Lisp-языка. Процесс кросс-компиляции, который ранее считался сложным и требующим множества настроек, сегодня значительно упростился благодаря современным инструментам и грамотному подходу к интеграции Windows-окружения в Linux. В первую очередь стоит разобраться, что собой представляет кросс-компиляция и почему она так важна для разработчиков на Common Lisp. Кросс-компиляция — это процесс компиляции исходного кода одного языка программирования на одной платформе с целью получения исполняемого файла, который будет функционировать на другой платформе. Например, компиляция Lisp-программы на Linux для последующего запуска на Windows.
Такой подход позволяет сэкономить время и ресурсы, не прибегая к работе на целевой системе напрямую. Одним из важных этапов при подготовке среды для кросс-компиляции является настройка компилятора C для Windows под Linux. В частности, необходимо установить набор инструментов mingw-w64, который представляет собой кросс-компилятор позволяющий собирать исполняемые файлы с архитектурой Windows из Linux-среды. На популярных дистрибутивах Linux, таких как Arch Linux, это достигается простой командой установки соответствующего пакета. После настройки компилятора можно приступать к сборке C-библиотек, которые часто используются в связке с Lisp, например, таких как Raylib — кроссплатформенный графический фреймворк.
Для успешной компиляции необходимо изменить параметры Makefile проекта, указав целевую операционную систему как Windows и выбрав тип библиотеки DLL. Компиляция с помощью mingw-w64 позволяет получить нужные .dll-файлы, которые будут использоваться в дальнейшем для вызова из Lisp-приложений. После успешного получения необходимых динамических библиотек стоит обратить внимание на установку самого сборщика Common Lisp — Steel Bank Common Lisp (SBCL) в Windows-окружении посредством Wine. Wine позволяет запускать Windows-программы в Linux, предоставляя возможность использовать нативный Windows-исполнитель Lisp без необходимости работать с эмуляторами или виртуальными машинами.
Процесс установки SBCL под Wine сводится лишь к загрузке MSI установочного файла с официального сайта и запуску его средствами Wine. После этого в домашнем каталоге пользователя появится привычная Windows-структура с установленным SBCL. Проверить корректную работу можно запустив sbcl.exe через Wine и изучив внутренние переменные среды, которые должны отражать Windows-среду, в частности особые флаги вроде :WIN32 в списке активных «фич». Для удобного взаимодействия с Windows-версией SBCL из Linux-редактора, такого как Emacs, комфортно использовать менеджер зависимостей vend.
Его особенность – возможность запускать Lisp-интерпретаторы с произвольной командной строки, в том числе через Wine. Это позволяет интегрировать Windows-SBCL в обычную рабочую среду Linux, обеспечивая комфортный интерактивный режим разработки и отладки. Подобное решение существенно повышает продуктивность и устраняет необходимость покидать знакомые инструменты при разработке под Windows. Важным аспектом является корректная работа с путями и файлами. У Windows и Linux разные системы файлов и правила работы с путями, но благодаря особенностям реализации pathname в SBCL и возможности монтирования Linux-системы в Wine как диска Z: доступ к каталогам и файлам становится прозрачным и почти безболезненным для разработчика.
Это дополнительно упрощает запуск и разработку в едином окружении. Особое внимание заслуживает работа с динамическими библиотеками в формате DLL непосредственно из Lisp. При помощи специальных функций загрузки динамических объектов можно подключать DLL к текущему Lisp-образу, что освещается на примере загрузки файлов с названием lisp-raylib.dll и его «shim»-файла. Возможность динамической загрузки расширений делает Lisp-программы гибкими, позволяя использовать производительный код на Си, реализовывать графический интерфейс и многое другое.
Для создания готового исполняемого файла Windows (.exe) из Common Lisp-программы используется стандартный вызов sb-ext:save-lisp-and-die. Запуск sbcl с загрузкой специального build-скрипта формирует исполняемый файл с заданной точкой входа и необходимыми настройками. При сборке важно не забывать про передачу нужных параметров, таких как размер динамической памяти и опции сжатия. Поскольку для платформы Windows не реализована поддержка сжатия Lisp Core, размер итогового исполняемого файла может быть значительно больше, чем на Linux, но это вполне приемлемая цена за кроссплатформенную совместимость и удобство распространения.