Мне как ни разу не сишнику обычно чужды все эти вещи, но как повелось с этой дровиной - приходится разбираться со всяким.
На этот раз получив убитые иксы и обломный дкмс решил разбираться по месту, в tty.
Анамнез следующий - в логе о неудачном dkms (сборке модуля под текущее ядро) получил ругань на константу
:#define UTS_UBUNTU_RELEASE_ABI 040980
с текстом о том, что девятка - плохая цифра (
invalid digit 9 in octal constant
), и собираться с в таком виде он не планирует, можно не упрашивать.
Беглым гуглением выянилось, что компилятор воспринимает числа начинающиеся с нуля в восмеричной системе, куда восьмерки и девятки уже не попадают. Казус ситуации в том, что от девятки в ядре 4.9 не избавиться никак, а выбираемая строка c нулем 040980 - нормальная практика нейминга
всех убунтовых ядер
Код: Выделить всё
chocobo@desktop ~ $ uname -r
4.9.80-040980-generic
Можно конечно и ядро пересобрать с нужным именем, но уж больно много мороки получится ради каталиста, учитывая что обновляется оно каждые несколько дней.
Нахрапом решил влезть в код драйвера, и в
./kcl_acpi.c
нашлась следующая конструкция
Код: Выделить всё
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
#include <generated/utsrelease.h>
#ifndef UTS_UBUNTU_RELEASE_ABI
#define UTS_UBUNTU_RELEASE_ABI -1
#endif
#endif
Злополучная дрянь с нулем в начале дергается как раз при вызове
<generated/utsrelease.h>
, но далее идет условная конструкция, на случай если данный параметр выудить не удастся - ему присваивается значение
-1
Вот здесь и удалось за них зацепиться, выносом
define
с произвольным десятичным числом из условия
Код: Выделить всё
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
#include <generated/utsrelease.h>
#define UTS_UBUNTU_RELEASE_ABI 409
#endif
В итоге получилось так. Правда после трех долгих пересборок (
makepkg
работает в один поток зараза, сборка пакетов занимает по 5-7 минут на моем i5)

В первый раз только поменял значение
-1
на
409
, и потом втыкал почему ничего не поменялось и константа осталась восьмеричной, Второй раз выпилил строку с условием
ifndef
на что получил отбивку про лишний endif на закрытие которого не обратил внимания, и с третьего раза уже дожал злополучный блок. На самом деле думал еще где нибудь вылезет эта самодеятельность, но нет, определение прошло гладко, а компиляция без ворнингов.
Вот так вот потихоньку постигаю прелести околоядерного программирования, пусть и по сущим мелочам