перепаковываю и пересобираю дерево исходных кодов различных модулей ядра Linux:
http://rus-linux.net/forum/viewtopic.php?f=3&t=1549&p=2961#p2961достаточно неожиданно и любопытно, что то, что безболезненно собирается в одном дистрибутиве, не собирается в другом ... по крайней мере требует минимальных правок в перечислении
хэдеров ядра:
На Ubuntu 11.10 (3.0.0-16-generic, gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1) Kexamples.BOOK/dev/mopen/mmopen.c компилируется с ошибкой:
Kexamples.BOOK/dev/mopen/mmopen.c:25:7: error: implicit declaration of function ‘kmalloc’ [-Werror=implicit-function-declaration]
лечится
#include <linux/slab.h>
ничего страшного (при сборке своих кодов), но может быть неприятно и неожиданно (при сборке чужих драйверов) + к подобному нужно быть готовым.
Но, насколько я понимаю, это уже не дистрибьюторы по-разному напаковали, и разница эта выскакивает не от вида
дистрибутива, а от разной
версии ядра, использованной в этих дистрибутивах.
То же самое случается при компиляции процессов для user space... но там различия, полагаю, возникают из-за разницы в
версии gcc, что тянет за собой различия в стандартной библиотеке С, и, как следствие, в хедер-файлах /usr/include.
Пользователь решил продолжить мысль 27 Февраля 2012, 20:00:23:
и это, конечно, далеко не последние различия, когда переходишь в программировании с одного дистрибутива в другой (хотя везде это Linux и, казалось бы, для программиста всё должно быть одинаково).
Пример (может кому оказаться полезным):
- есть дерево каталогов проектов (разной глубины вложенности):
[olej@notebook Kexamples.BOOK]$ tree | head -n15
.
├── dev
│ ├── cdev
│ │ ├── cdev.hist
│ │ ├── dyndev.c
│ │ ├── fixdev.c
│ │ └── Makefile
│ ├── dev.h
│ ├── devices.txt
│ ├── ioctl
│ │ ├── ioctl.c
│ │ ├── ioctl_dev.c
│ │ ├── ioctl.h
│ │ ├── ioctl.hist
│ │ └── Makefile
ну и так далее ... много

- хотелось бы make выполнять сразу над всем деревом а не гулять по каталогам...
Вот начало Makefile такой рекурсивной сборки, которая почти год успешно использовалась в Fedora:
SUBDIRS = $(shell ls -l | awk '/^d/ { print $$9 }')
all:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "=============== making all in $$subdir ================="; \
(cd $$subdir && make && cd ../) \
done;
install:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "============= making install in $$subdir =============="; \
(cd $$subdir; make install; cd ../) \
done
...
ну и так далее...
- в Ubuntu это не работает... потому что настроен другой формат вывода ls:
$ ls -l
итого 100
drwxrwxr-x 7 olej olej 4096 Янв 26 02:36 dev
drwxrwxr-x 2 olej olej 4096 Авг 27 21:57 dma
...
s ls -l
total 96
drwxrwxr-x 7 user user 4096 2011-07-02 13:11 dev
drwxrwxr-x 2 user user 4096 2011-08-27 21:57 dma
...
разный формат даты.
- можно, конечно, перестроить формат, но не хочется затрагивать дефаулты... легче переписать Makefile сценарий:
SUBDIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n")
all install uninstall clean disclean:
@list='$(SUBDIRS)'; for subdir in $$list; do \
echo "=============== making $@ in $$subdir ================="; \
(cd $$subdir && make $@) \
done
Теперь всё ОК ... но это до случая, когда это не придётся адаптировать к какому-нибудь ... Gento.
