Linux ͥ Makefile
2000 ǯ 9  14 
Michael Elizabeth Chastain, <mec@shout.net>

: JF ץ (http://www.linux.or.jp/JF/)
  :  ɧ <takahiko@hakubi.co.jp>
  :   <kgh12351@nifty.ne.jp>
  :  ŵ <zap03216@nifty.ne.jp>



=== ܼ

ܥɥȤϡLinux ͥ Makefile ˤĤƵҤΤǤ

  1  
  2  Makefile Фؤ
  3  Makefile 
  4  Ǿ̤Ϥѿ
  5  ƥ Makefile ι¤
     5.1  ƥͭѿ
     5.2  vmlinux ѿ
     5.3  vmlinux μιо
     5.4  ɬܤȤʤ륢ƥͭΥå
  6  ֥ǥ쥯ȥ Makefile ι¤
     6.1  
     6.2  о
     6.3  Ĵ
     6.4  Rules.make 
     6.5  ̤ʵ§
  7  Rules.make ѿ
     7.1  ֥ǥ쥯ȥ
     7.2  оݤȤʤ륪֥ȥե
     7.3  оݤȤʤ饤֥ե
     7.4  оݤȤʤ֥⥸塼
     7.5  ʣ⥸塼
     7.6  ѥե饰
     7.7  ¾ѿ
  8  ѿ
     8.1  ѿ
     8.2  ŤؤѴ
  9  Linux ͥ 2.2 Ȥθߴ
 10  ռ



=== 1 

Makefile ˤ 5 Ĥζʬޤ

    Makefile: Ǿ Makefile.
    .config: ͥե롣
    arch/*/Makefile: ƥ Makefile.
    ֥ǥ쥯ȥ Makefile:  300 ޤ
    Rules.make: ƤΥ֥ǥ쥯ȥ Makefile ˶̤ε§

ͥ빽 (make config ) ˤ .config 졢
.config ϺǾ Makefile ɤ߹ޤޤ

Ǿ Makefile ˤϡĤμפʥץ vmlinux (󥫡ͥ
᡼) ȥ⥸塼뷲 (ƤΥ⥸塼ե) ۤȤ
ܤޤǾ Makefile ϡͥ륽ĥ꡼ƵŪ˲
ƤιоʪޤɤΥ֥ǥ쥯ȥ꤬оݤ
ʤ뤫ϡͥ빽Ƥ˰¸ޤ

Ǿ Makefile ϡarch/$(ARCH)/Makefile Ȥ̾Υƥ
Makefile 򤽤Τޤޥ󥯥롼ɤޤƥ Makefile ϡ
ƥͭξǾ Makefile 󶡤ޤ

ƥ֥ǥ쥯ȥˤϡ̤Ϥ줿ޥɤ¹Ԥ Makefile 
¸ߤޤ֥ǥ쥯ȥ Makefile ϡƼΥեꥹȤ
뤿ᡢ.config եξѤޤޤRules.make ζ
§⤽Τޤޥ󥯥롼ɤޤ

Rules.make Ǥϡ֥ǥ쥯ȥ Makefile ˶̤ε§
ޤRules.make ˤϡѿꥹȤȤ󶡤󥿡
եꡢΥꥹȤ˴Ť§Ƥޤ



=== 2 Makefile Фؤ

ͥ Makefile Фؤˤ 4 ̤ꤢޤ

إ桼٤ȤϡͥۤͤΤȤؤޤ桼ϡ
"make menuconfig"  "make bzImage" ȤäޥɤϤޤ
̾ϡͥ Makefile (ޤϡ¾Υե) ɤ
Խꤹ뤳ȤϤޤ

ذ̤γȯԡ٤ȤϡǥХɥ饤Фե륷ƥࡢͥåȥ
ץȥʤɤεǽФȤ򤪤ʤͤؤޤ̤γȯԤϡ
оݤȤʤ륵֥ƥѤΥ֥ǥ쥯ȥ Makefile ݻ
ɬפޤݻΨŪˤʤˤϡͥ Makefile
γפ Rules.make θ󥿡եξܺ٤ΤäƤɬפ
ޤ

إƥ㳫ȯԡ٤Ȥϡsparc  ia64 ʤɤΥƥ˴ؤ
ŪʺȤ򤪤ʤͤؤޤƥ㳫ȯԤϡ֥ǥ쥯
ȥ Makefile Ʊ͡ƥ Makefile ˤĤƤΤäƤɬפ
ޤ

إͥ빽۳ȯԡ٤Ȥϡͥ빽ۥƥ༫ΤФȤ򤪤ʤ
ͤΤȤؤޤͥ빽۳ȯԤϡͥ Makefile ˴ؤƤ
ˤĤΤäƤɬפޤ

ΥɥȤϡذ̤γȯԡ٤ȡإƥ㳫ȯԡ٤оݤȤ
ޤ



=== Makefile 

ͥ Makefile  GNU make Ѥ߷פƤޤ Makefile Ǥ
GNU make εǽΤʸ񲽤줿ΤȤƤޤ󤬡Ǥ
¿ GNU ĥѤƤޤ

GNU make ϡŪʥꥹȽǽ򥵥ݡȤޤͥ Makefile
Ǥϡ"if" ʸȤ߹碌ʤ顢ꥹȤιۤλ¿ʼˡ
ѤƤޤ

GNU make ˤϡ":="  "=" ȤĤ黻Ҥޤ":=" ϡ
դͤ򤽤ξɾꤷʸդޤ"=" ϡ
˻Ƥޤ"=" ϡդ̤ɾξ֤ˤƤդ
Ȥ뤿Ӥ༡ɾޤ

"=" Ŭڤʾ⤢ޤ̾ ":=" 򤹤ۤɤ
Ǥ礦

ΥɥƤϡºݤΥͥ륽äƤΤǤ
 (ѹ䡢Ԥʬ) ϤƤޤʳƱǤ



=== 4 Ǿ̤Ϥѿ

Ǿ Makefile ϲѿ򥨥ݡȤޤ

    VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION

        ߤΥͥΥСϤѿޤ
        ͤľܻȤƤ륢ƥ Makefile ⤤Ĥޤ
         $(KERNELRELEASE) Ȥۤ褤Ǥ礦

        СδܤȤʤ 3 ĤʬȤС"2", "4", "0" ϡ
        $(VERSION), $(PATCHLEVEL), $(SUBLEVEL) ޤ
        3 ĤͤϾ˿ͤǤ

        ץѥåɲåѥåѤΡ˲̤Υ֥٥ϡ
        $(EXTRAVERSION) ޤ̾ "-pre4" ʤɤΤ褦
        ͤʸǤƤϥ֥󥯤ˤʤäƤޤ


    KERNELRELEASE

        $(KERNELRELEASE) ϡ"2.4.0-pre4" Ȥ褦ñʸǡ
        󥹥ȡǥ쥯ȥ̾䡢Сʸɽ
        ѤΤŬƤޤĤΥƥ Makefile Ǥϡ
        Τ褦Ӥ $(KERNELRELEASE) ѤƤޤ

    ARCH

        ѿϡ"i386"  "arm", "sparc" ʤɤȤäå
        ƥ뤿ΤΤǤɤΥե򥳥
        ѥ뤹٤ȽǤ뤿ᡢ¿Υ֥ǥ쥯ȥ
        Makefile  $(ARCH) 򻲾ȤƤޤ

        ǥեȤǤϡǾ Makefile ϡ$(ARCH) ۥȥƥ
        ƥƱˤޤۤˤϡ桼
        $(ARCH) ͤ򥳥ޥɥ饤Ǿ񤭤Ƥ⹽ޤ

            make ARCH=m68k ...

    TOPDIR, HPATH

        $(TOPDIR) ϡͥ륽ĥ꡼κǾؤΥѥǤ
        ֥ǥ쥯ȥ Makefile  $(TOPDIR)/Rules.make 
        󥯥롼ɤǤ褦ˤ뤿ᡢѿ
        ޤ

        $(HPATH) ϡ$(TOPDIR)/include ƱǤ󥯥롼ɥե
        ȤäƲüʤȤ򤹤뤿ˤѿѤ륢ƥ
        Makefile ⤤Ĥ¸ߤޤ

    SUBDIRS

        vmlinux ޤϥ⥸塼ۤΤɬפʥ֥ǥ쥯ȥ
        Ǿ Makefile ȤоݤȤΤ $(SUBDIRS) 
        ꥹȥåפޤºݤˤɤΤ褦ʥǥ쥯ȥ꤬ $(SUBDIRS) 
        ꥹȥåפ뤫ϡͥ빽Ƥ˰¸ޤ
        ѿϺǾ Makefile ˤ졢ƥ Makefile 
        Ƥͤɲäޤ

    HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS
    LINKFLAGS

        vmlinux ˥󥯤륪֥ȥեȥ饤֥ϡ
        $(HEAD), $(CORE_FILES), $(NETWORKS), $(DRIVERS), $(LIBS) 
        ꤵޤ

        $(HEAD) ˥ꥹȥåפեϡvmlinux ˺ǽ˥
        ޤ

        vmlinux ۤ뤿Υե饰 $(LINKFLAGS) ǻꤵޤ

        ѿϡǾ Makefile ȥƥ Makefile ˤ
        ޤǾ Makefile Ǥϡ$(CORE_FILES), $(NETWORKS),
        $(DRIVERS), $(LIBS) ޤƥ Makefile Ǥϡ
        $(HEAD)  $(LINKFLAGS) 졢ޤ$(CORE_FILES) 
        $(LIBS) Ƥɲäޤ

        : ɬװʾѿޤ$(NETWORKS), $(DRIVERS), 
        $(LIBS) Ǥ⡢$(CORE_FILES) ˤޤȤƤޤȤǤǤ礦

    CPP, CC, AS, LD, AR, NM, STRIP, OBJCOPY, OBJDUMP
    CPPFLAGS, CFLAGS, CFLAGS_KERNEL, MODFLAGS, AFLAGS, LDFLAGS
    PERL
    GENKSYMS

        ե뤫鹽оݤ뤿 Rules.make Ѥ
        ޥɤȥե饰ϡѿǻꤵޤ

        󥫡ͥ륳ɤ򥳥ѥ뤹Τ˻Ѥɲä C ѥ
        ե饰ϡ$(CFLAGS_KERNEL) ǻꤵޤ

        ֥륫ͥ⥸塼ѤΥɤ򥳥ѥ뤹Τ˻
        ɲä C ѥե饰ϡ$(MODFLAGS) ǻꤵޤ
        ŪˤϡΥե饰̾ΤϡŪ̾ΤǤ
        $(CFLAGS_MODULE) ѹˤʤ뤫⤷ޤ

        ֥ե饰 $(AFLAGS) ǻꤵޤ

        CONFIG_MODVERSIONS ͭȤʤäƤȤ˥ͥ륷ܥ
        ͥΤ˻Ѥ륳ޥɤϡ $(GENKSYMS) 
        ꤵޤgenksyms ޥɤ modutils ѥå˴ޤޤ
        ޤ

    CROSS_COMPILE

        ѿϡ$(CC)  $(AS), $(LD) ʤɤȤ¾ѿΤΥץ
        եåѥǤƥ Makefile Ǥϡޤѿ
        ѤꡢŪꤷꤷޤ֥ǥ쥯ȥ Makefile ϡ
        ѿΤȤ򵤤ˤɬפϤޤ

        ɬפʤ顢$(CROSS_COMPILE) 򥳥ޥɥ饤Ǿ񤭤Ƥ褤
        Ǥ礦

    HOSTCC, HOSTCFLAGS

        ۥ¦Υץ򥳥ѥ뤹Τ˻Ѥ C ѥ
        C ѥե饰ϡѿޤå
        ƥȥۥȥƥ㤬ۤʤ⤢뤿ᡢ
        ѿ̸ĤѰդƤޤ

        ͥۤɬפȤʤץ Makefile 
        ѥ롿¹Ԥϡ$(HOSTCC)  $(HOSTCFLAGS) 
        ޤ

        ȤСdrivers/pci ֥ǥ쥯ȥˤ gen-devlist.c Ȥ
        ץबޤΥץϡPCI ID ΥꥹȤɤ
        ߡϥե classlist.h  devlist.h  C Υɤ
        ޤ

        ˡi386 ԥ塼 ia64 ޥѤΥͥۤ褦
        ȤƤȲꤹȡۤȤɤΥѥȤ ia64 ѥ
        ѥѤ뤳Ȥˤʤޤdrivers/pci/gen-devlist.c 
        ѥ뤹ˤϡͥƥ֤ i386 ѥۥȥѥѤ
        Ȥˤʤޤ

        ¾ȤƤϡscripts/mkdep.c  scripts/lxdialog/*.c ʤɤ
        äͥץबޤ⡢$(CC) Ǥ
        ʤ $(HOSTCC) ǥѥ뤵ޤ

    ROOT_DEV, SVGA_MODE, RAMDISK

        ѿϡͥι˴ؤꤹ뤿ᡢ
        ɥ桼ˤԽޤѿϸŤǤ
        ޤi386 ƥ˸ͭΤΤǤ⤢ޤº
        Ȥơ CONFIG_* ץ֤ʤ
        ʤޤ

    MAKEBOOT

        ѿϡᥤΥƥ Makefile (ƥ
        ǥ쥯ȥˤǾ Makefile) ǤΤѤޤ
        Ǿ Makefile  MAKEBOOT 򥨥ݡȤޤ

    INSTALL_PATH

        ƥ Makefile 󥫡ͥ륤᡼ System.map
        ե򥤥󥹥ȡ뤹ϡѿޤ

    INSTALL_MOD_PATH, MODLIB

        $(INSTALL_MOD_PATH) ϡ⥸塼򥤥󥹥ȡ뤹뤿
        $(MODLIB) դץեåǤѿ Makefile
        뤳ȤϤޤ󤬡ɬפʤС桼
        Ǥޤ

        ⥸塼򥤥󥹥ȡ뤹ǥ쥯ȥϡ$(MODLIB) ǻꤷޤ
        Ǿ Makefile ϡ$(MODLIB) 
        $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) Ȥ
        ޤɬפʤ顢ޥɥ饤Ǥѿ񤭤Ƥ褤
        礦

    CONFIG_SHELL

        ѿϡMakefile  Rules.make ΤǤΤ߻Ѥޤ
        ƥ Makefile ȥ֥ǥ쥯ȥ Makefile ϡ
        ѿѤƤϤޤ

    MODVERFILE

        ѿǤǾ Makefile γǻѤ뤳ȤϤʤΤǡ
        ݡȤɬפϤޤ

    MAKE, MAKEFILES

        GNU make ѿǤ

        ƥ Makefile ȥ֥ǥ쥯ȥ Makefile 
        $(TOPDIR)/.config Ū˥󥯥롼ɤƤʤǤ⡢
        ƤŪɤ߹ޤ褦ˤ뤿ᡢ$(MAKEFILES)
        ѤƤޤ (ȤꤢǽФ褤ȤȤ
        $(MAKEFILES) ѤʤޤǤ
        ȤΤ˽ľȤǤ) 



=== 5 ƥ Makefile ι¤

--- 5.1  ƥͭѿ

Ǿ Makefile ϡƥ Makefile Ǥ arhc/$(ARHC)/Makefile 
Ĥ󥯥롼ɤޤǤϡƥ Makefile εǽ
ĤƵҤޤ

ƥ Makefile ǤϡƥͭͤǾ Makefile 
ѿɲäޤ

    SUBDIRS

        $(SUBDIRS) ϡǾ Makefile Ƥޤƥ
        Makefile ˤꡢƥͭΥǥ쥯ȥΥꥹȤ
        $(SUBDIRS) ɲäޤ

        :

                # arch/alpha/Makefile

                SUBDIRS := $(SUBDIRS) arch/alpha/kernel arch/alpha/mm \
                           arch/alpha/lib arch/alpha/math-emu

        ΥꥹȤϥͥ빽Ƥ˰¸ޤ

                # arch/arm/Makefile

                ifeq ($(CONFIG_ARCH_ACORN),y)
                SUBDIRS         += drivers/acorn
                ...
                endif

    CPP, CC, AS, LD, AR, NM, STRIP, OBJCOPY, OBJDUMP
    CPPFLAGS, CFLAGS, CFLAGS_KERNEL, MODFLAGS, AFLAGS, LDFLAGS

        ѿϺǾ Makefile Ƥꡢƥ
        Makefile ϤƤɲäޤ

        ɤΥץ󤬥ݡȤƤ뤫Ĵ٤뤿ᡢ¿Υ
        ƥ Makefile ˤơåѤ C ѥ餬ưŪ
        ¹Ԥޤ

                # arch/i386/Makefile

                # gcc å 16 Хȶǥ饤󤷤ʤ褦ˤ
                CFLAGS += $(shell if $(CC) -mpreferred-stack-boundary=2 \
                          -S -o /dev/null -xc /dev/null >/dev/null 2>&1; \
                          then echo "-mpreferred-stack-boundary=2"; fi)

        $(CFLAGS) ϥͥ빽Ƥ˰¸ޤ

                # arch/i386/Makefile

                ifdef CONFIG_M386
                CFLAGS += -march=i386
                endif

                ifdef CONFIG_M486
                CFLAGS += -march=i486
                endif

                ifdef CONFIG_M586
                CFLAGS += -march=i586
                endif

        ƥͭΥե饰ɲä뤿ᡢѥ륳ޥɤ
        륢ƥ Makefile ¸ߤޤ

                # arch/s390/Makefile

                LD=$(CROSS_COMPILE)ld -m elf_s390
                OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S



--- 5.2  vmlinux ѿ

vmlinux եιˡꤹѿϡƥ Makefile 
Ǿ Makefile Ĵ뤳Ȥˤޤâб
⥸塼ѤΥƥͭʬ¸ߤʤΤդƤ
⥸塼ۤȤߤϡƥƥ㤫ΩƤΤǤ

    HEAD, CORE_FILES, LIBS
    LINKFLAGS

        ѿƤΤƥ˰¸ʤ濴Ūʬ
        Ǿ Makefile 졢ʳΤΤ ƥ
        Makefile ɲäޤ$(HEAD)  $(LINKFLAGS) ϥƥ
        Makefile 뤳ȤդƤ (ƤɲäǤϤ
        ) 

        :

                # arch/m68k/Makefile

                ifndef CONFIG_SUN3
                LINKFLAGS = -T $(TOPDIR)/arch/m68k/vmlinux.lds
                else
                LINKFLAGS = -T $(TOPDIR)/arch/m68k/vmlinux-sun3.lds -N
                endif

                ...

                ifndef CONFIG_SUN3
                HEAD := arch/m68k/kernel/head.o
                else
                HEAD := arch/m68k/kernel/sun3-head.o
                endif

                SUBDIRS += arch/m68k/kernel arch/m68k/mm arch/m68k/lib
                CORE_FILES := arch/m68k/kernel/kernel.o arch/m68k/mm/mm.o $(CORE_FILES)
                LIBS += arch/m68k/lib/lib.a



--- 5.3 vmlinux μιо

vmlinux ե򰵽̤֡ȥȥåץɤ򤫤֤η
Ȥե򤢤˥ԡ롢ȤȤ򤪤ʤ
å (о) ƥ Makefile ޤ

vmlinux μιоݤϡۤʤ륢ƥ֤ǤɸಽƤޤ
vmlinux μιоݡڤӤ򥵥ݡȤ륢ƥ (ͥ
С 2.4.0-test6-pre5 ˤ) ΥꥹȤ򤳤˵󤲤ޤ

    balo                mips
    bootimage           alpha
    bootpfile           alpha, ia64
    bzImage             i386, m68k
    bzdisk              i386
    bzlilo              i386
    compressed          i386, m68k, mips, mips64, sh
    dasdfmt             s390
    Image               arm
    image               s390
    install             arm, i386
    lilo                m68k
    msb                 alpha, ia64
    my-special-boot     alpha, ia64
    orionboot           mips
    rawboot             alpha
    silo                s390
    srmboot             alpha
    tftpboot.img        sparc, sparc64
    vmlinux.64          mips64
    vmlinux.aout        sparc64
    zImage              arm, i386, m68k, mips, mips64, ppc, sh
    zImage.initrd       ppc
    zdisk               i386, mips, mips64, sh
    zinstall            arm
    zlilo               i386
    znetboot.initrd     ppc



--- 5.4 ɬܤȤʤ륢ƥͭΥå

ƥ Makefile Ǥϡ˼ƥͭΥåȤ
ʤФʤޤ󡣤ΥåȤϡǾ Makefile б
륿åȤФơƥͭư󶡤ΤǤ

    archclean           clean
    archdep             dep
    archmrproper        mrproper



=== 6 ֥ǥ쥯ȥ Makefile ι¤

֥ǥ쥯ȥ Makefile ˤ 5 ĤΥ󤬤ޤ



--- 6.1 

ǽΥϥȥإåǤC եԽƤ
ȤƱ褦˵Ҥޤ"/* ... */" ǤϤʤ"# ..." 
Ȥޤ礦ŪˡإåѹĤʤޤޡ¿
ͥ͡ Makefile ԽƤޤΥȤĤäƤ
СͭפʤΤȤʤäȤǤ礦



--- 6.2 о

ܤΥϡ֥ǥ쥯ȥ Makefile 濴ʬǤ
Ǥۤե롢̤ʥѥ륪ץ󡢺ƵŪ˽
륵֥ǥ쥯ȥꡢޤϡͥѿ
(CONFIG_* ܥ) 礭¸ޤ

Ĥ Makefile ("Ť Makefile") ǤϡܤΥ
Τ褦ˤʤäƤޤ

        # drivers/parport/Makefile
        ifeq ($(CONFIG_PARPORT_PC),y)
          LX_OBJS += parport_pc.o
        else
          ifeq ($(CONFIG_PARPORT_PC),m)
            MX_OBJS += parport_pc.o
          endif
        endif

ۤȤɤ Makefile (" Makefile") ǤϡܤΥ
Τ褦ˤʤäƤޤ

        # drivers/block/Makefile
        obj-$(CONFIG_MAC_FLOPPY)        += swim3.o
        obj-$(CONFIG_BLK_DEV_FD)        += floppy.o
        obj-$(CONFIG_AMIGA_FLOPPY)      += amiflop.o
        obj-$(CONFIG_ATARI_FLOPPY)      += ataflop.o

 Makefile Τۤʷǡεǽ (İʾΥե
ͭˤ CONFIG_* ץʤ) ˴ؤƤϡưפǤɤ
Ǥ褤ΤʤС Makefile 򵭽ҤƤ



--- 6.3 Ĵ

ܤΥϡĴǤŤ Makefile ˤϡ
λܤΥ¸ߤޤ󡣿 Makefile Ǥϡ
ѿŤѿѴ뤿귿ɤܤ
˵ҤޤȤΤϡRules.make Ťѿ
ǤʤǤ

ˤĤƤϡ8.2  ("ŤؤѴ") 򻲾ȤƤ



--- 6.4 Rules.make 

4 ܤΥϡΰԤǤ

        include $(TOPDIR)/Rules.make



--- 6.5 ̤ʵ§

5 ܤΥˤϡRules.make ζ̵§ˤϴޤޤƤʤ̤
Makefile §򵭽Ҥޤ



=== 7 Rules.make ѿ

Rules.make θ󥿡եϡѿǹƤޤ



--- 7.1 ֥ǥ쥯ȥ

    ALL_SUB_DIRS, SUB_DIRS, MOD_IN_SUB_DIRS, MOD_SUB_DIRS

        $(ALL_SUB_DIRS) ˤϡǥ쥯ȥ "" Υ֥ǥ쥯ȥ
        ̵˥ꥹȥåפޤΥꥹȤϡͥ빽Ƥ˰¸
        ƤϤޤ

        $(SUB_DIRS) ˤϡvmlinux ˴Ϣ륳ɤޤॵ֥ǥ쥯ȥ
        ꥹȥåפޤΥꥹȤϡͥ빽Ƥ˰¸
        Ƥ⹽ޤ

        ͥ⥸塼ۤǽΤ륵֥ǥ쥯ȥϡ
        $(MOD_SUB_DIRS)  $(MOD_IN_SUB_DIRS) ˥ꥹȥåפޤ
        ɤѿ⡢ޤäƱ̣Ǥ (С 2.2 
        ͥǤϡѿˤϰۤʤ̣ͿƤᡢ
        ̡̾դƤޤ) 

        ɤǤ $(MOD_SUB_DIRS) Ȥޤ礦$(MOD_IN_SUB_DIRS) 
        侩ޤ

        :

                # fs/Makefile
                ALL_SUB_DIRS = coda minix ext2 fat msdos vfat proc isofs nfs \
                               umsdos ntfs hpfs sysv smbfs ncpfs ufs efs affs \
                               romfs autofs hfs lockd nfsd nls devpts devfs \
                               adfs partitions qnx4 udf bfs cramfs openpromfs \
                               autofs4 ramfs jffs
                SUB_DIRS :=

                ...

                ifeq ($(CONFIG_EXT2_FS),y)
                SUB_DIRS += ext2
                else
                  ifeq ($(CONFIG_EXT2_FS),m)
                  MOD_SUB_DIRS += ext2
                  endif
                endif

                ifeq ($(CONFIG_CRAMFS),y)
                SUB_DIRS += cramfs
                else
                  ifeq ($(CONFIG_CRAMFS),m)
                  MOD_SUB_DIRS += cramfs
                  endif
                endif

        :

                # drivers/net/Makefile
                SUB_DIRS     :=
                MOD_SUB_DIRS :=
                MOD_IN_SUB_DIRS :=
                ALL_SUB_DIRS := $(SUB_DIRS) fc hamradio irda pcmcia tokenring \
                                wan sk98lin arcnet skfp tulip appletalk

                ...

                ifeq ($(CONFIG_IRDA),y)
                SUB_DIRS += irda
                MOD_IN_SUB_DIRS += irda
                else
                  ifeq ($(CONFIG_IRDA),m)
                  MOD_IN_SUB_DIRS += irda
                  endif
                endif

                ifeq ($(CONFIG_TR),y)
                SUB_DIRS += tokenring
                MOD_IN_SUB_DIRS += tokenring
                else
                  ifeq ($(CONFIG_TR),m)
                  MOD_IN_SUB_DIRS += tokenring
                  endif
                endif



--- 7.2 оݤȤʤ륪֥ȥե

    O_TARGET, O_OBJS, OX_OBJS

        ֥ǥ쥯ȥ Makefile Ǥϡvmlinux ѤΥ֥ȥե
        $(O_OBJS)  $(OX_OBJS) ȤꥹȤ˻ꤷޤΥꥹȤ
        ͥ빽Ƥ˰¸ޤ

        "OX_OBJS"  "X" ϡ"eXport" ̣ޤ$(OX_OBJS) ˥ꥹ
        åפ줿եǤϡ֥륫ͥ⥸塼뤫黲
        ǽʸܥ뤿ᡢEXPORT_SYMBOL ޥѤ
        Ƥ⹽ޤ󡣰$(O_OBJS) ˥ꥹȥåפ줿եǤϡ
        EXPORT_SYMBOL ѤƤϤޤ (Ƥߤʬޤ
        Ѥʥ顼åϤޤ) 

        [ ä̤ꡢȤǤʤȤ򤹤ΤϥХƤޤ
          ΤˡܥƤ뤫ʤ˴طʤƤ
          ֥Ȥ $(OX_OBJS) ˥ꥹȥåפƤޤȤ
          ǤǤ礦եԽ뤿Ӥˡ
          ɲäΥѥȤ̤ȯƤޤȤȤˡ
          ʤⵤդ뤳ȤǤ礦 CONFIG_MODVERSIONS
          ΤǤ ]

        Ͽؿ (pci_register_driver, pm_register ʤ) ͳǤۤ
        ֥ȤϤǡϡEXPORT_SYMBOL ǥޡɬפ
        ޤϿؿͳǥǡϤ륪֥Ȥ⡢
        Ȥܥ򥨥ݡȤƤʤΤǤС$(OX_OBJS) 
        ꥹȥåפɬפϤޤ

        Rules.make ˤꡢƤ $(O_OBJS) ե롢$(OX_OBJS) ե뤬
        ѥ뤵ޤ³ "$(LD) -r" ¹Ԥ졢Υե
        $(O_TARGET) Ȥ̾ñ .o ե˥ޡޤǾ
        Makefile ˤ $(O_TARGET) Ȥ̾ޤ

        $(O_OBJS)  $(OX_OBJS) Υեν֤ϽפǤ$(OX_OBJS) 
        ꥹȥåפƤե뤬¤Ǥ֤ǡޤƬ֤
        ޤˡ$(O_OBJS) ˥ꥹȥåפƤե뤬
        ޤ¤Ǥ֤ˡ³ޤꥹ˽ʣäƤ⹽ޤ
        ǽΥ󥹥󥹤Τߤ $(O_TARGET) ˥󥯤졢³
        󥹤̵뤵ޤ (ʣ뤳ȤФ Rules.make ٹ
        Ϥ뤫⤷ޤ󤬡ʤ⤢ޤ) 

        :

                # arch/alpha/kernel/Makefile
                O_TARGET := kernel.o
                O_OBJS   := entry.o traps.o process.o osf_sys.o irq.o \
                            irq_alpha.o signal.o setup.o ptrace.o time.o \
                            semaphore.o
                OX_OBJS  := alpha_ksyms.o

                ifdef CONFIG_SMP
                O_OBJS   += smp.o irq_smp.o
                endif

                ifdef CONFIG_PCI
                O_OBJS   += pci.o pci_iommu.o
                endif

        Ȥ֥ǥ쥯ȥ Makefile  $(O_TARGET) Ƥ
        ȤƤ⡢ $(O_TARGET)  vmlinux Ȥ߹फɤϡ
        .config ץ椹뤳ȤǤޤ $(M_OBJS) 
        򻲾ȤƤ

        $(O_OBJS) ˤ $(OX_OBJS) ˴ޤޤեνդ
        Ȥ򵯤Ȥޤäˡ֤פʸĽ
        $(O_OBJS)  $(OX_OBJS) Υե __initcall 
        ޤޤƤȤʤޤդ˲ݤ뤳Τ褦
        򤱤뤿ᡢ$(OX_OBJS) ޤäȤ鷺
        $(MIX_OBJS) ȤȤǤޤ

        ˡȤϡ˵ĤƤ

         - vmlinux ˥󥯤륪֥Ȥơ֤
           $(O_OBJS) ˥ꥹȥåפ뤳

         - ⥸塼Ȥƺ륪֥Ȥ $(M_OBJS) 
           ꥹȥåפ뤳

         - ܥ򥨥ݡȤ륪֥Ȥ $(MIX_OBJS) 
           ꥹȥåפ뤳

        ˡϡvmlinux ˤ륪֥ȥեνդ
        ٤ǤȤݡȤ뤫ʤ
        Ťʬݻ뤳ȤƱ̤ޤ



--- 7.3 оݤȤʤ饤֥ե

    L_TARGET, L_OBJS, LX_OBJS

        ѿϡO_* ƱͤǤٽҤ٤ޤȡ$(L_OBJS) 
        $(LX_OBJS) ˤϡ󥫡ͥѤΥ֥ȥեꥹ
        åפޤΥꥹȤϡλǤΥͥ빽
        Ƥ˰¸ޤޤEXPORT_SYMBOL ƤӽФեϡ
        "X" ꥹȤ˴ޤ褦ˤޤ

        㤤ϡ"L"  "Library" (饤֥) ̣ƤȤǤ
        $(L_OBJS)  $(LX_OBJS) 塢Rules.make ǤϤΥե
        ˡ"$(AR) rcs" Ȥޥɤ $(L_TARGET) Ȥ̾ĥ
        ֥ե (饤֥) ޤ $(L_TARGET) Ȥ
        ѿϡǾ Makefile ˤ⤢ޤ

        :

                # arch/i386/lib/Makefile
                L_TARGET = lib.a
                L_OBJS  = checksum.o old-checksum.o delay.o \
                        usercopy.o getuser.o putuser.o iodebug.o

                ifdef CONFIG_X86_USE_3DNOW
                L_OBJS += mmx.o
                endif

                ifdef CONFIG_HAVE_DEC_LOCK
                L_OBJS += dec_and_lock.o
                endif

        $(L_OBJS)  $(LX_OBJS) Υեν֤ϽפǤϤޤ
        ꥹ˽ʣäƤ⹽ޤ (ʣ뤳ȤФ
        Rules.make ٹåϤ뤫⤷ޤ󤬡ʤ
        ⤢ޤ) 

        ֥ǥ쥯ȥ Makefile Ǥϡ$(O_TARGET) ⤷ $(L_TARGET) 
        ɤ餫⤷ξǤޤʲǤϡΰ㤤ˤĤ
        Ҥ٤ƤȻפޤ

        $(O_TARGET) Υեơ󥫡ͥ륤᡼˴ޤޤ
        ȤݾڤƤޤ$(L_TARGET) ξϡ¾Υե뤫
        ̤ܥ뻲Ȥ褹뤳ȤǤեΤߡvmlinux 
        ޤޤ뤳Ȥˤʤޤ

        Ūʥ󥯥ץǤϡ󥫤ϥ֥ȥե
        ̤賰ܥΥꥹȤޤθ塢󥫤Ϥ
        ܥ褹뤿ᡢ饤֥귲򸡺ޤ¤С
        Linux ͥ⡢ĤƤƱ褦˥饤֥Υɤȥ
        Ƥޤ

        Τ褦ˡǥ饤֥꤫ФȤΤǤʤ
        ֥ȥե뤬vmlinux ˤ¸ߤޤ

            (1)  EXPORT_SYMBOL ޤ४֥ȥե
            (2) (롼ƤӽФƤ餦ΤǤϤʤ)
                module_init ⤷ __initcall ˥饤
                륪֥ȥե

        ΥեˤϡŪ˸ƤӽФʤƤ⡢ɤ
        ǡ󶡤뤳ȤΤǤΩ󤬤
        ޤ⤷⡢Υե $(L_TARGET) 饤֥
        ޤƤޤȡvmlinux ˥󥯤Ȥ˼ԤƤޤ
        礦ΤᡢۤȤɤΥ֥ǥ쥯ȥ Makefile Ǥ
        $(O_TARGET) ꤷ$(L_TARGET) ϻȤʤ褦ˤƤޤ

        ¾ιθ: $(O_TARGET) ˤƤȳȯκƥ
        ᤯ʤޤǤʤܥ뤬ä
        ˤϡ$(L_TARGET) ˤۤͭפʥ顼å
        뤳ȤǤޤ



--- 7.4 оݤȤʤ֥⥸塼

    M_OBJS, MX_OBJS

        ֥륫ͥ⥸塼Ȥƹۤ륪֥ȥեϡ
        $(M_OBJS)  $(MX_OBJS) ǻꤷޤ¾Ʊ褦ˡ$(MX_OBJS) 
        "X"  "eXport" ̣ޤEXPORT_SYMBOL Ѥ륽
        ե $(MX_OBJS) ꥹȤƤʤФʤޤ

        ⥸塼ϡġޤʣΥե뤫鹽ۤޤ
        ե뤬Ĥξϡ֥ǥ쥯ȥ Makefile Ǥϡ
        $(M_OBJS) ޤ $(MX_OBJS) ΤΤɤ餫Ŭڤʤۤ
        ΥեɲäǺѤߤޤ

        :

                # drivers/net/irda/Makefile
                ifeq ($(CONFIG_IRTTY_SIR),y)
                L_OBJS += irtty.o
                else
                  ifeq ($(CONFIG_IRTTY_SIR),m)
                  M_OBJS += irtty.o
                  endif
                endif

                ifeq ($(CONFIG_IRPORT_SIR),y)
                LX_OBJS += irport.o
                else
                  ifeq ($(CONFIG_IRPORT_SIR),m)
                  MX_OBJS += irport.o
                  endif
                endif

        ͥ⥸塼뤬ʣΥե뤫鹽ۤϡ
        ե뷲ꤹĤˡޤĤϡ
        ǥ쥯ȥΤǰĤΥ⥸塼ۤˡǤ
        ˡϡե륷ƥͥåȥץȥ륹åǤ
        褯ȤƤޤ

        :

                # fs/ext2/Makefile
                O_TARGET := ext2.o
                O_OBJS   := acl.o balloc.o bitmap.o dir.o file.o fsync.o \
                            ialloc.o inode.o ioctl.o namei.o super.o symlink.o \
                            truncate.o
                M_OBJS   := $(O_TARGET)

        Ǥϡ⥸塼̾ ext2.o ˤʤޤ
        $(O_TARGET) Ʊ̾ʤΤǡRules.make  $(O_TARGET)
        §Ѥ ext2.o ۤ뤳Ȥˤʤޤ 
        $(O_OBJS) եΥꥹȤФ "$(LD) -r" ¹Ԥ
        Ȥˤʤޤ

        Υ֥ǥ쥯ȥ Makefile Ǥ $(O_TARGET)  $(M_OBJS) 
        ξƤ뤳ȤդƤ̤ fs/Makefile
        ˤ楳ɤˤꡢɤ餫򤵤ޤ
        CONFIG_EXT2_FS=y ξϡfs/Makefile ˤ $(O_TARGET) 
        ޤCONFIG_EXT_FS=m ξϡ $(M_OBJS) ۤ
        ޤ (Τˤˡϼ㴳ˤ򾷤⤢ޤ)



--- 7.5 ʣ⥸塼

    MI_OBJS, MIX_OBJS

        ʣΥ֥ȥե뤬󥯤졢ĤΥͥ
        ⥸塼⤢ޤɬ
        ֥ǥ쥯ȥƤΥ֥ȥե뤬ޤޤ
        Ȥ櫓ǤϤޤ󡣤ϡ$(MI_OBJS) 
        $(MIX_OBJS) Ȥޤ

        "M" ϡ⥸塼̣ޤ
        "I" ϡ֤̣ޤ
        "X" ϡĤΤ褦ˡ"eXport ܥ" ̣ޤ

        :

                # drivers/sound/Makefile
                gus-objs  := gus_card.o gus_midi.o gus_vol.o gus_wave.o ics2101.o
                pas2-objs := pas2_card.o pas2_midi.o pas2_mixer.o pas2_pcm.o
                sb-objs   := sb_card.o

                gus.o: $(gus-objs)
                        $(LD) -r -o $@ $(gus-objs)

                pas2.o: $(pas2-objs)
                        $(LD) -r -o $@ $(pas2-objs)

                sb.o: $(sb-objs)
                        $(LD) -r -o $@ $(sb-objs)

        ͥ⥸塼 gus.o, pas2.o, sb.o ϡعե٤Ǥ
        ֥ȥե gus_card.o, gus_midi.o, gus_vol.o,
        gus_wave.o, ics2101.o, pas2_card.o, pas2_midi.o, pas2_mixer.o,
        pas2_pcm.o, sb_card.o ϡإݡͥȥե٤Ǥ
        ݡͥȥեϡ֥ե٤ȤƤФޤ

        drivers/sound/Makefile Τ¾ʬ (嵭ˤϼƤ
        ) ǤϡƤΥݡͥȥեʬ䤵Ƥޤ
        ɥ饤Фξ硢ݡͥȥ֥ȥեϡܥ
        ݡȤ뤫ɤ˽ä $(O_OBJS)  $(OX_OBJS) ˥ꥹ
        åפޤơե뤬ۤ뤳ȤϷ褷Ƥ
        ޤ󡣰ͥ⥸塼ξϡݡͥȥ֥
        ȥե $(MI_OBJS)  $(MIX_OBJS) ˥ꥹȥåפ졢
        ιե뤬 $(M_OBJS) ֤ޤ

        ʣΥ֥ȥեǹ⥸塼ۤ
        ϡ֥ǥ쥯ȥ Makefile ǤѤΥ󥯵§
        ꤷƤʤФʤޤ

                # drivers/sound/Makefile

                gus.o: $(gus-objs)
                        $(LD) -r -o $@ $(gus-objs)

                pas2.o: $(pas2-objs)
                        $(LD) -r -o $@ $(pas2-objs)

                sb.o: $(sb-objs)
                        $(LD) -r -o $@ $(sb-objs)


        7.2  ("оݤȤʤ륪֥ȥե") ǤҤ٤Ȥꡢ
        ܥ򥨥ݡȤƤΥ֥ȥեñ
        $(MIX_OBJS) ˥ꥹȥåפ뤳ȤǤޤˡä
        ϡ$(O_OBJS), $(L_OBJS), $(M_OBJS), $(MI_OBJS) ˤ줾졢
        vmlinux ֥ȥե롢饤֥ꥪ֥ȥե롢
        ⥸塼륪֥ȥե롢֥⥸塼եñ
        ꥹȥåפ뤳Ȥˤʤޤ$(MI_OBJS)  $(MIX_OBJS) 
        եνʣäƤ⡢ˤϤʤޤ



--- 7.6 ѥե饰

    EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS

        $(CC)  C ե򥳥ѥ뤹Ȥ˻Ѥ륪ץ
        $(EXTRA_CFLAGS) ǻꤷޤѿǻꤵ줿ץϡ
        ȥǥ쥯ȥΥեоݤȤƤ $(CC) 
        ɤŬѤޤ

        :

                # drivers/sound/emu10k1/Makefile
                EXTRA_CFLAGS += -I.
                ifdef DEBUG
                    EXTRA_CFLAGS += -DEMU10K1_DEBUG
                endif

        $(EXTRA_CFLAGS) ϡȥǥ쥯ȥΥ֥ǥ쥯ȥˤ
        ŬѤޤ󡣤ޤ$(HOSTCC) ǥѥ뤵եˤ
        ŬѤޤ

        ѿ $(CFLAGS) ϥĥ꡼ΤΥѥե饰Ѥ˺Ǿ
        Makefile ǻѤƤΤǡ $(EXTRA_FLAGS) Ȥѿ
        ɬפȤʤޤ

        ֥꥽򥳥ѥ뤹뤿γƥǥ쥯ȥѥץ
        ȤơƱ褦 $(EXTRA_AFLAGS) ¸ߤޤ

        : ʸ򵭽ҤƤʳǤϡºݤΥͥ륽
        $(EXTRA_AFLAGS) ѤƤϤޤǤ

        $(LD), $(AR) ˤĤƤ⡢ƥǥ쥯ȥΥץȤ
        Ʊͤ $(EXTRA_LDFLAGS), $(EXTRA_ARFLAGS) ѰդƤޤ

        : ʸ򵭽ҤƤʳǤϡºݤΥͥ륽
        $(EXTRA_LDFLAGS), $(EXTRA_ARFLAGS) ѤƤϤ
        Ǥ

    CFLAGS_$@, AFLAGS_$@

        $(CC) Ѥƥѥ뤹Ȥγƥեѥץ
        $(CFLAGS_$@) ǻꤷޤ$@ ʬϡѥˤ
        եΥե̾ˤʤޤ

        :

                # drivers/scsi/Makefile
                CFLAGS_aha152x.o =   -DAHA152X_STAT -DAUTOCONF
                CFLAGS_gdth.o    = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
                                     -DGDTH_STATISTICS
                CFLAGS_seagate.o =   -DARBITRATE -DPARITY -DSEAGATE_USE_ASM

        嵭 3 Ԥˤꡢaha152x.o, gdth.o, seagate.o ѤΥѥ
        ե饰ꤵ뤳Ȥˤʤޤ

        ֥쥽եѤˤ⡢Ʊ褦 $(AFLAGS_$@) 
        ¸ߤޤ

        :

                # arch/arm/kernel/Makefile
                AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
                AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional

        Rules.make ˤϡѥ뤹Ȥ˻Ȥ $(CFLAGS_$@) ͤ
        ֥ȥե¸뵡ǽޤ ($(CFLAGS) 
        $(EXTRA_CFLAGS) ͤˤ¸ޤ)ǤΤǡեѤ
        $(CFLAGS_$@) ͤMakefile Խ뤫⤷¾β餫
        ˡѹ硢Rules.make ưץ
        ե뤬ƥѥ뤵뤳Ȥˤʤޤ

        : Rules.make ΰ¸طˤꡢ֥ե
        ե饰˰¸ޤ󡣤ǤΤǡ$(AFLAGS_$@) ѹ硢
        ƥѥ뤹뤿ˤϥ֥ȥեɬפޤ

    LD_RFLAG

        ѿϻѤƤޤƤϤޤ󡣲˹Ԥ줿
        ̾ĤΤ褦Ǥ



--- 7.7 ¾ѿ

    IGNORE_FLAGS_OBJS

        ե饰ѹưŪפư¸ݤġȤǽŬ
        ʤ֥ȥեϡ$(IGNORE_FLAGS_OBJS) 
        ꥹȥåפޤϴ֤˹碌Ūʵǽǡե饰¸
        طμޤȤꤢ褹Τ˻ȤƤޤ
        (ϡ%.o ե뤬б %.S եޤ %.c ե
        鹽ۤΤȲꤷƥե饰¸طƤ롢
        ȤˤޤϾ櫓ǤϤޤ) 

    USE_STANDARD_AS_RULE

        ϰܹѿǤ$(USE_STANDARD_AS_RULE) 
        硢%.S ե %.o ե %.s ե (%.s
        եϳȯԤˤȤäƤΤ̣߰ޤ) ˥֥
        뤿ɸ൬§Rules.make 󶡤뤳Ȥˤʤޤ

        դ $(USE_STANDARD_AS_RULE) ƤʤȤˤϡ
        ɸ൬§ Rules.make 󶡤ޤ󡣤
        褦ʾϡ%.S ե򥢥֥뤹뤿ε§
        ֥ǥ쥯ȥ Makefile ̤󶡤ʤФʤޤ

        ϡƤ Makefile ̤ %.S §󶡤Ƥޤ
         Makefile ǤϡUSE_STANDARD_AS_RULE ɸ
        Rules.make §Ȥ褦ˤ뤳Ȥ侩ޤ
        ƥ Makefile  USE_STANDARD_AS_RULE ѹ
        СˤǤ USE_STANDARD_AS_RULE ФƥȤ
        Rules.make ȤǤޤС¾Ƥ
        Makefile  USE_STANDARD_AS_RULE 뤳Ȥ
        Ǥޤ



=== 8 ѿ

ؿѿ٤ϡظŤѿ٤١ꥷץǡ
ѥեǤ̤Ȥơ¿Υ֥ǥ쥯ȥ Makefile 
60% ʾ̾뤳ȤǤޤɮԤȤƤϡƤΥ
ƥ Makefile ȥ֥ǥ쥯ȥ Makefile 䤬ƤϿ
ѴɤȹͤƤޤ

Rules.make ϿѿǤޤ󡣤Τᡢ
 Makefile ˤϤ줾졢ѿŤѿ
Ѵ뤿귿ɥ򵭽Ҥ뤳Ȥˤʤޤʤ
ۤȤɤѿؿ٤ĤġԤεҤظŤ
٤ǤʤȤ褦˺ƻȤȤǤޤ



--- 8.1 ѿ

    obj-y obj-m obj-n obj-

        ѿϡ$(O_OBJS), $(OX_OBJS), $(M_OBJS),
        $(MX_OBJS) ֤ΤǤ

        :

                # drivers/block/Makefile
                obj-$(CONFIG_MAC_FLOPPY)        += swim3.o
                obj-$(CONFIG_BLK_DEV_FD)        += floppy.o
                obj-$(CONFIG_AMIGA_FLOPPY)      += amiflop.o
                obj-$(CONFIG_ATARI_FLOPPY)      += ataflop.o

        黻Ҥκդ $(CONFIG_...) ˤִ򤪤ʤäƤ뤳Ȥ
        ܤƤȡGNU make ϢۥǥåȤ
        褦ˤʤޤ ԤŤ Makefile ǵҤ褦Ȥȡ
        줾 8 ʬΥɤˤʤäƤޤޤ

        Ƥ¹Ԥȡ֥ǥ쥯ȥ Makefile  4 Ĥ
        ꥹ $(obj-y), $(obj-m), $(obj-n), $(obj-) 
        뤳Ȥˤʤޤ

        $(obj-y)  vmlinux Ȥ߹ޤեΥꥹȤǤ
        $(obj-m) ñեΥ⥸塼Ȥƹۤե
                 ꥹȤǤ
        $(obj-n)  $(obj-) ̵뤵ޤ

        ƥꥹȤˤϡե뤬ʣƴޤޤ礬ޤʣ
        ΤϡνǼưŪ˼ޤޤե뤬
        $(obj-y)  $(obj-m) ξ˴ޤޤƤϡưŪ $(obj-m)
        ꥹȤޤ

        :

                # drivers/net/Makefile

                ...
                obj-$(CONFIG_OAKNET) += oaknet.o 8390.o
                ...
                obj-$(CONFIG_NE2K_PCI) += ne2k-pci.o 8390.o
                ...
                obj-$(CONFIG_STNIC) += stnic.o 8390.o
                ...
                obj-$(CONFIG_MAC8390) += daynaport.o 8390.o
                ...

        Ǥϡ4 Ĥΰۤʤɥ饤Ф 8390.o ΥɤɬפȤ
        ޤ⤷⡢ 4 ĤΥɥ饤ФΤĤǤ vmlinux Ȥ
        ޤ뤳ȤˤʤС8390.o  vmlinux Ȥ߹ޤ뤳Ȥ
        ʤޤΤᡢ8390.o ɬפȤ¾Υɥ饤Ф⥸塼
        ƹۤ줿ȤƤ⡢8390.o ϥ⥸塼Ȥƹ "ޤ"
        (ʤʤ顢⥸塼Υɥ饤ФǤ⡢ vmlinux ᡼
         8390.o ɤΥӥѤ뤳ȤǤ뤫Ǥ) 

    export-objs

        $(export-objs) ϡܥ򥨥ݡȤǽΤե
        ƥꥹȥåפΤǤΥꥹȤۤˡϡ
        Τ褦ˤʤޤ

            grep -l EXPORT_SYMBOL *.c

        (â󥯥롼ɤإåե뤫̩ EXPORT_SYMBOL 
        ƤӽФƤե⤢ΤǡդƤ)

        ϡޤǥܥ򥨥ݡȤǽΤե
        ꥹȥåפΤΤʤΤǡͥ빽Ƥˤϰ¸
        ޤ󡣥ܥ򥨥ݡȤեϡ $(export-objs)
        ˥ꥹȥåפޤºݤΥեΥꥹȤ $(*_OBJS) 
        $(*X_OBJS) Ȥ˿ʬϡ$(export-objs) 򸵤ˤơ귿
        ɥˤԤޤ

        иȡŤ Makefile ǥܥ򥨥ݡ
        뤫ʤŬڤ˰ݻ뤳ȤϡǤꡢְ㤤
        ˤʤޤ Makefile  $(export-objs) ꥹȤ
        ۤñǡå䤹Ǥ礦

    list-multi
    $(foo)-objs

        ʣΥ֥ȥեǹ륫ͥ⥸塼¸
        ޤ$(list-multi) ϡΤ褦ʥͥ⥸塼Υꥹ
        ǤŪʥꥹȤǤꡢͥ빽Ƥˤϰ¸
        ޤ

        $(list-multi) ˥ꥹȥåפƤ륫ͥ⥸塼ˤϡ
        줾졢Υ⥸塼륪֥ȥե
        󤷤ꥹȤޤȤСfoo.o Ȥͥ
        ⥸塼ѤΥ֥ȥեΥꥹȤϡfoo-objs 
        ʤޤ

        :

                # drivers/scsi/Makefile
                list-multi      := scsi_mod.o sr_mod.o initio.o a100u2w.o

                ...

                scsi_mod-objs   := hosts.o scsi.o scsi_ioctl.o constants.o \
                                   scsicam.o scsi_proc.o scsi_error.o \
                                   scsi_obsolete.o scsi_queue.o scsi_lib.o \
                                   scsi_merge.o scsi_dma.o scsi_scan.o \
                                   scsi_syms.o
                sr_mod-objs     := sr.o sr_ioctl.o sr_vendor.o
                initio-objs     := ini9100u.o i91uscsi.o
                a100u2w-objs    := inia100.o i60uscsi.o

        ֥ǥ쥯ȥ Makefile Ǥϡͥ빽Ƥ˽
        ̾ɤꡢ⥸塼 obj-* ꥹȤƤޤ

                obj-$(CONFIG_SCSI)              += scsi_mod.o
                obj-$(CONFIG_BLK_DEV_SR)        += sr_mod.o
                obj-$(CONFIG_SCSI_INITIO)       += initio.o
                obj-$(CONFIG_SCSI_INIA100)      += a100u2w.o

         CONFIG_SCSI=y ǤȤޤ礦ξ硢scsi_mod.o 
         14 ĤΥ֥ȥե vmlinux ˥󥯤
        ɬפޤΤᡢΥ֥ȥե $(O_OBJS)
         $(OX_OBJS) ֤뤳ȤˤʤޤơեǤ
        scsi_mod.o Ϸ褷ޤ󡣤κȤϡԤΥꥹȽ̿
        ʤ귿Ѵɤˤ¹Ԥޤ

        CONFIG_BLK_DEV_SR=m ξϤɤʤǤ礦ξϡ
        "$(LD) -r" ޥɤ 3 ĤΥ֥ȥե뤬󥯤졢
        ͥ⥸塼 sr_mod.o ޤ򤪤ʤ
        ˤϡ3 ĤΥե $(MI_OBJS)  $(MIX_OBJS) Ƥ
        ɬפޤե sr_mod.o ϡ$(M_OBJS) ֤ޤ
        κȤޤ귿Ѵɤˤ¹Ԥޤ

        CONFIG_SCSI_INITIO=n ξϡinitio.o  $(obj-n) ꥹȤ
        ǡ¾ˤϲⵯޤinitio.o 
        եϥѥ뤵줺եޤ

        Ǹˤʤޤ֥ǥ쥯ȥ Makefile ˤϡ֥
        եΥꥹȤͥ⥸塼ۤ뵬§
        Ƥɬפޤ

        :

                # drivers/scsi/Makefile

                scsi_mod.o: $(scsi_mod-objs)
                        $(LD) -r -o $@ $(scsi_mod-objs)

                sr_mod.o: $(sr_mod-objs)
                        $(LD) -r -o $@ $(sr_mod-objs)

                initio.o: $(initio-objs)
                        $(LD) -r -o $@ $(initio-objs)

                a100u2w.o: $(a100u2w-objs)
                        $(LD) -r -o $@ $(a100u2w-objs)

        ε§ϵŪ˵Ҥ뤳ȤǤޤǤΤǡ귿
        ⤷ Rules.make ˡΤ褦ʵ§ưŪ륳ɤ
        ɲäۤ褤Ǥ礦ºݤɲäޤǤϡ
        ǥ쥯ȥ Makefile Ūɬפޤ

    subdir-y subdir-m subdir-n subdir-

        ϡ$(ALL_SUB_DIRS), $(SUB_DIRS), $(MOD_SUB_DIRS) ֤
        ΤǤ

        :

                # drivers/Makefile
                subdir-$(CONFIG_PCI)            += pci
                subdir-$(CONFIG_PCMCIA)         += pcmcia
                subdir-$(CONFIG_MTD)            += mtd
                subdir-$(CONFIG_SBUS)           += sbus

        ѿ obj-* Ʊ褦ư򤷤ޤ֥
        եǤϤʤ֥ǥ쥯ȥоݤȤƤޤ

        Ƥ¹Ԥȡ֥ǥ쥯ȥ Makefile  4 Ĥ
        ꥹ $(subdir-y), $(subdir-m), $(subdir-n), $(subdir-)
         뤳Ȥˤʤޤ

        $(subdir-y) ϡ
                vmlinux Ȥ make оݤȤʤǥ쥯ȥ
                ꥹȤǤ
        $(subdir-m) ϡ
                ⥸塼Ȥ make оݤȤʤǥ쥯ȥ
                ꥹȤǤ
        $(subdir-n)  $(subdir-) ϡ
                ǥ쥯ȥ֥ǥ쥯ȥΥꥹȤȤ
                ŪΤ˻Ѥޤ

        subdir-y ʳΥꥹȤˤϡǥ쥯ȥ꤬ʣƴޤޤƤƤ
        ޤ󡣽ʣƤΤϡνǼưŪ˼ޤ

    mod-subdirs

        $(subdir-y) ˥ꥹȥåפ줿ȤˡƱ $(subdir-m) ˤ
        ꥹȥåפ褦ˤǥ쥯ȥϡ$(mod-subdirs) 
        Ƥޤ

        :

                # fs/Makefile
                mod-subdirs :=  nls

        ξ硢CONFIG_NFS = y ʤСnls  $(subdir-y) 
        $(subdir-m) ˲ä뤳Ȥˤʤޤ



--- 8.2 ŤؤѴ

         drivers/usb/Makefile äƤΤǤǤϡ
        OX_OBJS  MX_OBJS Ȥʤ褦ˤ뤿ᡢޤ$(obj-y) 
        ֥Ȥν֤뤿ᡢMIX_OBJS ѤƤޤ

                # Rules.make ꥹȤѴ
                multi-used      := $(filter $(list-multi), $(obj-y) $(obj-m))
                multi-obj       := $(foreach m, $(multi-used), $($(basename $(m))-objs))
                active-objs     := $(sort $(multi-objs) $(obj-y) $(obj-m))

                O_OBJS          := $(obj-y)
                M_OBJS          := $(obj-m)
                MIX_OBJS        := $(filter $(export-objs), $(active-objs))

        drivers/acorn/scsi/Makefile ˤ饤֥⸫Ƥߤޤ礦

                # Rules.make ꥹȤѴ

                L_OBJS          := $(filter-out $(export-objs), $(obj-y))
                LX_OBJS         := $(filter     $(export-objs), $(obj-y))
                M_OBJS          := $(sort $(filter-out $(export-objs), $(obj-m)))
                MX_OBJS         := $(sort $(filter     $(export-objs), $(obj-m)))

        饤֥ǤϽ֤ϤۤɽפǤϤʤΤǡǤϤޤ
        LX_OBJS  MX_OBJS ѤƤޤMIX_OBJS Ȥä
        Τ褦˽񤭴뤳Ȥ (餯) ǤǤ礦

                active-objs     := $(sort $(obj-y) $(obj-m))
                L_OBJS          := $(obj-y)
                M_OBJS          := $(obj-m)
                MIX_OBJS        := $(filter $(export-objs), $(active-objs))


        Τۤ餫˵̤ʤƺѤߤޤä
        ƤȸǤ礦



=== 9 Linux ͥ 2.2 Ȥθߴ

ĲѹˤʤäΤ򼨤ϲ⤢ޤ󤬡Υɥ
ξΤۤȤɤϡ2.2 ˤŬѤǤޤʲˡLinux ͥ 2.2
ȸߴΤ륵֥ǥ쥯ȥ Makefile 񤯤ΥҥȤ󤲤褦
פޤ

Ť Makefile, ޤ귿ĴĿ
Makefile, ɤ񤤤Ƥ⹽ޤ귿ɤϡͥ 2.2 
drivers/sound/Makefile ʤɤ饳ԡФ褤Ǥ礦

2.2  Rules.make Ǥϡ$(MOD_SUB_DIRS)  $(MOD_IN_SUB_DIRS) 
Τ˶̤Ƥޤ֥ǥ쥯ȥʤñΥǥ쥯ȥ
ʤСΤȤˤϤʤޤ󡣤äꤷڹ¤
äƤϡ$(MOD_SUB_DIRS)  $(MOD_IN_SUB_DIRS) ΰ㤤
ǧƤɬפޤ$(MOD_SUB_DIRS) Υ fs/Makefile
ˡ$(MOD_IN_SUB_DIRS) Υ drivers/net/Makefile 
ϰϤˤ錄ä¸ߤΤǡ򻲾ȤȤ褤Ǥ礦

 MOD_LIST_NAME ѤƤϡΤޤ޻Ȥ³Ƥ
ޤ MOD_LIST_NAME ѤƤʤϡȤʤ褦ˤƤ
ξ硢⥸塼 2.2 Ǥΰ 'misc' ⥸塼
Ȥʤޤ

2.2 Ǥϡ֥Ѥε§Ϥ㤴㤷Ƥޤ֥
Υե뤬ϡƥե뤴Ȥε§ʬŪ˵
뤳Ȥ򤪴ᤷޤ



=== 10 ռ

ʸΥɥեȤӥ塼Ƥ줿ȤФơlinux-kbuild
᡼󥰥ꥹȤΥСä Peter Samuelson  Thomas
Molina ˴դޤ
