versatile_defconfig
何なのだ、ということでドブさらい。
$ find|xargs grep versatile_defconfig ./arch/arm/Makefile:KBUILD_DEFCONFIG := versatile_defconfig $
む。KBUILD_DEFCONFIG で grep した方が良さげ。
$ find|xargs grep KBUILD_DEFCONFIG ./arch/arm/Makefile:KBUILD_DEFCONFIG := versatile_defconfig ./arch/cris/Makefile:KBUILD_DEFCONFIG := etrax-100lx_v2_defconfig ./arch/x86/Makefile: KBUILD_DEFCONFIG := i386_defconfig ./arch/x86/Makefile: KBUILD_DEFCONFIG := $(ARCH)_defconfig ./arch/sparc/Makefile: KBUILD_DEFCONFIG := sparc32_defconfig ./arch/sparc/Makefile: KBUILD_DEFCONFIG := sparc64_defconfig ./arch/parisc/Makefile:KBUILD_DEFCONFIG := default_defconfig ./arch/ia64/Makefile:KBUILD_DEFCONFIG := generic_defconfig ./arch/blackfin/Makefile:KBUILD_DEFCONFIG := BF537-STAMP_defconfig ./arch/m68k/Makefile:KBUILD_DEFCONFIG := multi_defconfig ./arch/avr32/Makefile:KBUILD_DEFCONFIG := atstk1002_defconfig ./arch/mips/Makefile:KBUILD_DEFCONFIG := ip22_defconfig ./arch/m32r/Makefile:KBUILD_DEFCONFIG := m32700ut.smp_defconfig ./arch/powerpc/Makefile:KBUILD_DEFCONFIG := $(shell uname -m)_defconfig ./arch/powerpc/Makefile:KBUILD_DEFCONFIG := ppc64_defconfig ./arch/mn10300/Makefile:KBUILD_DEFCONFIG := asb2303_defconfig ./arch/sh/Makefile:KBUILD_DEFCONFIG := shx3_defconfig ./arch/m68knommu/Makefile:KBUILD_DEFCONFIG := m5208evb_defconfig ./arch/xtensa/Makefile:KBUILD_DEFCONFIG := iss_defconfig ./scripts/kconfig/Makefile:ifeq ($(KBUILD_DEFCONFIG),) ./scripts/kconfig/Makefile: @echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'" ./scripts/kconfig/Makefile: $(Q)$< -D arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) ./Makefile:# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed. ./Makefile:# KBUILD_DEFCONFIG may point out an alternative default configuration ./Makefile:export KBUILD_DEFCONFIG KBUILD_KCONFIG $
上記によれば scripts/kconfig/Makefile とかてっぺんの Makefile がポイントなのかなぁ。とりあえず scripts/kconfig/Makefile に以下な記述を発見。
%_defconfig: $(obj)/conf $(Q)$< -D arch/$(SRCARCH)/configs/$@ $(Kconfig)
で、arch/arm/configs/versatile_defconfig の中身見てみたんですが CONFIG_* の設定の羅列でした。
あと、$< は $(obj)/conf で良いのかな。$(obj) は makefiles.txt に説明があるけどよく分かりません。
$(obj) $(obj) is a relative path which points to the directory where the target is saved. Always use $(obj) when referring to generated files. Example: #drivers/scsi/Makefile $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl This is a special rule, following the normal syntax required by make. The target file depends on two prerequisite files. References to the target file are prefixed with $(obj), references to prerequisites are referenced with $(src) (because they are not generated files).
いっちゃんてっぺんの Makefile にて以下な記述を発見してます。
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR)) TOPDIR := $(srctree) # FIXME - TOPDIR is obsolete, use srctree/objtree objtree := $(CURDIR) src := $(srctree) obj := $(objtree)
CURDIR って何だろうなぁ。
$ find|xargs grep CURDIR ./scripts/mkmakefile:MAKEARGS += O=\$(if \$(patsubst /%,,\$(makedir)),\$(CURDIR)/)\$(patsubst %/,%,\$(makedir)) ./Makefile:$(CURDIR)/Makefile Makefile: ; ./Makefile:$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make ./Makefile: KBUILD_SRC=$(CURDIR) \ ./Makefile: KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \ ./Makefile:srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR)) ./Makefile:objtree := $(CURDIR) $
どこからも代入されてないということは、と言いつつ GNU Make のドキュメント見てみたら
利便性からGNU makeではCURDIRという変数にカレント・ワーキング・ディレクトリ(現在の作業の中心になっているディレクトリ)にパス名をセットします。
という記述を発見。
そりゃ良いのですが
$(obj)/conf って何でしょ。ってことで grep してみました。
$ find|xargs grep '$(obj)/conf' ./arch/um/kernel/Makefile:$(obj)/config.tmp: $(objtree)/.config FORCE ./arch/um/kernel/Makefile:$(obj)/config.c: $(src)/config.c.in $(obj)/config.tmp FORCE ./arch/um/kernel/Makefile: -e 'r $(obj)/config.tmp' \ ./kernel/Makefile:$(obj)/configs.o: $(obj)/config_data.h ./kernel/Makefile:$(obj)/config_data.gz: .config FORCE ./kernel/Makefile:$(obj)/config_data.h: $(obj)/config_data.gz FORCE ./scripts/kconfig/Makefile:config: $(obj)/conf ./scripts/kconfig/Makefile:oldconfig: $(obj)/conf ./scripts/kconfig/Makefile:silentoldconfig: $(obj)/conf ./scripts/kconfig/Makefile: --output $(obj)/config.pot ./scripts/kconfig/Makefile: $(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot ./scripts/kconfig/Makefile: >> $(obj)/config.pot; \ ./scripts/kconfig/Makefile: $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \ ./scripts/kconfig/Makefile: $(Q)rm -f $(obj)/config.pot ./scripts/kconfig/Makefile:randconfig: $(obj)/conf ./scripts/kconfig/Makefile:allyesconfig: $(obj)/conf ./scripts/kconfig/Makefile:allnoconfig: $(obj)/conf ./scripts/kconfig/Makefile:allmodconfig: $(obj)/conf ./scripts/kconfig/Makefile:defconfig: $(obj)/conf ./scripts/kconfig/Makefile:%_defconfig: $(obj)/conf $
むむ、ノーヒント? って scripts/kconfig の中を見てみたら conf がある。もっかいここの Makefile 見てみたらありました。
# =========================================================================== # Shared Makefile for the various kconfig executables: # conf: Used for defconfig, oldconfig and related targets # mconf: Used for the mconfig target. # Utilizes the lxdialog package # qconf: Used for the xconfig target # Based on QT which needs to be installed to compile it # gconf: Used for the gconfig target # Based on GTK which needs to be installed to compile it # object files used by all kconfig flavours lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o conf-objs := conf.o zconf.tab.o mconf-objs := mconf.o zconf.tab.o $(lxdialog) kxgettext-objs := kxgettext.o zconf.tab.o hostprogs-y := conf qconf gconf kxgettext
しかし $(obj) が scripts/kconfig を指してるとは思わんかった。いっちゃん最初のナニは conf とか mconf とかを作ってるのか。
おわりに
ええと、ARM の versatile_defconfig というナニは arm の SoC 毎なナニの CONFIG_* な設定を簡単にするための仕組みの一つ、という理解で良いのかな。
そういえば今頃 host_defconfig した後じゃないと独自のパラメータ設定がアレな件を思い出していたりしてます。
ちなみに beagleboard/arch/arm 配下でコンパイル対象になってるのは以下なディレクトリな模様 (.o があるディレクトリです)。
- arch/arm/mach-versatile
- arch/arm/kernel
- arch/arm/mm
- arch/arm/common
- arch/arm/boot/compressed
- arch/arm/lib
- arch/arm/nwfpe
- arch/arm/vfp
この SoC 毎 (?) に実装が異なる、というあたりがまだイメージできてなかったり。
hostprogs
Documentations/kbuild/makefiles.txt に以下の記述がありますね。
Kbuild supports building executables on the host for use during the
compilation stage.
Two steps are required in order to use a host executable.
で
次は何をするんだったかorz
ちょうど良いのでコンパイル対象になってるソレを穿ってみるか。