LINUX.ORG.RU

Компиляция ядра при незначительных изменениях


0

1

Приветствую форумчан.

По учебе необходимо разработать некоторую программу, для этого по сути надо отредактировать

linux-source*/fs/exec.c
, скомпилировать и пересобрать ядро. При этом бОльшую часть времени отнимает компиляция всех исходных файлов в объектные *.о. Вопрос такой, можно ли при новых изменениях просто делать
make fs/exec.o
и пропускать компиляцию всех остальных исходников? Это бы сэкономило огромную кучу времени.

Уверен, что упорное ковыряние в Makefile поможет, спрашиваю же на случай, если ответ уже кому-то известен и он не прочь им поделиться.


Если изменение не касается всего ядра, а дерево не чистилось, то заново запущенный make обработает только то, что изменилось.

post-factum ★★★★★
()
Ответ на: комментарий от Jetty

Но да, если при апдейтеах например сменилась версия какогонить гцц, то лечше клин+мейк сделать

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

Я, наверное, что-то неправильно делаю, так как у меня компилируется все. ОС Debian Squeeze. Исходники linux-source-2.6.32. Сначала делается .config. Потом из linux-source*/

make bzImage
make modules
make modules_install
make install
Потом делается initrd и так далее по мануалам. Ядро грузится и работает. Теперь я хочу сделать изменения в fs/exec.c. Делаю, допустим, где-нибудь
printk(KERN_INFO "Test");
clean не делаю. Но
make bzImage
пролопачивает все исходники. Где ошибка?

Кстати, пришла в голову мысль удалить все мейкфайлы из всех директорий, кроме fs. Но это как-то не профессионально.

Wirrok
() автор топика
Ответ на: комментарий от Wirrok

make bzImage в любом случае обойдёт всё дерево хотя бы один раз, вне зависимости от времени изменения отдельных файлов. make modules заставит обойти его ещё как минимум один раз.

У меня это занимает где-то полторы минуты, и почти всё это время тратится на чтение файлов с диска. Думаю, можно ускорить, если перенести компиляцию на tmpfs.

Касательно способа сборки: может стоит попробовать использовать make-kpkg, раз уж у тебя debian? Или если с ним неохота разбираться, хотя бы ядро собирать как make deb-pkg, сразу в пакет?

i-rinat ★★★★★
()

Должно пересобирать только то, что изменилось, но, возможно, в каком-то Makefile'е (может, даже не в одном) прописана зависимость чего-то от exec.c, поэтому всё и пересобирает. Погрепайте как-то так:

find /usr/src/linux -name Makefile -exec grep ':.*exec.c' '{}' \;

Может, что-то найдёт.

// И да, время точно не сбивалось? Суффикс к версии ядра тоже не менялся?

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

i-rinat, потестил make-kpkg kernel_image на ubunt'е - готовые объектные файлы не перекомпилируются, как и надо. Что странно - в debian'е компилируется все равно все. Надо поковыряться, где-то я затупил. Но это уже результат. И tmpfs тоже хорошее замечание, памяти завались.

Divius, выглядит как то, что я и искал изначально. Попробую поюзать, надеюсь глюков нет.

gentoo_root, как я уже говорил, даже без изменений ни в одном файле make bzImage перекомпилирует все дерево, и, как сказал i-rinat, так и должно быть. Нет, ничего в Makefile не менялось.

Спасибо всем за ответы, пища для размышлений получена. Когда что-нибудь выйдет путное, отпишусь.

Wirrok
() автор топика
Ответ на: комментарий от Wirrok

>make bzImage перекомпилирует все дерево, и, как сказал i-rinat, так и должно быть.

Он не это сказал. Он сказал:

make bzImage в любом случае обойдёт всё дерево хотя бы один раз

make _обойдёт_ дерево зависимостей и, если что-то устарело, пересоберёт. Если же не устарело, то пересобирать не должен.

// У меня тоже когда-то такое было, но после удаления исходников ядра и перераспаковки, а также после удаления старого конфига и написания нового конфига с нуля аналогичный баг пропал.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

> make _обойдёт_ дерево зависимостей и, если что-то устарело, пересоберёт. Если же не устарело, то пересобирать не должен.

Объектные файлы, конечно, пересобираться не будут, но в каждой директории система сборки нагенерит .o.cmd файлов, если их нет или они устарели; а если есть, то прогонит дочерние make по этим файлам. Даже с localmodconfig пустой запуск make у меня делает около 260 тысяч stat'ов.

i-rinat ★★★★★
()
Ответ на: комментарий от gentoo_root

Получается так, что make bzImage (действительно) не перекомпилирует то, что не измениловь, и, если делать все в tmpfs, присходит мгновенно. А make modules при изменениях в ядре делать вообще не нужно, в случае необходимости делать и компилировать свои модули отдельно. Получается, что никаких проблем и нету, я просто словил баг (точно помню, что два раза подряд make bzImage делал одно и то же). Всем спасибо.

Wirrok
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.