По бОльшей части IoT связан с разработкой под микроконтроллеры и энергоэфективные процессоры. На сегодняшний день в подавляющем большинстве это ARM архитектура (все распостранённые SoM).
Рассмотрим компиляция для SoM с linux на борту. Для компиляции потребуется компилятор ldc (взять можно тут).
Необходимо распаковать компилятор и выставить пути к его исполняемым файлам. Это можно сделать несколькими способами, например так:
- Создать в домашней директории папку
workspace/soft - Распаковать туда архив с ldc
- Перейти в директорию
workspace/softи создать символическую ссылкуln -s ldc2-1.8.0-beta1-linux-x86_64 ldc2-cur - Уже используя
ldc2-curсоздать символические ссылки на исполняемые файлы и файлы стандартной библиотеки для импорта (/usr/include/d/)
Такой подход подзволит обновлять ldc меняя только одну ссылку (ldc2-cur).
Т.к. ldc сам не умеет линковать, так же потребуется кросс-линковщик. Можно использовать набором утилит от gcc (rpm, deb).
Если проекта для кросс-компиляции пока нет можно проследовать инструкции и создать пустой.
Добавим скрипт armbuildrtlibs.sh:
#!/bin/bash
ARMLIBDIR=arm-lib
test -d $ARMLIBDIR || mkdir $ARMLIBDIR
CC=/usr/bin/arm-linux-gnueabihf-gcc ldc-build-runtime -j8 \
--dFlags="-mtriple=armv7l-linux-gnueabihf;-disable-inlining;-mcpu=cortex-a7" \
TARGET_SYSTEM="Linux;UNIX" BUILD_SHARED_LIBS=OFF && \
cp ldc-build-runtime.tmp/lib/* $ARMLIBDIR/ && \
echo "arm libraries copyed to $ARMLIBDIR dir"
Переменной CC должен быть присвоен путь к кросс-компилятору gcc.
Вспомогательный скрипт ldc-build-runtime поставляется вместе с ldc,
он упрощает сборку runtime'а под целевую платформу. --dFlags содержат
параметры сборки, включая информацию о целевой платформе. В -mtriple
первым идёт armv7l, что указывает набор 32-битных инструкций little
endian. gnueabihf указывает на бинарный интерфейс linux с аппаратной
поддержкой плавающей точки (hf -- hard float). -mcpu указывает на
конкретное семейство процессоров (RPi2). -disable-inlining -- принудительно
НЕ встраивать функции, что позволяет избежать некоторых специфичных ошибок.
Вызывать этот скрипт необходимо один раз в начале работы над проектом и
при обновлении ldc. Результирующие статические библиотеки кладутся в
папку arm-lib.
Добавим ещё один скрипт (armldc2):
#!/bin/bash
ldc2 -mtriple=armv7l-linux-gnueabihf -mcpu=cortex-a7 -disable-inlining -L-L./arm-lib/ -gcc=arm-linux-gnueabihf-gcc $@
Следует обратить внимание на параметры ldc: первая часть из них должна
совпадать с параметрами, с которыми собираются стандартная библиотека и
рантайм (-mtriple, -mcpu, -disable-inlining), флаг -L-L добавляет
путь поиска библиотек и нужно указать arm-lib т.к. именно в неё
копируются собранные armbuildrtlibs.sh библиотеки.
Копирование библиотек позволяет исключить из системы контроля версий
автоматически создаваемую папку ldc-build-runtime.tmp, при этом добавив
сами библиотеки.
Сборка под arm выполняется командой
dub build --compiler=./armldc2
Существует способ компиляции через указание конфигурации ldc через переменную
окружения DFLAGS, но такой способ не позволяет в dub.sdl указывать platform
для параметров сборки. Так же можно настроить ldc только на сборку под arm, но
это не особо практично, как мне кажется.
Если кто-то компилировал D из-под windows для rpi или bbb прошу поделиться опытом =)