On Sat, Apr 16, 2005 at 07:13:04PM +0400, Anton D. Kachalov wrote: > Поднимаю ещё раз вопрос о том, как быть со сборкой ядра из одного spec'а > для разных архитектур? > Могу предложить вариант, основанный на макросах. > > 1. инклуд конфигов в спек: > > %add_source_config i586 > %add_source_config athlon > %add_source_config x86_64 Тут смешаны в одну кучу архитектура и оптимизация. В принципе можно собрать и 32-разрядное ядро с оптимизацией под Athlon-64 (CONFIG_MK8). Да и у x86_64 сейчас есть CONFIG_MK8 (-march=k8) и CONFIG_MPSC (-march=nocona). > что должно добавить: > SourceN: config-%kernel_base_version-%flavour.i586 > Source(N+1): config-%kernel_base_version-%flavour.athlon > Source(N+2): config-%kernel_base_version-%flavour.x86_64 > > 2. секция build, копирование конфига > > вместо %__cp -vf %SOURCE1 arch/%base_arch/defconfig используем: > %copy_kernel_source_config > > этот макрос должен сделать проверку на наличие конфига > config-%kernel_base_version-%flavour.%base_arch и если есть, скопировать в > arch/%base_arch/defconfig > > Вопрос: что делать, если конфиг не найден? Т.е. если я решил собрать ядро > с --target=i686 вместо --target=i586? Делать symlink'и на конфиги и > паковать? Ну в принципе можно попытаться и подкорректировать тип процессора в конфиге. Надо строить какую-то таблицу (%arch) -> (%base_arch, CONFIG_Mxxx). Правда, в разных версиях ядер набор доступных CONFIG_Mxxx может быть разным, но можно писать туда несколько вариантов. #!/bin/sh base_arch="$1" cpu_types=$(sed -ne '/prompt[[:space:]]\+"Processor family"/,/endchoice/ s/^config[[:space:]]\+\([^[:space:]]\+\)[[:space:]]*$/\1/p' < arch/"$base_arch"/Kconfig) filter= for cpu in $cpu_types; do if [ "$cpu" = "$2" ]; then echo "CONFIG_$cpu=y" else echo "# CONFIG_$cpu is not set" fi filter="$filter /CONFIG_$cpu[=[:space:]]/d" done sed -e "$filter" (2.6.x only; ещё дописать подбор поддерживаемого ядром значения из заданного набора). > И мне немного неясен хак: > ### It's a hack, but a useful hack: > cmp -s .config %SOURCE1 || %__cp -vf .config %SOURCE1 Видимо, можно его убивать - сейчас в 2.6 это копирование выполняется каждый раз, поскольку в .config положили timestamp. Кстати, кто-нибудь помнит, почему конфиг кладётся в arch/%base_arch/defconfig, а не в .config с последующим запуском make oldconfig? > Какие ещё могут быть варианты? > > Со всем остальным проблем нет. Собирается на ура. > Разумеется, перед релизом ядра, ответственные за архитектуры, обновляют > конфиги :)