проект книги: "Модули ядра Linux"

Здесь будут размещаться ссылки и отзывы на интересные публикации по Linux

Модераторы: Olej, vikos

Правила форума
Запрещается помещать сообщения, не имеющие отношения к обсуждаемой статье. Все такие сообщения будут удаляться непосредствено после обнаружения.
Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 25 фев 2012, 13:03

bose писал(а):Да, в догонку относительно того же shell'a в Makefile'е:
по поводу "в догонку" : я догадываюсь (с трудом) о чём речь, остальные кто читать станет форум - ни в коем разе; огласите эту "догонку", чтоб обсудить можно было, какие изменения и как лучше сделать.
bose писал(а): если б данное выражение (cd $$subdir && make && cd ../) находилось не в субшеле то после неудачного выполнения make пользователь остался б в поддирректории, а это скорее всего не предполагается в данном контексте. Учитывая предыдущий пункт, лучше смену пвд в родительский каталог убрать.[/*]
да, это правильное замечание к example, будет выправлено.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 25 фев 2012, 22:49

Olej писал(а): по поводу "в догонку" : я догадываюсь (с трудом) о чём речь, остальные кто читать станет форум - ни в коем разе;
Да немного странно получилось, но дело в том что я отправил два сообщения. Просто первое начал писать на работе и сохранил в черновиках, а дома уже отправил первое и написал и сразу отправил второе. Ну да ладно.

В первом моём сообщении речь шла о том, что формат вывода команды ls -l, как оказалось, может отличаться. В Ubuntu 11.10 он имеет например следующий вид:
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

В Fedora 13 он имеет другой вид. Разница состоит в количестве полей вывода (при IFS=<default>). Я не стал разбираться в причине такого плюрализма (первые подозрения пали на локаль, так как разница проявляется в формате даты-времени, но как показала проверка - от локали формат вывода не зависит), и просто предложил воспользоваться другой утилитой.

В Makefile`ах, которые отвечают за рекурсивную сборку примеров:
Kexamples.BOOK/Makefile
Kexamples.BOOK/dev/Makefile
Kexamples.BOOK/memory/Makefile
Kexamples.BOOK/sys_call_table/Makefile
Kexamples.BOOK/user_space/libraries/Makefile
заменить строку

Код: Выделить всё

SUBDIRS = $(shell ls -l | awk '/^d/ { print $$9 }')
на

Код: Выделить всё

SUBDIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n"')
Первый и второй вариант имеют недостатки - они не будут работать если в имени дирректории есть пробельный символ. В случае если пользователь захочет воспользоваться данной схемой сборки (либо путём добавления своей папки, либо заимствуя Makefile в свой проект), и при этом создаст папку в имени которой есть пробел(ы) данный сценарий не сработает. Причина в "The only processing make does on the result is to convert each newline (or carriage-return / newline pair) to a single space. If there is a trailing (carriage-return and) newline it will simply be removed."(http://www.gnu.org/savannah-checkouts/g ... ction.html). Я не нашёл способа элегантно решить эту проблему, хотя "тапорный" метод имеется.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 26 фев 2012, 02:30

bose писал(а):
Olej писал(а): по поводу "в догонку" : я догадываюсь (с трудом) о чём речь, остальные кто читать станет форум - ни в коем разе;
Да немного странно получилось, но дело в том что я отправил два сообщения. Просто первое начал писать на работе и сохранил в черновиках, а дома уже отправил первое и написал и сразу отправил второе. Ну да ладно.
нормально получилось ... я просто хочу собрать все замечания, сложить их вместе и посмотреть на них - выбрать необходимый минимум изменений, которые нужно внести в текст и в дерево примеров.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 26 фев 2012, 02:35

bose писал(а): В первом моём сообщении речь шла о том, что формат вывода команды ls -l, как оказалось, может отличаться. В Ubuntu 11.10 он имеет например следующий вид:
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

В Fedora 13 он имеет другой вид. Разница состоит в количестве полей вывода (при IFS=<default>). Я не стал разбираться в причине такого плюрализма (первые подозрения пали на локаль, так как разница проявляется в формате даты-времени, но как показала проверка - от локали формат вывода не зависит), и просто предложил воспользоваться другой утилитой.
да, вот такой отличающийся вид:

Код: Выделить всё

[olej@notebook Kexamples.BOOK]$ ls -l
итого 100
drwxrwxr-x 7 olej olej  4096 Янв 26 02:36 dev
drwxrwxr-x 2 olej olej  4096 Авг 27 21:57 dma
...
в общем, из-за формата представления даты, да...

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 26 фев 2012, 23:58

Может (что б больше не возвращаться к системе сборки примеров), Makefile'ы для рекурсивной сборки (те которые я перечислял выше), привести к вот такому виду:

Код: Выделить всё

SUBDIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n")

all install uninstall clean:
	@list='$(SUBDIRS)'; for subdir in $$list; do \
	  echo "=============== making $@ in $$subdir ================="; \
	  (cd $$subdir && make $@) \
	done
Получится коротко и не в ущерб делу...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 27 фев 2012, 02:27

bose писал(а):Может (что б больше не возвращаться к системе сборки примеров), Makefile'ы для рекурсивной сборки (те которые я перечислял выше), привести к вот такому виду:

Код: Выделить всё

SUBDIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n")

all install uninstall clean:
	@list='$(SUBDIRS)'; for subdir in $$list; do \
	  echo "=============== making $@ in $$subdir ================="; \
	  (cd $$subdir && make $@) \
	done
Получится коротко и не в ущерб делу...
да я всё понял, см. сейчас не выплывут ли какие особенности, например при глубине вложенности такой рекурсивной сборки больше 1.
кроме того, нужно всё дерево каталогов тщательно перешерстить, а это требует некоторого времени.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 27 фев 2012, 17:08

На 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>

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 27 фев 2012, 17:44

Olej писал(а): да я всё понял, см. сейчас не выплывут ли какие особенности, например при глубине вложенности такой рекурсивной сборки больше 1.
кроме того, нужно всё дерево каталогов тщательно перешерстить, а это требует некоторого времени.
В некоторых Makefile'ах целью по умолчанию является all:

Код: Выделить всё

./int80/Makefile:8:all:	default proc
./time/Makefile:5:all: mod lib prog
./tools/mobj/Makefile:15:all:
./user_space/user_io/Makefile:4:all:    $(LIST)
./user_space/libraries/auto/Makefile:6:all: $(LIB) $(TARGET)
./user_space/libraries/monolyt/Makefile:5:all: $(TARGET)
./user_space/libraries/dynamic/Makefile:6:all: $(LIB) $(TARGET)
./user_space/libraries/static/Makefile:6:all: $(LIB) $(TARGET)
./user_space/gas-prog/Makefile:4:all:    $(LIST)
./signal/Makefile:9:all: default ioctl sigreq
./dev/mopen/Makefile:9:all: module prog
./dev/ioctl/Makefile:9:all: default ioctl
./dev/poll/Makefile:9:all:  prog module
в некоторых default (при отсутсвии all):

Код: Выделить всё

./thread/Makefile:10:default:
./usb/Makefile:10:default:
./int80/Makefile:10:default:
./file/Makefile:11:default:
./dma/Makefile:11:default:
./pci/Makefile:10:default:
./tools/export-data/Makefile:9:default:
./tools/simple-debug/Makefile:14:default:
./tools/log_level/Makefile:8:default:
./tools/parms/Makefile:9:default:
./IRQ/Makefile:13:default:
./net/Makefile:17:default:
./proc/Makefile:15:default:
./memory/mtest/Makefile:10:default:
./memory/list/Makefile:9:default:
./memory/slab/Makefile:10:default:
./signal/Makefile:11:default:
./dev/cdev/Makefile:11:default:
./dev/ioctl/Makefile:11:default:
./dev/misc/Makefile:9:default:
./exec/Makefile:10:default:
./first_hello/Makefile:9:default:	
./sys_call_table/export/Makefile:10:default:
./sys_call_table/call_table/Makefile:11:default:
./netproto/Makefile:13:default:
./sys/Makefile:12:default:
По-этому автоматической (рекурсивной) сборки всего каталога примеров не получается (сборка тех примеров, у которых в Makefile цель default, ругаются: - *** No rule to make target `all'. Stop)
Собственно так - если в коммандной строке писать просто make, то будут рекурсивно выполнятся цели по умолчанию (как бы они не назывались). Если явно указывать цель, то... нужно унифицировать название дефаультной цели для всех примеров.
Последний раз редактировалось bose 27 фев 2012, 17:51, всего редактировалось 1 раз.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 27 фев 2012, 17:49

bose писал(а):На 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>
Спасибо за подсказки.
Появился повод проделать тщательную ревизию всего дерева ;) - вылезают всякие попутные мелкие огрехи.

Код: Выделить всё

[olej@notebook Kexamples.BOOK]$ make
[olej@notebook Kexamples.BOOK]$ du -hs
21M	.
[olej@notebook Kexamples.BOOK]$ make clean
[olej@notebook Kexamples.BOOK]$ du -hs
11M	.
[olej@notebook Kexamples.BOOK]$ make clean
[olej@notebook Kexamples.BOOK]$ du -hs
3,4M	.
[olej@notebook Kexamples.BOOK]$ make arch
[olej@notebook Kexamples.BOOK]$ ls -l Kexamples.tgz 
-rw-rw-r-- 1 olej olej 728591 Фев 27 16:51 Kexamples.tgz
- это вот плата, при многократных пересылках всем заинтересованным читателям, за неаккуратности при выполнениях make в дереве.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 27 фев 2012, 18:15

Olej писал(а): Спасибо за подсказки.
Появился повод проделать тщательную ревизию всего дерева ;) - вылезают всякие попутные мелкие огрехи.
Да на самом то деле спасибо Вам за то что дали повод покапаться в таких интересностях. Было б больше свободного времени, прочитал бы за раз не отрываясь )))
Я по мере возможности буду разбирать Ваши примеры и если что-то ещё будет "вылазить" обязательно буду сообщать.

Ответить

Вернуться в «Публикации, книги и обсуждения»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей