Как сделать правильно и возненавидеть. В общем решил я для одной странной задачи собрать LLVM с поддержкой AVR , только вот в чем незадача, скачать с github исходники скомпилировать их а затем засунуть в гигантский deb пакет без зависимостей я итак могу с помощью checkinstall.

В общем здесь будут общие заметки о том как я перекомпилировал пакет, немного изменив его.

Подготовка

Ищем что нам за пакет нужен

apt-file search /usr/bin/llc
llvm: /usr/bin/llc
llvm-3.9: /usr/bin/llc-3.9
llvm-4.0: /usr/bin/llc-4.0
llvm-5.0: /usr/bin/llc-5.0
llvm-6.0: /usr/bin/llc-6.0

cd llvmsrc/
apt-get source llvm-6.0

Итак у нас команда apt-get source выкачала кучу архивов и распакованная папку с исходниками, в отличии от реальной программы после компиляции наши исходники разобьют на 39 пакетов.

Незабываем установить все что нужно для сборки этого пакета. Первое это универсальные инструменты для сборки пакетов. Вторая команда apt-get build-dep установит необходимое конкретно для нашего пакета

sudo apt install devscripts
sudo apt-get build-dep llvm-6.0

Правка исходников

Теперь интересное, идем в папку с исходниками, все правила по сборке, лежат в файле debian/rules и я сначала его и редактировал, пару раз неправильно ,спутав

BINUTILS_GOLD_ARCHS := amd64 arm64 armhf avr i386 powerpcspe ppc64 ppc64el sparc sparc64 x32 s390x

Это поддерживаемые Debian архитектуры для которых собирают пакеты.

Правильно было отредактировать CMakelists.txt в корне исходников

# List of all targets to be built by default:
set(LLVM_ALL_TARGETS
  AVR
  AArch64
  AMDGPU
  ARM
  BPF
  Hexagon
  Lanai
  Mips
  MSP430
  NVPTX
  PowerPC
  Sparc
  SystemZ
  X86
  XCore
  )

Сборка пакета и ужасы которые следуют за этим

Дальше мы находясь в папке llvm-toolchain-6.0-6.0 запускаем утилиту для сборки.

debuild -us -uc -b 

Кстати если вдруг захотите посмотреть значения флагов, то надо смотреть документацию не для debuild, а для dpkg-buildpackage. Вот такой вот юниксвей.

Естественно такая громадина, компилируется около часа, естественно я сначала не там изменял исходники и все перекомпилировал.

DEB_BUILD_OPTIONS='parallel=4' debuild -us -uc -nc -b 

Значение переменной перед командой, не факт что это работает, такую уж разницу по времени я не заметил. Флаг -nc позволит неперекомпилировать опять 100500 исходников, а только то что изменилось. Но этот кривой пакет все равно ругался ,что man был создан и он не может создать этот каталог

rm -r debian/man/
debuild -us -nc -uc -b 
find -type f -iname llc
./debian/tmp/usr/lib/llvm-6.0/bin/llc --version

В общем я слышал что clang llvm модульные и все такое но по пакетам абсолютно неясно (надеюсь выясню) какие из собранных ставить и я поставил все

sudo dpkg -i *deb

И все вроде хорошо, но вылезала ошибка

trying to overwrite shared '/usr/share/doc/libllvm6.0/changelog.Debian.gz', which is different from other instances of package libllvm6.0:i386

sudo mv /usr/share/doc/libllvm6.0/changelog.Debian.gz /usr/share/doc/libllvm6.0/changelog.Debian.gz.backup

Ниже её правильное решение, вообще непонятно,а не то что сделано было мной, т.е. удалил все с с названием llvm clang а потом поставил собранные пакеты.(у меня же оказалось что драйвера и steam зависят от liblvm:i386), а там ещё X-ы отвалились. М — МОДУЛЬНОСТЬ.

Как проверить, по мимо простого способа llc –version, поставить libgcc-avr с библиотеками, взять файл с рабочим кодом и скормить его компилятору

clang-6.0 -c --target=avr -I /usr/lib/avr/include/ -mmcu=atmega16 -o dhltterm_atmega16.o /pmg/avr/dhltterm_atmega16.c

/usr/lib/avr/include/util/delay.h:112:3: warning: "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-W#warnings]
# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
 ^
/pmg/avr/dhltterm_atmega16.c:28:1: warning: unknown attribute 'externally_visible' ignored [-Wunknown-attributes]
ISR(USART_RXC_vect){
^
/usr/lib/avr/include/avr/interrupt.h:140:47: note: expanded from macro 'ISR'
 void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
 ^
/usr/lib/avr/include/avr/interrupt.h:129:30: note: expanded from macro '__INTR_ATTRS'
# define __INTR_ATTRS used, externally_visible
 ^
2 warnings generated.

Вот и все ребята! В комментах пишите получилось ли у Вас проделать сей фокус. Так как статья написана в далеком 2018, а у Вас там 2020 с летающими машинами и яблонями на марсе.