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
ちょうど良いのでコンパイル対象になってるソレを穿ってみるか。