MakefileMakefile 의 구조 및 기능의 구조 및 기능 (Linux-2.6.10 version)(Linux-2.6.10 version)
MakefileMakefile 의 구조의 구조  OverviewOverview  Who does whatWho does what  Important check kbuild filesImportant check kbuild files  Observe Makefiles sourceObserve Makefiles source
overviewoverview  Top makefileTop makefile  .config.config  Arch/$(ARCH)/MakefileArch/$(ARCH)/Makefile  Script/MakefileScript/Makefile  Kbuild makefilesKbuild makefiles
Top makefileTop makefile  The top makefile reads the .config fileThe top makefile reads the .config file  Two major product :Two major product :  Vmlinux(the resident kernel image)Vmlinux(the resident kernel image)  Modules(any module files)Modules(any module files)
.config & arch makefile.config & arch makefile  .config file.config file  From kernel configuration processFrom kernel configuration process  Get list of subderectoriesGet list of subderectories  Arch makefileArch makefile  Supplies architecture specific informationSupplies architecture specific information
Script & kbuild makefileScript & kbuild makefile  Script makefileScript makefile  Contains all the definitions/rules etcContains all the definitions/rules etc  Kbuild makefileKbuild makefile  Build any built-in or modular targetsBuild any built-in or modular targets  Uses from the .config fileUses from the .config file
Who does whatWho does what  Users : people(build kernels)Users : people(build kernels)  Normal developersNormal developers  Make features(device drivers, file systems,Make features(device drivers, file systems, network protocols)network protocols)  Arch developersArch developers  Make entire architecture(sparc or ia64..etc)Make entire architecture(sparc or ia64..etc)  Kbuild developersKbuild developers  Make kernel build system itselfMake kernel build system itself
Check important kbuild filesCheck important kbuild files  Goal definitionsGoal definitions  Contain files to built, compilation options,Contain files to built, compilation options, and any subdirectories..etcand any subdirectories..etc  Built-in object goals(obj-y)Built-in object goals(obj-y)  Object file to compileObject file to compile  Loadable module goals(obj-m)Loadable module goals(obj-m)  Library file goals(lib-y)Library file goals(lib-y)  Library to built-in object files for modulesLibrary to built-in object files for modules and combineand combine
Makefiles source 1Makefiles source 1  MRPROPER_DIRS += include/config include2MRPROPER_DIRS += include/config include2  MRPROPER_FILES += .config .config.old include/asm .version MRPROPER_FILES += .config .config.old include/asm .version  include/linux/autoconf.h include/linux/version.h include/linux/autoconf.h include/linux/version.h  Module.symvers tags TAGS cscope*Module.symvers tags TAGS cscope*  mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))  mrproper: rm-files := $(wildcard $(MRPROPER_FILES))mrproper: rm-files := $(wildcard $(MRPROPER_FILES))  mrproper-dirs := $(addprefix_mrproper_,Documentation/DocBook scripts)mrproper-dirs := $(addprefix_mrproper_,Documentation/DocBook scripts)  .PHONY: $(mrproper-dirs) mrproper archmrproper.PHONY: $(mrproper-dirs) mrproper archmrproper  $(mrproper-dirs):$(mrproper-dirs):  $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)  mrproper: clean archmrproper $(mrproper-dirs)mrproper: clean archmrproper $(mrproper-dirs)  $(call cmd,rmdirs)$(call cmd,rmdirs)  $(call cmd,rmfiles)$(call cmd,rmfiles)
Makefile source 2Makefile source 2  include/config/MARKER: include/linux/autoconf.hinclude/config/MARKER: include/linux/autoconf.h  include $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIGinclude $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIG  init-yinit-y := init/:= init/  drivers-ydrivers-y := drivers/ sound/:= drivers/ sound/  net-ynet-y := net/:= net/  libs-ylibs-y := lib/:= lib/  core-ycore-y := usr/:= usr/  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,-+= $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,- functions)functions)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels)+= $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops)+= $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps)+= $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps)  CFLAGSCFLAGS += -fno-omit-frame-pointer+= -fno-omit-frame-pointer  elseelse  CFLAGSCFLAGS += -fomit-frame-pointer+= -fomit-frame-pointer  CFLAGSCFLAGS += -g+= -g
Makefiles source 3Makefiles source 3  clean: rm-dirs := $(CLEAN_DIRS)clean: rm-dirs := $(CLEAN_DIRS)  clean: rm-files := $(CLEAN_FILES)clean: rm-files := $(CLEAN_FILES)  clean-dirs := $(addprefix _clean_,$(vmlinux-clean-dirs := $(addprefix _clean_,$(vmlinux- alldirs))alldirs))  .PHONY: $(clean-dirs) clean archclean.PHONY: $(clean-dirs) clean archclean  $(clean-dirs):$(clean-dirs):  $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,$(Q)$(MAKE) $(clean)=$(patsubst _clean_%, %,$@)%,$@)  clean: archclean $(clean-dirs)clean: archclean $(clean-dirs)
Makefile source 4Makefile source 4  core-ycore-y += kernel/ mm/ fs/ ipc/ security/ crypto/+= kernel/ mm/ fs/ ipc/ security/ crypto/  vmlinux-dirsvmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m)  $(core-y) $(core-m) $(drivers-y) $(drivers-m) $(core-y) $(core-m) $(drivers-y) $(drivers-m)  $(net-y) $(net-m) $(libs-y) $(libs-m)))$(net-y) $(net-m) $(libs-y) $(libs-m)))  vmlinux-alldirsvmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/,  $(init-n) $(init-) $(init-n) $(init-)  $(core-n) $(core-) $(drivers-n) $(drivers-) $(core-n) $(core-) $(drivers-n) $(drivers-)  $(net-n) $(net-) $(libs-n) $(libs-))))$(net-n) $(net-) $(libs-n) $(libs-))))  init-yinit-y := $(patsubst %/, %/built-in.o, $(init-y)):= $(patsubst %/, %/built-in.o, $(init-y))  core-ycore-y := $(patsubst %/, %/built-in.o, $(core-y)):= $(patsubst %/, %/built-in.o, $(core-y))  drivers-ydrivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)):= $(patsubst %/, %/built-in.o, $(drivers-y))  net-ynet-y := $(patsubst %/, %/built-in.o, $(net-y)):= $(patsubst %/, %/built-in.o, $(net-y))  libs-y1libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)):= $(patsubst %/, %/lib.a, $(libs-y))  libs-y2libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)):= $(patsubst %/, %/built-in.o, $(libs-y))  libs-ylibs-y := $(libs-y1) $(libs-y2):= $(libs-y1) $(libs-y2)  vmlinux-init := $(head-y) $(init-y)vmlinux-init := $(head-y) $(init-y)  vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)  vmlinux-all := $(vmlinux-init) $(vmlinux-main)vmlinux-all := $(vmlinux-init) $(vmlinux-main)  vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.ldsvmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds  kallsyms.o := .tmp_kallsyms$(last_kallsyms).okallsyms.o := .tmp_kallsyms$(last_kallsyms).o
Makefile source 5Makefile source 5  vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCEvmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE  $(call if_changed_rule,vmlinux__)$(call if_changed_rule,vmlinux__)  $(vmlinux-dirs): prepare-all scripts$(vmlinux-dirs): prepare-all scripts  $(Q)$(MAKE) $(build)=$@$(Q)$(MAKE) $(build)=$@  modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)  @echo ' Building modules, stage 2.';@echo ' Building modules, stage 2.';  $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost  @rm -rf $(MODLIB)/kernel@rm -rf $(MODLIB)/kernel  @rm -f $(MODLIB)/source@rm -f $(MODLIB)/source  @mkdir -p $(MODLIB)/kernel@mkdir -p $(MODLIB)/kernel  @ln -s $(srctree) $(MODLIB)/source@ln -s $(srctree) $(MODLIB)/source  @if [ ! $(objtree) -ef $(MODLIB)/build ]; then @if [ ! $(objtree) -ef $(MODLIB)/build ]; then  rm -f $(MODLIB)/build ; rm -f $(MODLIB)/build ;  ln -s $(objtree) $(MODLIB)/build ; ln -s $(objtree) $(MODLIB)/build ;  fifi  $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst
2005_Structures and functions of Makefile
2005_Structures and functions of Makefile
2005_Structures and functions of Makefile
2005_Structures and functions of Makefile

2005_Structures and functions of Makefile

  • 1.
    MakefileMakefile 의 구조및 기능의 구조 및 기능 (Linux-2.6.10 version)(Linux-2.6.10 version)
  • 2.
    MakefileMakefile 의 구조의구조  OverviewOverview  Who does whatWho does what  Important check kbuild filesImportant check kbuild files  Observe Makefiles sourceObserve Makefiles source
  • 3.
    overviewoverview  Top makefileTopmakefile  .config.config  Arch/$(ARCH)/MakefileArch/$(ARCH)/Makefile  Script/MakefileScript/Makefile  Kbuild makefilesKbuild makefiles
  • 4.
    Top makefileTop makefile The top makefile reads the .config fileThe top makefile reads the .config file  Two major product :Two major product :  Vmlinux(the resident kernel image)Vmlinux(the resident kernel image)  Modules(any module files)Modules(any module files)
  • 5.
    .config & archmakefile.config & arch makefile  .config file.config file  From kernel configuration processFrom kernel configuration process  Get list of subderectoriesGet list of subderectories  Arch makefileArch makefile  Supplies architecture specific informationSupplies architecture specific information
  • 6.
    Script & kbuildmakefileScript & kbuild makefile  Script makefileScript makefile  Contains all the definitions/rules etcContains all the definitions/rules etc  Kbuild makefileKbuild makefile  Build any built-in or modular targetsBuild any built-in or modular targets  Uses from the .config fileUses from the .config file
  • 7.
    Who does whatWhodoes what  Users : people(build kernels)Users : people(build kernels)  Normal developersNormal developers  Make features(device drivers, file systems,Make features(device drivers, file systems, network protocols)network protocols)  Arch developersArch developers  Make entire architecture(sparc or ia64..etc)Make entire architecture(sparc or ia64..etc)  Kbuild developersKbuild developers  Make kernel build system itselfMake kernel build system itself
  • 8.
    Check important kbuildfilesCheck important kbuild files  Goal definitionsGoal definitions  Contain files to built, compilation options,Contain files to built, compilation options, and any subdirectories..etcand any subdirectories..etc  Built-in object goals(obj-y)Built-in object goals(obj-y)  Object file to compileObject file to compile  Loadable module goals(obj-m)Loadable module goals(obj-m)  Library file goals(lib-y)Library file goals(lib-y)  Library to built-in object files for modulesLibrary to built-in object files for modules and combineand combine
  • 9.
    Makefiles source 1Makefilessource 1  MRPROPER_DIRS += include/config include2MRPROPER_DIRS += include/config include2  MRPROPER_FILES += .config .config.old include/asm .version MRPROPER_FILES += .config .config.old include/asm .version  include/linux/autoconf.h include/linux/version.h include/linux/autoconf.h include/linux/version.h  Module.symvers tags TAGS cscope*Module.symvers tags TAGS cscope*  mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))  mrproper: rm-files := $(wildcard $(MRPROPER_FILES))mrproper: rm-files := $(wildcard $(MRPROPER_FILES))  mrproper-dirs := $(addprefix_mrproper_,Documentation/DocBook scripts)mrproper-dirs := $(addprefix_mrproper_,Documentation/DocBook scripts)  .PHONY: $(mrproper-dirs) mrproper archmrproper.PHONY: $(mrproper-dirs) mrproper archmrproper  $(mrproper-dirs):$(mrproper-dirs):  $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)  mrproper: clean archmrproper $(mrproper-dirs)mrproper: clean archmrproper $(mrproper-dirs)  $(call cmd,rmdirs)$(call cmd,rmdirs)  $(call cmd,rmfiles)$(call cmd,rmfiles)
  • 10.
    Makefile source 2Makefilesource 2  include/config/MARKER: include/linux/autoconf.hinclude/config/MARKER: include/linux/autoconf.h  include $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIGinclude $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIG  init-yinit-y := init/:= init/  drivers-ydrivers-y := drivers/ sound/:= drivers/ sound/  net-ynet-y := net/:= net/  libs-ylibs-y := lib/:= lib/  core-ycore-y := usr/:= usr/  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,-+= $(call add-align,CONFIG_CC_ALIGN_FUNCTIONS,- functions)functions)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels)+= $(call add-align,CONFIG_CC_ALIGN_LABELS,-labels)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops)+= $(call add-align,CONFIG_CC_ALIGN_LOOPS,-loops)  CFLAGSCFLAGS += $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps)+= $(call add-align,CONFIG_CC_ALIGN_JUMPS,-jumps)  CFLAGSCFLAGS += -fno-omit-frame-pointer+= -fno-omit-frame-pointer  elseelse  CFLAGSCFLAGS += -fomit-frame-pointer+= -fomit-frame-pointer  CFLAGSCFLAGS += -g+= -g
  • 11.
    Makefiles source 3Makefilessource 3  clean: rm-dirs := $(CLEAN_DIRS)clean: rm-dirs := $(CLEAN_DIRS)  clean: rm-files := $(CLEAN_FILES)clean: rm-files := $(CLEAN_FILES)  clean-dirs := $(addprefix _clean_,$(vmlinux-clean-dirs := $(addprefix _clean_,$(vmlinux- alldirs))alldirs))  .PHONY: $(clean-dirs) clean archclean.PHONY: $(clean-dirs) clean archclean  $(clean-dirs):$(clean-dirs):  $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,$(Q)$(MAKE) $(clean)=$(patsubst _clean_%, %,$@)%,$@)  clean: archclean $(clean-dirs)clean: archclean $(clean-dirs)
  • 12.
    Makefile source 4Makefilesource 4  core-ycore-y += kernel/ mm/ fs/ ipc/ security/ crypto/+= kernel/ mm/ fs/ ipc/ security/ crypto/  vmlinux-dirsvmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m)  $(core-y) $(core-m) $(drivers-y) $(drivers-m) $(core-y) $(core-m) $(drivers-y) $(drivers-m)  $(net-y) $(net-m) $(libs-y) $(libs-m)))$(net-y) $(net-m) $(libs-y) $(libs-m)))  vmlinux-alldirsvmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/,  $(init-n) $(init-) $(init-n) $(init-)  $(core-n) $(core-) $(drivers-n) $(drivers-) $(core-n) $(core-) $(drivers-n) $(drivers-)  $(net-n) $(net-) $(libs-n) $(libs-))))$(net-n) $(net-) $(libs-n) $(libs-))))  init-yinit-y := $(patsubst %/, %/built-in.o, $(init-y)):= $(patsubst %/, %/built-in.o, $(init-y))  core-ycore-y := $(patsubst %/, %/built-in.o, $(core-y)):= $(patsubst %/, %/built-in.o, $(core-y))  drivers-ydrivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)):= $(patsubst %/, %/built-in.o, $(drivers-y))  net-ynet-y := $(patsubst %/, %/built-in.o, $(net-y)):= $(patsubst %/, %/built-in.o, $(net-y))  libs-y1libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)):= $(patsubst %/, %/lib.a, $(libs-y))  libs-y2libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)):= $(patsubst %/, %/built-in.o, $(libs-y))  libs-ylibs-y := $(libs-y1) $(libs-y2):= $(libs-y1) $(libs-y2)  vmlinux-init := $(head-y) $(init-y)vmlinux-init := $(head-y) $(init-y)  vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)  vmlinux-all := $(vmlinux-init) $(vmlinux-main)vmlinux-all := $(vmlinux-init) $(vmlinux-main)  vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.ldsvmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds  kallsyms.o := .tmp_kallsyms$(last_kallsyms).okallsyms.o := .tmp_kallsyms$(last_kallsyms).o
  • 13.
    Makefile source 5Makefilesource 5  vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCEvmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE  $(call if_changed_rule,vmlinux__)$(call if_changed_rule,vmlinux__)  $(vmlinux-dirs): prepare-all scripts$(vmlinux-dirs): prepare-all scripts  $(Q)$(MAKE) $(build)=$@$(Q)$(MAKE) $(build)=$@  modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)  @echo ' Building modules, stage 2.';@echo ' Building modules, stage 2.';  $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost  @rm -rf $(MODLIB)/kernel@rm -rf $(MODLIB)/kernel  @rm -f $(MODLIB)/source@rm -f $(MODLIB)/source  @mkdir -p $(MODLIB)/kernel@mkdir -p $(MODLIB)/kernel  @ln -s $(srctree) $(MODLIB)/source@ln -s $(srctree) $(MODLIB)/source  @if [ ! $(objtree) -ef $(MODLIB)/build ]; then @if [ ! $(objtree) -ef $(MODLIB)/build ]; then  rm -f $(MODLIB)/build ; rm -f $(MODLIB)/build ;  ln -s $(objtree) $(MODLIB)/build ; ln -s $(objtree) $(MODLIB)/build ;  fifi  $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst