# Патчи под сборку kencc на Linux-хосте Все правки автоматически накладываются `scripts/build_arch.sh` и `build_al.sh` на свежие копии исходников (оригинальное дерево не трогается). Ниже — что и зачем. ## 1. `round` / `log2` → `p9round` / `p9log2` `cc/` определяет свои `round()` и `log2()`, конфликтующие по типу с прототипами из musl `math.h`. Переименовываем определения и вызовы во всех файлах (и в сгенерённом `y.tab.c`). Файлы: `cc/dcl.c`, `cc/pgen.c`, `cc/sub.c`, `cc/cc.h`, `Xc/swt.c`, `Xc/cgen.c`. ## 2. Порядок и единичность `#include "y.tab.h"` `y.tab.h` (генерит yacc) использует тип `Node`, объявленный в `cc.h`, и не имеет include-guard. Значит: включать строго ПОСЛЕ `cc.h` и ровно один раз (иначе конфликт переопределения `YYSTYPE`/`yylval`). В свежем `lex.c` порядок уже верный — правка нужна была только при ручной возне. ## 3. Плоская раскладка include Исходники ссылаются на соседние каталоги: `#include "../cc/cc.h"`, `"../6c/6.out.h"`, `"../8l/elf.h"`, extension-less `"compat"`, `"macbody"`, `"lexbody"`. Складываем всё в один каталог сборки и срезаем `../*/` из include. Extension-less файлы копируем явно. ## 4. `Runemask` Плановская libc-константа `Runemask` (маска 21-битной руны) есть в родной Plan9, но НЕ в plan9port. Добавляем `#define Runemask 0x1FFFFF` в `lex.c`. ## 5. Прототип `swcmp` → `const` `swcmp` — компаратор для `qsort`. У musl сигнатура `int(const void*, const void*)`, а плановский прототип в `gc.h` — `int(void*, void*)`. Приводим прототип к `const`. ## 6. `-fcommon` Старый код держит tentative-дефиниции глобалов (напр. `hintabsize` в нескольких `.c` через общий `gc.h`). Современный gcc по умолчанию `-fno-common` и ругается на multiple definition. Компилируем с `-fcommon` (как раньше). ## 7. `mysbrk`: `sbrk()` → `mmap()` ← ключевой Hunk-аллокатор kencc берёт память через `mysbrk` → `sbrk()`. На musl `sbrk()` возвращает `-1` (не поддерживается совместно с malloc), из-за чего `gethunk()` падал в «out of memory» → `exits`, причём диагностика уходила в неинициализированный Bio-буфер и терялась (компилятор молча выходил с кодом 1). Заменяем тело `mysbrk` на анонимный `mmap`. Без этого патча компиляторы линкуются, но не компилируют. ## 8. Дубликат `machcap` / `omachcap` `cc/omachcap.c` (старый machcap) и `Xc/machcap.c` (новый) оба определяют `machcap`. В родной сборке `omachcap.o` дремлет в архиве `cc.a` и не тянется. У нас — линкуем плоско, поэтому: если у арки есть свой `machcap.o` (6c/8c/qc) — выкидываем `omachcap.o`; если нет (5c/vc/kc) — `omachcap.o` и предоставляет `machcap`. ## 9. Плановские рантайм-файлы вон Файлы вроде `Xc/sys.c` тянут `#include "/sys/src/libc/9syscall/sys.h"` — это рантайм ОС, не часть компилятора, и в `OFILES` mkfile их нет. Выкидываем любые `.c` с include по абсолютному `/sys/...`. ## 10. Авторитетность `cc/` при конфликте имён (kc) У `kc` завалялся собственный устаревший `bits.c`, использующий уже вырезанный из plan9port форматный тип `Fconv`. Копируем `cc/`-файлы ПОСЛЕ арочных, чтобы общий `cc/bits.c` (новый fmt API) побеждал.