четверг, 22 мая 2014 г.

Dev: Cобираем kernel для RPi на OS X

В процессе подготовки Raspberry Pi к роли процессора для Атмосвета (дабы заменить ею связку HTCP + Arduino), мне понадобилось пересобрать ядро.
Дело в том, что мой EasyCAP использует  чипсет USBTV007, и чтобы это заработало мне нужнен kernel 3.13+ с модулем usbtv.

Если собирать ядро на RPi, то нужно место(у меня папка с исходниками и результатом компиляции весит 2.11Гб)  и много времени(это где-то 10-20 часов, против 10-15 минут на Macbook Pro)

Сам процесс сборки ядра на OS X вполне подробно расписан тут. НО, там отсутствую несколько часто возникающих подводных камней, для одного из которых нет решения в гугле. Теоритически это поможет не только для сборки kernel для RPi, но и для любой другой платформы.


В качестве основы я использовал сборку minibian, т.к. в сборке официальной просто тонна не нужного мусора. проще доставить, что нужно чем вычищать.

1. В случае, если необходимо добавить дополнительные заголовочные файлы в /usr/include может оказаться, что такой директории вовсе нет, решение - переставить Xcode:

2. Исходники ядра 3.14+ я брал так:

 git clone -b rpi-3.14.y --single-branch https://github.com/raspberrypi/linux  

3. После конфигурации (берем PRi .config и дополняем его через oldconfig, и потом включаем дополнительные нужные нам компоненты), если сразу запустить билд то на компиляции может вывалиться ошибка (вообще ошибся я тем что случайно включил raid6 в ядро для RPi, оно мне там нафиг не нужно, но для какого-нибудь другого устройства может понадобиться):

  UNROLL lib/raid6/int1.c
 awk: can't open file -vN=1
  source line number 1 source file -vN=1
  context is
       >>> <<<  
  CC [M] lib/raid6/int1.o
 arm-none-eabi-gcc: ошибка: lib/raid6/int1.c: No such file or directory
 arm-none-eabi-gcc: фатальная ошибка: не заданы входные файлы

Фиксится правкой файла lib/raid6/Makefile строки 14,15(Добавляем проблемы после -v, -N и меняем порядок, на OS X awk чувствителен):

    cmd_unroll = $(AWK) -v N=$(UNROLL) -f $(srctree)/$(src)/unroll.awk \  
           < $< > $@ || ( rm -f $@ && exit 1 )  


4. После этого мы можем запускать make, но make modules выпадет ошибка:

 Building modules, stage 2.  
 xargs: illegal option -- r  

Чтобы исправить, мы должны избавиться от использования -r флага в xargs, которы йне поддерживается в BSD версии этой утилиты.
В файле scripts/Makefile.modpost необходимо исправить 63 строку на:

 MODLISTCMD := find $(MODVERDIR) -name '*.mod' | grep . | xargs grep -h '\.ko$$' | sort -u  

Конструкция
... | xargs -r ...
заменяется на идентичную по результату конструкцию
... | grep . | xargs ...

5. Теперь мы можем сделать make modules и modules_install

И на последок, после переноса собранного ядра и модулей на RPi мне также было необходимо запустить команду depmod, для генерации списка зависимостей, в противном случае modprobe будет выдавать ошибку, что modules.dep.bin не найден при попытке подключить какой либо модуль.

Комментариев нет:

Отправить комментарий