· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/KBUILD

You are not allowed to 'LikePages'


kbuild system

kbuild system

³²»ó±Ô

ÀÌ ¹®¼­´Â ¸®´ª½º Ä¿³Î 2.6.x¿¡ »ç¿ëµÇ´Â kbuild System¿¡ ´ëÇØ ¼³¸í ÇÕ´Ï´Ù.

Linux Kernel¼Ò½ºÀÇ Documents/kbuild/makefiles.txt ¹®¼­¸¦ ¹ø¿ªÇÑ °Í¿¡ Áö³ªÁö ¾ÊÀ¸¸ç ¹ø¿ªÀÌ ¸Å²ô·´Áö ¸øÇÏ°í Á÷¿ªÀ» ÇÑ ºÎºÐÀÌ ÀÖÀ¸³ª ÀÌÇØ ¹Ù¶ø´Ï´Ù. ÀÇ¿ªÀ» ÇÏ·Á¸é ÀåȲÇÏ°Ô ¼³¸íÀ» Çϰųª ÇØ¾ß Çϴµ¥ ±×·± Æí º¸´Ù´Â Â÷¶ó¸® ¿ø¹®À» ÀÐ¾î º¸½Ã´Â °ÍÀÌ ³´°Ú´Ü »ý°¢¿¡¼­ ±×·± °ÍÀÔ´Ï´Ù.

¹ø¿ªÀÌ ¸Å²ô·´Áö ¸øÇÑ ºÎºÐÀº ¹Ýµå½Ã ¿ø¹®À» ÀÐ¾î ¿µ¾î ´Ü¾îÀÇ ¶æÀ» ÆľÇÇϽñ⠹ٶø´Ï´Ù.

고친 과정
고침 1.02004-01-06고친이 halite
ÃÖÃÊ ÀÛ¼º

1. ¿À¹öºä

MakefileÀº ¸î°³ÀÇ ºÎºÐÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù.

표 1. MakefileÀÇ ±¸¼º

.configÄ¿³Î ¼³Á¤ ÆÄÀÏ
arch/$(ARCH)/Makefile¾ÆÅ°ÅØÃÄ º° Makefile
scripts/Makefile.*¸ðµç kbuild Makefile¿¡ »ç¿ëµÇ´Â ±ÔÄ¢ÀÌ µé¾îÀÖ´Â ÆÄÀÏ
kbuild Makefiles¾à 500°³ Á¤µµ°¡ ÀÖ´Ù

ÃÖ»óÀ§ MakefileÀº Ä¿³Î ¼Ò½º Æ®¸®ÀÇ ·çÆ® µð·ºÅ丮¿¡ ÀÖ´Â MakefileÀ» ¸»ÇÑ´Ù(º¸ÅëÀº /usr/src/linux/Makefile). ±×¸®°í Ä¿³Î ¼³Á¤ ÇÁ·Î¼¼½º·Î ºÎÅÍ Ä¿³Î ¼³Á¤ ÈÄ »ý¼ºµÈ .config¸¦ ÀÐ¾î »ç¿ëÇÑ´Ù.

ÃÖ»óÀ§ MakefileÀº µÎ°³ÀÇ Áß¿äÇÑ °á°ú¹°À» ¸¸µé¾î³½´Ù. ù¹ø°·Î vmlinux(¸Þ¸ð¸®¿¡ »óÁÖÇÏ´Â Ä¿³Î À̹ÌÁö)ÀÌ°í µÎ¹ø°´Â ¸ðµâµéÀÌ´Ù.

ÃÖ»óÀ§ MakefileÀº ÀÌ·± °á°ú¹°À» ¸¸µé±â À§ÇØ Ä¿³Î ¼Ò½º µð·ºÅ丮ÀÇ ÇÏÀ§ µð·ºÅ丮¸¦ ¸®Ä¿½ÃºêÇÏ°Ô Ã£¾Æ µé¾î°¡¸é¼­ ¸¸µé¾î³½´Ù. »ç¿ëµÇ´Â ÇÏÀ§ µð·ºÅ丮´Â Ä¿³Î ¼³Á¤¿¡ µû¶ó ´Þ¶óÁö°í ÃÖ»óÀ§ MakefileÀº arch/$(ARCH)/MakefileÀ» Á÷Á¢ includeÇÑ´Ù(º¸ÅëÀÇ ´Ù¸¥ MakefileÀº make¿¡ ÀÇÇØ ½ÇÇàµÇ¾îÁö´Â ÇüÅÂÁö¸¸ À̰͸¸ ½ÇÇàµÇÁö ¾Ê°í ÃÖ»óÀ§ Makefile¿¡ Á÷Á¢ Æ÷ÇÔµÇ¾î ½ÇÇàµÇ¾îÁø´Ù. ÃÖ»óÀ§ MakefileÀ» ¿­¾îº¸¸é ¾Ë°ÚÁö¸¸ include ¸í·ÉÀÌ »ç¿ëµÈ´Ù). arch MakefileÀº ¾ÆÅ°ÅØÃÄ¿¡ µû¸¥ Á¤º¸¸¦ ÃÖ»óÀ§ Makefile¿¡ Á¦°øÇÑ´Ù.

°¢ ÇÏÀ§ µð·ºÅ丮´Â »óÀ§·ÎºÎÅÍ ¸í·ÉÀ» Àü´ÞÇÏ´Â kbuild MakefileÀ» Çϳª¾¿ °¡Áö°í ÀÖ´Ù. kbuild MakefileÀº built-inÀ̳ª modular Ÿ°ÙÀ» ¸¸µé±â À§ÇØ È¤Àº kbuild°¡ »ç¿ëÇÏ´Â ¸¹Àº º¯¼ö ¸®½ºÆ®¸¦ ¸¸µé±â À§ÇØ .config·ÎºÎÅÍ Á¤º¸¸¦ »ç¿ëÇÑ´Ù (built-inÀº ¸Þ¸ð¸®¿¡ »óÁÖÇÏ°ÔµÉ Ä¿³Î À̹ÌÁöÀÎ vmlinux¿¡ Á÷Á¢ Æ÷ÇÔµÇ¾î ¸µÅ©µÇ´Â °ÍµéÀ» ¸»ÇÏ°í modular´Â ¸ðµâ·Î ¸¸µé¾îÁú ¿ÀºêÁ§Æ®¿¡ ¸µÅ©µÉ °ÍµéÀ» ¸»ÇÑ´Ù).

scripts/Makefile.*Àº kbuild MakefileÀ» ±âº»À¸·ÎÇÏ´Â Ä¿³ÎÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ´Â ¸ðµç Á¤Àdzª ±ÔÄ¢À» ´ã°í ÀÖ´Ù.


2. ´©°¡ ¹«¾ùÀ»?

Ä¿³Î Makefile°ú °ü°è ÀÖ´Â »ç¶÷Àº 5 Á¾·ù°¡ ÀÖ´Ù.

  • »ç¿ëÀÚ

    ´Ü¼øÈ÷ Ä¿³ÎÀ» buildÇØ »ç¿ëÇÏ´Â »ç¶÷ÀÌ´Ù. ÀÌ »ç¶÷Àº ¡°make menuconfig¡±³ª ¡°make¡±¿Í °°Àº ¸í·ÉÀ» ÀÔ·ÂÇÏ´Â »ç¶÷ÀÌ°í ÀϹÝÀûÀ¸·Î´Â Ä¿³Î Makefile(±×¿ÜÀÇ ´Ù¸¥ ¸ðµç ¼Ò½º ÆÄÀϵµ Æ÷ÇÔ)À» Àаųª º¯°æÇÏÁö ¾Ê´Â´Ù.

  • º¸Åë °³¹ßÀÚ

    µð¹ÙÀ̽º µå¶óÀ̹ö³ª ÆÄÀÏ ½Ã½ºÅÛ È¤Àº ³×Æ®¿÷ ÇÁ·ÎÅäÄÝ µîÀ» Á¶Á¤Çϰųª ÇÏ´Â ÀÏÀº ÇÑ´Ù. ÀÌ·± »ç¶÷Àº ÀÚ½ÅÀÌ »ç¿ëÇÏ´Â ÇÏÀ§ ½Ã½ºÅÛ¿¡ ´ëÇÑ kbuild MakefileÀ» °ü¸®ÇÑ´Ù. ÀÌ·± ÀÏÀ» È¿À²ÀûÀ¸·Î Çϱâ À§Çؼ± Ä¿³Î Makefile¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ ÀÌÇØ°¡ ÇÊ¿äÇÏ°í kbuild¿¡ ´ëÇÑ public interfaceÀÇ »ó¼¼ÇÑ °Í°¡Áöµµ ¾Ë°í ÀÖ¾î¾ßÇÑ´Ù.

  • Arch °³¹ßÀÚ

    i386, ppc, armµîÀÇ Àüü ¾ÆÅ°ÅØÃÄ¿¡ °ÉÃÄ ÀÏÀ» ÇÏ´Â »ç¶÷ÀÌ´Ù. ¾ÆÅ°ÅØÃÄ °³¹ßÀÚ´Â kbuild Makefile »Ó¸¸ ¾Æ´Ï¶ó arch Makefileµµ ¾Ë°í ÀÖ¾î¾ßÇÑ´Ù.

  • kbuild °³¹ßÀÚ

    Ä¿³Î build ½Ã½ºÅÛ ÀÚü¸¦ °³¹ßÇÏ´Â »ç¶÷ÀÌ°í Ä¿³Î Makefile ÀüüÀÇ µ¹¾Æ°¡´Â ¹æ½Ä¿¡ ´ëÇÑ ÀÌÇØ°¡ ÇÊ¿äÇÏ´Ù.

À̹®¼­´Â ÀÏ¹Ý °³¹ßÀÚ³ª arch °³¹ßÀÚ¸¦ À§ÇÑ °ÍÀÌ´Ù.

±×·¯³ª Ä¿³Î MakefileÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Æ´Â °ÍÀÌ ÁÁÀº °æ¿ì°¡ ¸¹´Ù. ´Ü¼øÈ÷ »õ·Î¿î Ä¿³ÎÀ» ÄÄÆÄÀÏÇØ ¼³Ä¡ÇØ »ç¿ëÇÏ´Â »ç¿ëÀÚ°¡ ¾Æ´Ï°í ½Ã½ºÅÛ ¿£Áö´Ï¾î¶ó¸é Ä¿³ÎÀÌ ¾î¶»°Ô ¸¸µé¾îÁö´Â ¾Ë°í ÀÖ´Â °ÍÀÌ µµ¿òÀÌ µÉ ¶§°¡ ¸¹´Ù. ¿¹¸¦ µé¾î ÇöÀç ¼³Á¤¿¡ ÀÇÇØ ¾î¶² ¸ðµâÀÌ ¾î¶² ÆÄÀÏ·Î ÀÌ·ç¾îÁ® ÀÖ´ÂÁö ¾Ë¼ö ÀÖÀ¸¸é ±× ÆÄÀϵéÀ» Á¶»çÇØ ¼öÁ¤Çϰųª ÇÏ´Â ÀÏÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.


3. kbuild Makefiles

Ä¿³Î ³»ÀÇ ´ëºÎºÐÀÇ MakefileÀº kbuild ÀÎÇÁ¶ó ½ºÆ®·°Ãĸ¦ »ç¿ëÇÑ´Ù. ÀÌ Àå¿¡¼­´Â kbuild makefileµé¿¡¼­ »ç¿ëµÇ´Â ¹®¹ý¿¡ ´ëÇØ ¼Ò°³ÇÑ´Ù. 3.1ÀåÀº ¡°Goal Á¤ÀÇ¡±¿¡ ´ëÇÑ °£´ÜÇÑ ¼Ò°³°í ±× ÀÌÈÄ Àå¿¡¼­ ´õ ÀÚ¼¼ÇÑ °ÍÀ» ´Ù·ê °ÍÀÌ´Ù.


3.1. Goal Á¤ÀÇ

Goal Á¤ÀÇ´Â kbuild MakefileÀÇ °¡Àå Áß¿äÇÑ ºÎºÐÀÌ´Ù. GoalÀº ¸¸µé¾îÁ®ÇÒ °Í, Ưº°ÇÑ ÄÄÆÄÀÏ ¿É¼Ç, »ç¿ëµÇ¾ßÇÒ ÇÏÀ§µð·ºÅ丮¸¦ Á¤ÀÇÇÑ´Ù. °¡Àå °£´ÜÇÑ kbuild makefileÀº ´ÙÀ½°ú °°Àº ÇÑ ÁÙÀ» °®´Â´Ù.

	¿¹:
		obj-y += foo.o
				
ÀÌ ¿¹°¡ ¸»ÇÏ´Â °ÍÀº ÀÌ µð·ºÅ丮 ³»¿¡ foo.o(foo.c³ª foo.S·ÎºÎÅÍ ¸¸µé¾îÁú)¶õ À̸§ÀÇ ÇÑ°³ÀÇ ¿ÀºêÁ§Æ®°¡ ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸¸¾à foo.o°¡ ¸ðµâ·Î ¸¸µé¾îÁø´Ù¸é obj-mÀ̶õ º¯¼ö°¡ »ç¿ëµÈ´Ù. ±×·¡¼­ ´ÙÀ½°ú °°Àº ¿¹Ã³·³ µÈ´Ù.
	¿¹:
		obj-$(CONFIG_FOO) += foo.o
				
$(CONFIG_FOO)´Â y(built-inÀ» ÀǹÌ)³ª m(¸ðµâÀ» ÀǹÌ)ÀÇ °ªÀ» °®´Â´Ù. ¸¸¾à CONFIG_FOO°¡ y³ª mÀÇ °ªÀ» °®Áö ¾Ê´Â´Ù¸é ÀÌ ÆÄÀÏÀº ÄÄÆÄÀϵǰųª ¸µÅ©µÇÁö ¾Ê´Â´Ù.


3.2. Built-in ¿ÀºêÁ§Æ® Goal (obj-y)

kbuild MakefileÀº $(obj-y) ¸®½ºÆ® ³»¿¡ vmlinux¿¡ ÇÊ¿äÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ÁöÁ¤ÇØ ³õ´Â´Ù.

kbuild´Â ¸ðµç $(obj-y) ÆÄÀÏÀ» ÄÄÆÄÀÏÇÑ´Ù. ±×¸®°í ÀÌ·± ¸ðµç ÆÄÀÏÀ» ÇϳªÀÇ build-in.o·Î ¸¸µé±â À§ÇØ ¡°$(LD) -r¡±À» ºÎ¸¥´Ù.

$(obj-y)¿¡ ±â·ÏµÈ ÆÄÀÏÀÇ ¼ø¼­´Â ¸Å¿ì Áß¿äÇÏ´Ù. Áߺ¹µÇ¼­ ³ª¿­µÇ´Â °Íµµ Çã¿ëµÇÁö¸¸ ù¹ø°·Î ³ª¿À´Â °ÍÀÌ built-in.o¿¡ ¸µÅ©µÇ°í ±× ÀÌÈÄÀÇ °ÍÀº ¹«½ÃµÈ´Ù.

¾î¶² ±â´É µéÀº(¿¹¸¦ µé¾î module_init()³ª __initcall) ºÎÆÃÇÏ´Â µ¿¾È ³ªÅ¸³ª´Â ¼ø¼­´ë·Î ºÒ·ÁÁö±â ¶§¹®¿¡ ¸µÅ© ¼ø¼­µµ Áß¿äÇÏ´Ù. ±×·¡¼­ ¼ø¼­¸¦ ¹Ù²Ù°ÔµÇ¸é µð½ºÅ© µîÀÇ µå¶óÀ̹ö°¡ »ç¿ëµÇ´Â ¼ø¼­°¡ ¹Ù²î´Â µîÀÇ ÀÏ ¶§¹®¿¡ µð½ºÅ©ÀÇ ¹øÈ£µµ ¹Ù²ð¼ö ÀÖ´Ù.

	¿¹:
		#drivers/isdn/i4l/Makefile
		# Makefile for the kernel ISDN subsystem and device drivers.
		# Each configuration option enables a list of files.
		obj-$(CONFIG_ISDN) += isdn.o
		obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
			

3.3. Loadable module goals(obj-m)

$(obj-m)Àº ÀûÀç °¡´ÉÇÑ ¸ðµâÀ» ¸¸µé ¶§ »ç¿ëµÈ´Ù.

¸ðµâÀº ÇϳªÀÇ ¼Ò½º Äڵ峪 ¿©·¯ °³ÀÇ ¼Ò½º Äڵ忡¼­ ¸¸µé¾îÁú ¼ö ÀÖ´Ù. ÇϳªÀÇ ¼Ò½º ÄÚµå·Î ¸¸µé¾îÁö´Â °æ¿ì¿£ ±×³É $(obj-m)¿¡ ´õÇϱ⸸ ÇÏ¸é µÈ´Ù.

	¿¹:
		#drivers/isdn/i4l/Makefile
		obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

	Note: ÀÌ ¿¹¿¡¼­ $(CONFIG_ISDN_PPP_BSDCOMP)´Â 'm'À» ³ªÅ¸³½´Ù.
			

¸¸¾à Ä¿³Î ¸ðµâÀÌ ¿©·¯ °³ÀÇ ¼Ò½º ÆÄÀϷκÎÅÍ ¸¸µé¾îÁö¸é À§¿¡ ³ª¿Â °Í°ú °°Àº ¹æ½ÄÀ¸·Î ÁöÁ¤ÇϸéµÈ´Ù.

kbuild´Â ¸¸µé°íÀÚÇÏ´Â ¸ðµâÀÌ ¾î´À ºÎºÐ¿¡¼­ ¿À´ÂÁö¸¦ ¾Ë¸éµÇ°í $(<module_name>-objs)¿¡ ÁöÁ¤ÇØ ÁÖ¸é µÈ´Ù.

	¿¹:
		#drivers/isdn/i4l/Makefile
		obj-$(CONFIG_ISDN) += isdn.o
		isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
			

ÀÌ ¿¹¿¡¼­ ¸ðµâ À̸§Àº isdn.oÀÌ°í kbuild´Â $(isdn-objs)¾È¿¡ ÀÖ´Â ¿ÀºêÁ§Æ®¸¦ ÄÄÆÄÀÏ ÇÑ ÈÄ¿¡ ¡°$(LD) -r¡±À» ½ÇÇàÇØ isdn.o¸¦ ¸¸µé¾î³½´Ù.

kbuild´Â ¿ÀºêÁ§Æ®¸¦ Á¢¹Ì»ç -objs¿Í -y¿¡ ÀÇÇØ ¸¸µé¾îÁö´Â º¹ÇÕ ¿ÀºêÁ§Æ®·Î ÀνÄÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¿ÀºêÁ§Æ®°¡ º¹ÇÕ ¿ÀºêÁ§Æ®ÀÇ ÀϺζó¸é MakefileÀÌ CONFIG_ °ªÀ» »ç¿ëÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.

	¿¹:
		#fs/ext2/Makefile
		obj-$(CONFIG_EXT2_FS) += ext2.o
		ext2-y := balloc.o bitmap.o
		ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
			

ÀÌ ¿¹¿¡¼± xattr.o´Â $(CONFIG_EXT2_FS_XATTR)ÀÌ 'y'ÀÎ °æ¿ì¿¡¸¸ º¹ÇÕ ¿ÀºêÁ§Æ®ÀÎ ext2.oÀÇ ÀϺΠ»ÓÀÌ´Ù.

Note: ¹°·Ð Ä¿³Î ¾È¿¡ ¸ðµâÀ» Æ÷ÇÔÇÏ´Â °æ¿ì¿¡µµ À§¿Í °°Àº ¹®¹ýÀº ±×´ë·Î Àû¿ëµÈ´Ù. ±×·¡¼­ CONFIG_EXT2_FS=yÀÎ °æ¿ì kbuild´Â ext2.o ÆÄÀÏÀ» ¸¸µé¾î built-in.o¿¡ ¸µÅ©ÇϰԵȴÙ.


3.4. 3.4. ½Éº¼À» exportÇÏ´Â ¿ÀºêÁ§Æ®

½Éº¼À» exportÇÏ´Â ¸ðµâ¿¡ ´ëÇÑ Æ¯º°ÇÑ ¿ä±¸ »çÇ× °°Àº °ÍÀº ¾ø´Ù. Ä¿³Î ¼Ò½º µð·ºÅ丮ÀÇ Documentation/modules.txt¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.


3.5. ¶óÀ̺귯¸® Goal(lib-y)

obj-*·Î ÁöÁ¤µÈ ¿ÀºêÁ§Æ® µéÀº ¶óÀ̺귯¸® (lib.a¿Í °°Àº °Í)¿¡ Æ÷Ç﵃ ¼öµµ ÀÖ´Ù. lib-y¿¡ ÁöÁ¤µÈ ¸ðµç ¿ÀºêÁ§Æ®´Â ±× µð·ºÅ丮¿¡¼­ ÇϳªÀÇ ¶óÀ̺귯¸®·Î ¸¸µé¾îÁø´Ù. obj-y¿Í lib-y¿¡ µ¿½Ã ÁöÁ¤µÈ ¿ÀºêÁ§Æ®´Â ¶óÀ̺귯¸®¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ±×·¸Áö¸¸ ÀÌ ¿ÀºêÁ§Æ® µéÀº ¾î·µç Á¢±Ù °¡´ÉÇÏ°Ô µÈ´Ù. °°Àº ½ÄÀ¸·Î lib-m¿¡ ÁöÁ¤µÈ ¿ÀºêÁ§Æ®´Â lib.a¿¡ Æ÷ÇԵȴÙ.

¶§·Î´Â °°Àº kbuild makefileÀÌ built-in°ú ¶óÀ̺귯¸®¸¦ µ¿½Ã¿¡ ÁöÁ¤ÇÒ ¼öµµÀÖ´Ù. ÀÌ·± °æ¿ì¿£ °°Àº µð·ºÅ丮¿¡ built-in.o¿Í lib.a µÑ´Ù Á¸ÀçÇÒ ¼öµµ ÀÖ´Ù.

	¿¹:
		#arch/i386/lib/Makefile
		lib-y := checksum.o delay.o
			

ÀÌ ¿¹Á¦´Â checksum.o¿Í delay.o¸¦ ±â¹ÝÀ¸·ÎÇÏ´Â lib.a¸¦ ¸¸µç´Ù.

º¸Åë lib-yÀÇ »ç¿ëÀº lib/¿Í arch/*/lib µð·ºÅ丮¿¡ ÇÑÇÑ´Ù.


3.6. ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡±â

MakefileÀº ±×°ÍÀÌ ¼ÓÇÑ µð·ºÅ丮¸¸À» Ã¥ÀÓÁø´Ù. ÇÏÀ§ µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀϵéÀº ±× ÇÏÀ§ µð·ºÅ丮¿¡ ÀÖ´Â ´Ù¸¥ Makefile¿¡ ÀÇÇØ °ü¸®µÈ´Ù. ºôµå ½Ã½ºÅÛÀº ÀÚµ¿ÀûÀ¸·Î ÇÏÀ§ µð·ºÅ丮¸¦ ¸®Ä¿½ÃºêÇÏ°Ô ºÎ¸¥´Ù.

±×·¸°Ô Çϱâ À§Çؼ­ obj-y¿Í obj-mÀÌ »ç¿ëµÈ´Ù. ¿øÇÏ´Â µð·ºÅ丮 À̸§ µÚ¿¡ /¸¦ ºÙ¿© ÀÌ·¸°Ô ÇÑ´Ù. ext2¶ó´Â ¸ðµâÀº ¿©·¯ µð·ºÅ丮¿¡ °ÉÃÄ ÀÖ°í fs/¿¡ MakefileÀÌ ÀÖ´Ù. ÀÌ MakefileÀº kbuild¿¡°Ô ¾Æ·¡¿Í °°Àº ÇÒ´çÀ» µ¿ÇØ ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡µµ·Ï ÇÑ´Ù.

	¿¹:
		#fs/Makefile
		obj-$(CONfIG_EXT2_FS) += ext2/
			

CONFIG_EXT2_FS°¡ 'y'³ª 'm'À̸é obj- º¯¼ö´Â ¼¼Æ®µÇ°í kbuild´Â ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡°Ô µÈ´Ù. kbuild´Â ÀÌ Á¤º¸¸¦ ´Ù¸¥ µð·ºÅ丮¸¦ ¹æ¹®ÇؾßÇÏ´ÂÁö °áÁ¤Çϴµ¥¸¸ »ç¿ëÇÑ´Ù. Áï ÇÏÀ§ µð·ºÅ丮ÀÇ Makefile¿¡°Ô ¹«¾ùÀÌ ¸ðµâÀÌ°í ¹«¾ùÀÌ built-inÀÎÁö ÁöÁ¤ÇÑ´Ù.

CONFIG_ º¯¼ö¸¦ »ç¿ëÇØ µð·ºÅ丮 À̸§À» ³ªÅ¸³»µµ·Ï ÇÏ´Â °ÍÀº ÁÁÀº ¹æ¹ýÀÌ´Ù. ÀÌ·¸°Ô Çϸé 'y'³ª 'm'ÀÌ ¾Æ´Ñ ÀÌ»ó¿£ ±× µð·ºÅ丮¸¦ ¿ÏÀüÈ÷ ¹«½ÃÇÏ°Ô ÇÒ ¼öÀÖ´Ù.


3.7. ÄÄÆÄÀÏ Ç÷¡±×

EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS

¸ðµç EXTRA_ º¯¼ö´Â ÁöÁ¤µÇ¾î ÀÖ´Â kbuild makefile¿¡¸¸ Àû¿ëµÇ°í ±× makefileÀÇ ¸ðµç ½ÇÇàµÇ´Â ¸í·É¿¡ Àû¿ëµÈ´Ù.

  • $(EXTRA_CFLAGS)

    $(CC)·Î ÄÄÆÄÀÏ ÇÏ´Â C ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¿É¼ÇÀ» ÁöÁ¤ÇÑ´Ù.

    	¿¹:
    		# drivers/sound/emu10k1/Makefile
    		EXTRA_CFLAGS += -I$(obj)
    		ifdef DEBUG
    			EXTRA_CFLAGS += -DEMU10K1_DEBUG
    		endif
    					

    ÃÖ»óÀ§ MakefileÀº $(CFLAGS)¸¦ °¡Áö°í ÀÖ°í Àüü Æ®¸®¿¡ ´ëÇÑ ÄÄÆÄÀÏ Ç÷¡±×·Î »ç¿ëµÇ¹Ç·Î ÀÌ º¯¼ö°¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù.

  • $(EXTRA_AFLAGS)

    ¾î¼Àºí¸® Äڵ带 ÄÄÆÄÀÏ ÇÒ ¶§ ÇÊ¿äÇÑ µð·ºÅ丮 º° ¿É¼ÇÀÌ´Ù.

    	¿¹:
    		#arch/x86_64/kernel/Makefile
    		EXTRA_AFLAGS := -traditional
    					

    $(EXTRA_LDFLAGS)¿Í $(EXTRA_ARFLAGS)´Â $(LD)¿Í $(AR)À» À§ÇÑ µð·ºÅ丮 º° ¿É¼ÇÀÌ´Ù.

    	¿¹:
    		#arch/m68k/fpsp040/Makefile
    		EXTRA_LDFLAGS := -x
    					

CFLAGS_$@, AFLAGS_$@

CFLAGS_$@¿Í AFLAGS_$@´Â ÇöÀç kbuild makefile ³»ÀÇ ¸í·É¿¡¸¸ Àû¿ëµÈ´Ù.

  • $(CFLAGS_$@)

    $(CC)¿¡ ´ëÇÑ µð·ºÅ丮 º° ¿É¼ÇÀÌ´Ù. $@´Â ¹®ÀÚ °ªÀ» ³ªÅ¸³»°í ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù.

    	¿¹:
    		# 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
    					

3.8. ÀÇÁ¸¼º ÃßÀû

kbuild´Â ´ÙÀ½°ú °°Àº ÀÇÁ¸¼ºÀ» ÃßÀûÇÑ´Ù.

  • ¸ðµç ¹Ì¸® ÁöÁ¤µÈ(prerequisite) ÆÄÀÏ (*.c¿Í *.h ¸ðµÎ)

  • ¸ðµç ¹Ì¸® ÁöÁ¤µÈ ÆÄÀÏ¿¡ ´ëÇØ »ç¿ëµÈ CONFIG_ ¿É¼Ç

  • ÄÄÆÄÀÏ Å¸°Ù¿¡ »ç¿ëµÈ Ä¿¸Çµå ¶óÀÎ

±×·¡¼­ $(CC)¿¡ ´ëÇÑ ¿É¼ÇÀÌ ¹Ù²î¸é °ü·ÃµÈ ¸ðµç ÆÄÀÏÀº ÀçÄÄÆÄÀÏ µÈ´Ù.


3.9. Ưº° ±ÔÄ¢

Ưº°ÇÑ ±ÔÄ¢Àº kbuild ÀÎÇÁ¶ó ½ºÆ®·°ÃÄ°¡ ÇÊ¿ä·Î ÇÏ´Â ±â´ÉÀ» Á¦°øÇÏÁö ¸øÇÒ ¶§ »ç¿ëÇÑ´Ù. ´ëÇ¥ÀûÀÎ ¿¹°¡ ºôµå µ¿¾È »ý¼ºµÇ´Â Çì´õ ÆÄÀÏ °°Àº °ÍÀÌ´Ù. ´Ù¸¥ ¿¹´Â ¾ÆÅ°ÅØÃÄ¿¡ µû¶ó ºÎÆ® À̹ÌÁö µîÀ» Áغñµî¿¡ ÇÊ¿äÇÑ Æ¯º°ÇÑ ±ÔÄ¢À» ÇÊ¿ä·Î ÇÏ´Â °æ¿ì´Ù.

Ưº° ±ÔÄ¢Àº º¸ÅëÀÇ make ±ÔÄ¢À» »ç¿ëÇØ ¾º¾îÁö°í MakefileÀÌ Á¸ÀçÇÏ´Â °÷¿¡¼­´Â kbuild°¡ ½ÇÇàµÇÁö ¾Ê´Â´Ù. ±×·¡¼­ ¸ðµç Ưº° ±ÔÄ¢Àº ÇÊ¿äÇÑ ÆÄÀÏÀ̳ª Ÿ°Ù ÆÄÀÏ¿¡ ´ëÇÑ »ó´ë °æ·Î(relative path)¸¦ Á¦°øÇؾ߸¸ ÇÑ´Ù.

Ưº° ±ÔÄ¢À» Á¤ÀÇÇÒ ¶§ »ç¿ëµÇ´Â µÎ°¡ÁöÀÇ º¯¼ö:

  • $(src)

    $(src)´Â MakefileÀÌ À§Ä¡ÇÏ°í ÀÖ´Â µð·ºÅ丮¸¦ °¡¸®Å°´Â »ó´ë °æ·Î´Ù. ¼Ò½º Æ®¸®¿¡ Á¸ÀçÇÏ´Â ¸ðµç ÆÄÀÏÀ» °¡¸®Å³ ¶© Ç×»ó $(src)¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

  • $(obj)

    $(obj)´Â ŸÄÏÀÌ ÀúÀåµÇ´Â µð·ºÅ丮¸¦ °¡¸®Å°´Â »ó´ë °æ·Î´Ù. ÀÏ¹Ý ÀûÀÎ ÆÄÀÏÀ» °¡¸®Å³ ¶© Ç×»ó $(obj)¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

    	¿¹:
    		#drivers/scsi/Makefile
    		$(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl
    			$(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl
    						

    ÀÌ ¿¹´Â ÀÏ¹Ý ¹®¹ýÀ» »ç¿ëÇϴ Ưº° ±ÔÄ¢ÀÌ´Ù. Ÿ°Ù ÆÄÀÏÀº µÎ°³ÀÇ ¹ÌÁö ÁöÁ¤µÈ ÆÄÀÏ¿¡ ´ëÇÑ ÀÇÁ¸¼ºÀ» °®°í ÀÖ´Ù. Ÿ°Ù ÆÄÀÏÀº $(obj)¸¦ »ç¿ëÇÏ°í ¹Ì¸® ÁöÁ¤µÈ ÆÄÀÏÀº ÀÏ¹Ý ÆÄÀÏÀÌ ¾Æ´Ï±â ´ë¹®¿¡ $(src)¸¦ »ç¿ëÇÑ´Ù.


4. È£½ºÆ® ÇÁ·Î±×·¥ Áö¿ø

kbuild´Â ÄÄÆÄÀÏ ½ºÅ×ÀÌÁö µ¿¾È »ç¿ëµÇ´Â È£½ºÆ® »ó¿¡¼­ µ¹¾Æ°¡´Â ÇÁ·Î±×·¥À» ¸¸µé±âµµ ÇÑ´Ù. È£½ºÆ® ½ÇÇà ÆÄÀÏÀ» ¸¸µé±â À§Çؼ± µÎ ½ºÅÜÀÇ ÀýÂ÷°¡ ÇÊ¿äÇÏ´Ù.

ù¹ø° ½ºÅÜÀº kbuild¿¡°Ô È£½ºÆ® ÇÁ·Î±×·¥ÀÌ Á¸ÀçÇÑ´Ù°í ¾Ë¸®´Â °ÍÀÌ´Ù. ÀÌ°Ç host-prog¸¦ »ç¿ëÇØ ÇÑ´Ù. µÎ¹øÀç ½ºÅÜÀº ½ÇÇà ÆÄÀÏ¿¡ ´ëÇÑ Á¤È®ÇÑ ÀÇÁ¸¼ºÀ» ´õÇØÁÖ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ±ÔÄ¢¿¡ ÀÇÁ¸¼ºÀ» ´õÇϰųª $(always) º¯¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.


4.1. °£´ÜÇÑ È£½ºÆ® ÇÁ·Î±×·¥

¶§·Î´Â ºôµå°¡ ½ÇÇàµÇ´Â ÄÄÇ»ÅÍ »ó¿¡¼­ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÏ°í ½ÇÇàÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾Æ·¡ ¿¹´Â kbuild¿¡°Ô bin2hex¸¦ È£½ºÆ®¿¡¼­ ¸¸µé¶ó°í ¾Ë·ÁÁØ´Ù.

	¿¹:
		host-progs := bin2hex
			

kbuild´Â bin2hex°¡ Makefile°ú °°Àº µð·ºÅ丮¿¡ ÀÖ´Â bin2hex.c¶ó´Â ÇϳªÀÇ ¼Ò½º ÆÄÀÏ¿¡¼­ ¸¸µé¾îÁø´Ù°í °¡Á¤ÇÑ´Ù.


4.2. º¹ÇÕÀûÀΠȣ½ºÆ® ÇÁ·Î±×·¥

È£½ºÆ® ÇÁ·Î±×·¥Àº ¿©·¯ °³ÀÇ ¿ÀºêÁ§Æ®·Î ±¸¼ºµÉ¼öµµ ÀÖ´Ù. º¹ÇÕ ¿ÀºêÁ§Æ®¸¦ Á¤ÀÇÇÏ´Â ¹®¹ýÀº Ä¿³Î ¿ÀºêÁ§Æ®¿¡ »ç¿ëµÈ ¹®¹ý°ú ºñ½ÁÇÏ´Ù. $(<executeable>-objs)´Â ÃÖÁ¾ ½ÇÇà ÆÄÀÏÀ» ±¸¼ºÇÏ´Â ¿ÀºêÁ§Æ®¸¦ ³ªÅ¸³½´Ù.

	¿¹:
		#scripts/lxdialog/Makefile
		host-progs    := lxdialog  
		lxdialog-objs := checklist.o lxdialog.o
			

.o È®ÀåÀÚ¸¦ °®´Â ¿ÀºêÁ§Æ®´Â ±×¿¡ »óÀÀÇÏ´Â .c ÆÄÀÏ·Î ºÎÅÍ ÄÄÆÄÀϵȴÙ. À§ÀÇ ¿¹¿¡¼± checklist.c°¡ ÄÄÆÄÀÏ µÇ checklist.o¸¦ ¸¸µç´Ù. ÃÖÁ¾ÀûÀ¸·Î µÎ°³ÀÇ .o ÆÄÀÏÀÌ ÇϳªÀÇ ½ÇÇà ÆÄÀÏÀÎ lxdialog·Î ¸µÅ©µÈ´Ù.

Note: <executable>-y¿Í °°Àº ¹®¹ýÀº È£½ºÆ® ½ÇÇà ÆÄÀÏ¿¡´Â Àû¿ëµÇÁö ¾Ê´Â´Ù.


4.3. °øÀ¯ ¶óÀ̺귯¸® Á¤ÀÇ

.so È®ÀåÀÚ¸¦ °°´Â ¿ÀºêÁ§Æ®´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ ³ªÅ¸³»°í À§Ä¡¿¡ »ó°ü ¾ø´Â ¿ÀºêÁ§Æ®·Î ÄÄÆÄÀÏ µÈ´Ù. kbuild´Â °íÀ¯ ¶óÀ̺귯¸®¸¦ Á¦°øÇÏÁö¸¸ »ç¿ëÀº Á¦ÇÑ µÇ¾î ÀÖ´Ù. ¾Æ·¡ ¿¹¿¡¼­ conf¶ó´Â ½ÇÇà ÆÄÀÏÀ» ¸µÅ©Çϱâ À§ÇØ libkconfig.so°¡ »ç¿ëµÈ´Ù.

	¿¹:
		#scripts/kconfig/Makefile
		host-progs      := conf
		conf-objs       := conf.o libkconfig.so
		libkconfig-objs := expr.o type.o
				

°øÀ¯ ¶óÀ̺귯¸®´Â ¾ðÁ¦³ª ±×¿¡ »óÀÀÇÏ´Â -objs ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ±×¸®°í À§ ¿¹Á¦¿¡¼­ libkconfig´Â µÎ°³ÀÇ ¿ÀºêÁ§Æ® expr.o¿Í type.o·ÎºÎÅÍ ¸¸µé¾îÁø´Ù. expr.o¿Í type.o´Â À§Ä¡ µ¶¸³ ÀûÀÎ ÄÚµå·Î ¸¸µé¾îÁö°í libkconfig.so·Î ¸µÅ©µÈ´Ù. C++Àº °øÀ¯ ¶óÀ̺귯¸®¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù.


4.4. È£½ºÆ® ÇÁ·Î±×·¥¿¡ C++ »ç¿ëÇϱâ

kbuild´Â C++·Î ÀÛ¼ºµÈ È£½ºÆ® ÇÁ·Î±×·¥À» Áö¿øÇÑ´Ù. ÀÌ°ÍÀº kconfig¸¦ À§ÇØ ¼Ò°³µÇÁö¸¸ ÀϹÝÀûÀÎ »ç¿ë¿¡¼­´Â ÃßõÇÏÁö ¾Ê´Â´Ù.

	¿¹:
		#scripts/kconfig/Makefile
		host-progs	:= qconf
		qconf-cxxobjs	:= qconf.o
				

¿¹Á¦¿¡¼­ ½ÇÇà ÆÄÀÏÀº C++ÆÄÀÏÀÎ qconf.cc·Î ÀÛ¼ºµÇ¾î ÀÖ°í $(qconf-cxxobjs)·Î Á¤ÀǵȴÙ. ¸¸¾à qconf°¡ .c¿Í .cc ÆÄÀÏ·Î ÀÌ·ïÁ® ÀÖ´Ù¸é À̸¦ ±¸ºÐÇϱâ À§ÇØ Ãß°¡ ÁÙÀÌ ´õ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù.

	¿¹:
		#scripts/kconfig/Makefile
		host-progs	:= qconf
		qconf-cxxobjs	:= qconf.o
		qconf-objs	:= check.o
				

4.5. È£½ºÆ® ÇÁ·Î±×·¥¿ë ÄÄÆÄÀÏ·¯ ¿É¼Ç ¼³Á¤

È£½ºÆ® ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÏ´Â µ¿¾È¿¡ Ưº°ÇÑ Ç÷¡±×°¡ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù. ÇÁ·Î±×·¥Àº ¾ðÁ¦³ª $(HOSTCC)¸¦ »ç¿ëÇØ ÄÄÆÄÀÏ µÇ¹Ç·Î $(HOSTCFLAGS)¸¦ »ç¿ëÇÏ¸é µÈ´Ù. Makefile¿¡ÀÇÇØ ¸¸µé¾îÁö´Â ¸ðµç È£½ºÆ® ÇÁ·Î±×·¥¿¡ °ÉÃÄ ¿µÇâÀ» ÁÖ´Â Ç÷¡±×¸¦ ¼¼ÆÃÇϱâ À§Çؼ± HOST_EXTRACFLAGS º¯¼ö¸¦ »ç¿ëÇÑ´Ù.

	¿¹:
		#scripts/lxdialog/Makefile
		HOST_EXTRACFLAGS += -I/usr/include/ncurses
				

ÇÑ°³ÀÇ ÆÄÀÏ ¸¸À» À§ÇÑ Ç÷¡±×´Â ¾Æ·¡¿Í °°Àº ¹æ¹ýÀ¸·Î ÇÑ´Ù.

	¿¹:
		#arch/ppc64/boot/Makefile
		HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
				

¾Æ·¡ ¿¹Á¦´Â ¸µÄ¿¿¡°Ô Ưº°ÇÑ ¿É¼ÇÀ» Ãß°¡ ÁöÁ¤ÇØÁØ´Ù.

	¿¹:
		#scripts/kconfig/Makefile
		HOSTLOADLIBES_qconf := -L$(QTDIR)/lib
				

qconf¸¦ ¸µÅ©ÇÒ ¶§ Ưº° ¿É¼ÇÀÎ ¡°-L$(QTDIR)/lib¡±ÀÌ Àü´ÞµÈ´Ù.


4.6. È£½ºÆ® ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î ¸¸µé¾îÁú ¶§

kbuild´Â È£½ºÆ® ÇÁ·Î±×·¥ÀÌ Á¤È®ÇÏ°Ô ¹Ì¸® ÁöÁ¤µÆÀ» °æ¿ì¿¡¸¸ ¸¸µç´Ù. ÀÌ·± °æ¿ì´Â µÎ°¡Áö°¡ Á¸ÀçÇÒ ¼ö ÀÖ´Ù.

  1. Ưº°ÇÑ ±ÔÄ¢ ³»¿¡ ¸íÈ®ÇÏ°Ô ¹Ì¸® ÁöÁ¤µÈ ÆÄÀÏÀ» ³ª¿­ÇÑ´Ù.

    	¿¹:
    		#drivers/pci/Makefile
    		host-progs := gen-devlist
    		$(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
    			( cd $(obj); ./gen-devlist ) < $<
    						

    Ÿ°Ù $(obj)/devlist.h´Â $(obj)/gen-devlist°¡ ¾÷µ¥ÀÌÆ® µÇ±â Àü¿¡´Â ¸¸µé¾îÁöÁö ¾Ê´Â´Ù. Ưº° ±ÔÄ¢¿¡¼­ È£½ºÆ® ÇÁ·Î±×·¥¿¡ ´ëÇÑ ·¹ÆÛ·±½º´Â $(obj)·Î ½ÃÀÛÇؾ߸¸ ÇÑ´Ù.

  2. $(always) »ç¿ë

    Àû´çÇÑ Æ¯º° ±ÔÄ¢ÀÌ ¾ø´Â °æ¿ì¿£ makefile¿¡¼­ È£½ºÆ® ÇÁ·Î±×·¥ÀÌ ¸¸µé¾îÁú ¶§ $(always) º¯¼ö°¡ »ç¿ëµÈ´Ù.

    	¿¹:
    		#scripts/lxdialog/Makefile
    		host-progs    := lxdialog
    		always        := $(host-progs)
    							
    ÀÌ ¿¹Á¦´Â kbuild¿¡°Ô ¾î´À ±ÔÄ¢¿¡µµ ¾ð±ÞµÇÁö ¾Ê¾ÒÁö¸¸ lxdialog¸¦ ¸¸µéµµ·Ï ÇÑ´Ù.


5. kbuild clean ÀÎÇÁ¶ó ½ºÆ®·°ÃÄ

"make clean"Àº Ä¿³ÎÀÌ ÄÄÆÄÀÏ µÇ´Â ¼Ò½º Æ®¸® ³»¿¡¼­ »ý¼ºµÈ(È£½ºÆ® ÇÁ·Î±×·¥ Æ÷ÇÔ) ¸ðµç ÆÄÀÏÀ» Áö¿î´Ù. $(host-progs), $(always), $(extra-y)¿¡ ÁöÁ¤µÈ ¸ðµç Ÿ°ÙÀÌ Áö¿öÁø´Ù. "*.[oas]", "*.ko"¿Í kbuild¿¡ ÀÇÇØ ¸¸µé¾îÁø ¾à°£ÀÇ Ãß°¡ ÆÄÀÏÀÌ Áö¿öÁø´Ù.

Ãß°¡ ÆÄÀÏÀº $(clean-files)¿¡ ÁöÁ¤µÈ´Ù.

	¿¹:
		#drivers/pci/Makefile
		clean-files := devlist.h classlist.h
		

"make clean"À» ½ÇÇà ÇÏ¸é µÎ°³ÀÇ ÆÄÀÏ ¡°devlist.h classlist.h¡±°¡ Áö¿öÁö°í kbuild´Â $(clean-files)¿¡ ÁöÁ¤µÈ ÀÌ µÎ ÆÄÀÏÀ» makefileÀÌ ÀÖ´Â µð·ºÅ丮¿¡¼­ ã´Â´Ù.

º¸Åë kbuild´Â ¡°obj-* := dir/¡±¿¡ ÀÇÇØ ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡Áö¸¸ ¾ÆÅ°ÅØÃÄ º° makefile¿¡¼­´Â ÀÌ°Ô ÃæºÐÇÏÁö ¾Ê¾Æ ¶§·Î´Â Á¤È®ÇÏ°Ô ÁöÁ¤ÇؾßÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

	¿¹:
		#arch/i386/boot/Makefile
		subdir- := compressed/
		

À§ÀÇ ¿¹Á¦´Â ¡°make clean¡±ÀÌ ½ÇÇàµÉ ¶§ compressed/ µð·ºÅ丮·Î ³»·Á°¡¼­ Áö¿ì¶õ °ÍÀ» °¡¸£ÃÄÁÖ°í ÀÖ´Ù.

ÃÖÁ¾ ºÎÆ® À̹ÌÁö¸¦ ¸¸µå´Â Makefile¿¡¼­ Áö¿ì±â¸¦ Áö¿øÇϱâ À§Çؼ± archclean:À̶õ À̸§ÀÇ Å¸°ÙÀ» »ç¿ëÇÑ´Ù.

	¿¹:
		#arch/i386/Makefile
		archclean:
			$(Q)$(MAKE) $(clean)=arch/i386/boot
		

"make clean"ÀÌ ½ÇÇàµÇ°í arch/i386/boot·Î ³»·Á°¡¸é °Å±â µé¾îÀÖ´Â MakefileÀº ÇÏÀ§ µð·ºÅ丮·Î ´õ ³»·Á°¡±â À§ÇØ subdir- Æ®¸¯À» »ç¿ëÇÑ´Ù.

Note 1: arch/$(ARCH)/MakefileÀº ÃÖ»óÀ§ Makefile¿¡ Æ÷ÇԵǹǷΠ¡°subdir-¡±À» »ç¿ëÇÒ ¼ö ¾ø´Ù. ±×¸®°í ÃÖ»óÀ§ Makefile¿¡¼­´Â kbuild ÀÎÇÁ¶ó ½ºÆ®·°ÃÄ°¡ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.

Note 2: core-y, libs-y, drivers-y, net-y¿¡ ³ª¿­µÈ ¸ðµç µð·ºÅ丮´Â ¡°make clean¡± µ¿¾È ¸ðµÎ ¹æ¹®µÈ´Ù.


6. ¾ÆÅ°ÅØÃÄ Makefiles

ÃÖ»óÀ§ MakefileÀº °¢ µð·ºÅ丮·Î ³»·Á°¡±â Àü¿¡ ȯ°æÀ» ¼³Á¤ÇÏ°í Áغñ¸¦ ÇÑ´Ù. ÃÖ»óÀ§ MakefileÀº ÀϹÝÀûÀÎ ºÎºÐÀ» °¡Áö°í ÀÖ°í arch/$(ARCH)/MakefileÀÌ ¾ÆÅ°ÅØÃÄ¿¡ µû¸¥ kbuild¸¦ ¼Â¾÷Çϴµ¥ ÇÊ¿äÇÑ °ÍÀ» ´ã°í ÀÖ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­ ÃÖ»óÀ§ Makefile¿¡ Æ÷ÇԵǴ arch/$(ARCH)/MakefileÀº ¸î°¡Áö º¯¼ö¿Í Ÿ°ÙÀ» Á¤ÀÇÇÑ´Ù.

kbuild°¡ ½ÇÇàµÉ ¶§ ´ë·« ´ÙÀ½°ú °°Àº ÀýÂ÷¸¦ °ÅÄ£´Ù.

  1. Ä¿³Î ¼³Á¤

    .config¸¦ ¸¸µé¾î ³¿

  2. Ä¿³Î ¹öÀüÀ» include/linux/version.h¿¡ ÀúÀå

  3. include/asm-$(ARCH)¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µç´Ù

  4. ±× ¿ÜÀÇ ´Ù¸¥ ¸ðµç Ÿ°ÙÀ» ÁغñÇÑ´Ù

    ÇÊ¿äÇÑ °ÍÀº arch/$(ARCH)/Makefile¿¡¼­ ÁöÁ¤µÈ´Ù.

  5. ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¨

    init-* core* driver-* net-* libs-*°ú ¸ðµç Ÿ°ÙÀ» ¸¸µë

    À§ÀÇ º¯¼ö °ªÀº arch/$(ARCH)/Makefile¿¡¼­ È®ÀåµÈ´Ù.

  6. ¸ðµç ¿ÀºêÁ§Æ®´Â ¸µÅ©µÇ°í ¼Ò½º Æ®¸®ÀÇ ·çÆ® µð·ºÅ丮¿¡ vmlinux¸¦ ¸¸µé¾î ³½´Ù

    Head-y¿Í arch/$(ARCH)/Makefile¿¡ ÁöÁ¤µÈ ¿ÀºêÁ§Æ®°¡ °¡Àå ¸ÕÀú ¸µÅ©µÈ´Ù.

  7. ¸¶Áö¸·À¸·Î Æ÷½ºÆ® ÇÁ·Î¼¼½ÌÀ̳ª ÃÖÁ¾ ºÎÆ® À̹ÌÁö¸¦ ¸¸µé±â À§ÇÑ ¾ÆÅ°ÅØÃÄ¿¡ µû¸¥ ºÎºÐÀÌ ½ÇÇàµÈ´Ù

    ºÎÆ® ·¹Äڵ带 ¸¸µå´Â ÀÏ°ú initrd À̹ÌÁö¿Í °°Àº °ÍÀ» ¸¸µå´Â ÀÏÀÌ Æ÷ÇԵȴÙ.


6.1. ¾ÆÅ°ÅØÃÄ ºôµå¸¦ ¼öÁ¤Çϱâ À§ÇÑ º¯¼ö ¼¼ÆÃ

  • LDFLAGS - ÀϹÝÀûÀÎ $(LD) ¿É¼Ç

    ¸µÄ¿¸¦ ºÎ¸¦ ¶§ Ç×»ó »ç¿ëµÇ´Â Ç÷¡±×ÀÌ´Ù. º¸Åë ¿¡¹Ä·¹À̼ÇÀ» ÁöÁ¤ÇÏ´Â °Í¸¸À¸·Îµµ ÃæºÐÇÏ´Ù.

    	¿¹:
    		#arch/s390/Makefile
    		LDFLAGS := -m elf_s390
    						
    Note: EXTRA_LDFLAGS¿Í LDFLAGS_$@´Â Ç÷¡±×¸¦ Á»´õ Ä¿½ºÅ͸¶ÀÌÁî Çϴµ¥ »ç¿ëµÈ´Ù. 7ÀåÀ» ÂüÁ¶Ç϶ó.

  • LDFLAGS_MODULE - ¸ðµâÀ» ¸µÅ©ÇÒ ¶§ $(LD)¿¡ »ç¿ëµÇ´Â ¿É¼Ç

    LDFLAGS_MODULEÀº ¸ðµâÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ´Â .ko ÆÄÀÏÀ» ¸µÅ©ÇÒ ¶§ $(LD)¿¡ ÁöÁ¤µÇ´Â Ç÷¡±×´Ù. ±âº»Àº Àç¹èÄ¡¸¦ À§ÇÑ ¡°-r¡±.

  • LDFLAGS_vmlinux - vmlinux¸¦ ¸µÅ©ÇÒ ¶§ »ç¿ëµÇ´Â $(LD)¿ë Ç÷¡±×

    LDFLAGS_vmlinux´Â ¸¶Áö¸·À¸·Î vmlinux¸¦ ¸µÅ©ÇÒ ¶§ ¸µÄ¿¿¡°Ô Àü´ÞµÇ´Â Ç÷¡±×´Ù. LDFLAGS_vmlinux´Â LDFLAGS_$@¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    	¿¹:
    		#arch/i386/Makefile
    		LDFLAGS_vmlinux := -e stext
    						

  • LDFLAGS_BLOB - initramfs blobÀ» ¸µÅ©ÇÒ ¶§ $(LD)¿¡ »ç¿ëµÇ´Â Ç÷¡±×

    Initramfs¿¡ »ç¿ëµÇ´Â À̹ÌÁö´Â ºôµå ÇÁ·Î¼¼½º µ¿¾È ¸¸µé¾îÁø´Ù. LDFLAGS_BLOBÀº initramfs_data.o ÆÄÀÏÀ» ¸¸µå´Â¿¡ »ç¿ëµÈ´Ù.

    	¿¹:
    		#arch/i386/Makefile
    		LDFLAGS_BLOB := --format binary --oformat elf32-i386
    						

  • OBJCOPYFLAGS - objcopy Ç÷¡±×

    .o ÆÄÀÏÀ» ¹ø¿ªÇϱâ À§ÇØ $(call if_changed,objcopy)°¡ »ç¿ëµÇ¸é OBJCOPYFLAGS°¡ »ç¿ëµÈ´Ù. $(call if_changed,objcopy)´Â º¸Åë vmlinux¿¡¼­ ¹ÙÀ̳ʸ®¸¦ ÃßÃâÇϱâ À§ÇØ »ç¿ëµÈ´Ù

    	¿¹:
    		#arch/s390/Makefile
    		OBJCOPYFLAGS := -O binary
    
    		#arch/s390/boot/Makefile
    		$(obj)/image: vmlinux FORCE
    			$(call if_changed,objcopy)
    						
    ÀÌ ¿¹Á¦¿¡¼± $(obj)/image°¡ vmlinuxÀÇ ¹ÙÀ̳ʸ® ¹öÀüÀÌ´Ù. $(call if_changed,xxx)ÀÇ ¿ëµµ´Â ³ªÁß¿¡ ¼³¸íµÈ´Ù.

  • AFLAGS - $(AS) ¾î¼Àºí·¯ Ç÷¡±×

    ±âº» °ªÀº ÃÖ»óÀ§ MakefileÀ» º¸¶ó. ÇÊ¿ä¿¡ µû¶ó ¾ÆÅ°ÅØÃÄ ¸¶´Ù Ãß°¡Çϰųª ¼öÁ¤Ç϶ó.

    	¿¹:
    		#arch/sparc64/Makefile
    		AFLAGS += -m64 -mcpu=ultrasparc
    						

  • CFLAGS - $(CC) ÄÄÆÄÀÏ·¯ Ç÷¡±×

    ±âº» °ªÀº ÃÖ»óÀ§ MakefileÀ» º¸¶ó. ÇÊ¿ä¿¡ µû¶ó ¾ÆÅ°ÅØÃÄ ¸¶´Ù Ãß°¡Çϰųª ¼öÁ¤Ç϶ó. º¸Åë CFLAGS´Â ¼³Á¤¿¡ µû¶ó ´Þ¶óÁø´Ù.

    	¿¹:
    		#arch/i386/Makefile
    		cflags-$(CONFIG_M386) += -march=i386
    		CFLAGS += $(cflags-y)
    						
    ¸¹Àº ¾ÆÅ°ÅØÃÄ MakefileÀº µ¿ÀûÀ¸·Î Ÿ°Ù C ÄÄÆÄÀÏ·¯¸¦ ½ÇÇàÇØ Áö¿øµÇ´Â ¿É¼ÇÀ» °Ë»çÇÑ´Ù.
    		#arch/i386/Makefile
    		check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc \
    			/dev/null\ > /dev/null 2>&1; then echo "$(1)"; \
    			else echo "$(2)"; fi)
    		cflags-$(CONFIG_MCYRIXIII) += $(call check_gcc,-march=c3,-march=i486)
    
    		CFLAGS += $(cflags-y)
    						

  • CFLAGS_KERNEL - built-in¿ë ƯÁ¤ $(CC) ¿É¼Ç

    $(CFLAGS_KERNEL)´Â ¸Þ¸ð¸® »óÁÖ Ä¿³Î Äڵ带 ÄÄÆÄÀÏÇϴµ¥ »ç¿ëµÇ´Â Ưº° C ÄÄÆÄÀÏ·¯ Ç÷¡±×¸¦ ´ã°í ÀÖ´Ù.

  • CFLAGS_MODULE - ¸ðµâ¿ë ƯÁ¤ $(CC) ¿É¼Ç

    $(CFLAGS_MODULE)Àº ÀûÀç °¡´ÉÇÑ Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏÇϴµ¥ »ç¿ëµÇ´Â Ưº° C ÄÄÆÄÀÏ·¯ Ç÷¡±×¸¦ ´ã°í ÀÖ´Ù.


6.2. Add prerequisites to prepare

The prepare: ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡±â Àü¿¡ ¹Ì¸® ÁöÁ¤µÈ ¸®½ºÆ®¸¦ ¸¸µé±â À§ÇØ »ç¿ëµÇ´Â ±ÔÄ¢À» ÁغñÇÑ´Ù. ÀÌ°ÍÀº º¸Åë ¾î¼Àºí·¯ »ó¼ö¸¦ ´ã°í ÀÖ´Â Çì´õÆÄÀÏÀÌ´Ù.

	¿¹:
		#arch/s390/Makefile
		prepare: include/asm-$(ARCH)/offsets.h
			

ÀÌ ¿¹¿¡¼­ include/asm-$(ARCH)/offsets.h´Â ÇÏÀ§ µð·ºÅ丮·Î ³»·Á°¡±â Àü¿¡ ¸¸µé¾îÁø´Ù. kbuild°¡ offset header ÆÄÀÏÀ» ¸¸µå´Â °ÍÀº ´Ù¸¥ ÀåÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.


6.3. List directories to visit when descending

¾ÆÅ°ÅØÃÄ MakefileÀº vmlinux¸¦ ¾î¶»°Ô ¸¸µå´ÂÁö ÁöÁ¤Çϱâ À§ÇØ ÃÖ»óÀ§ Makefile°ú °°ÀÌ ÇùÁ¶ÇÑ´Ù. ¸ðµâ¿¡ ´ëÇؼ± ¾ÆÅ°ÅØÁ® º°·Î Ưº°È÷ ±¸ºÐÇÏ´Â °ÍÀÌ ¾ø´Ù. Áï ¸ðµâÀ» ¸¸µå´Â °ÍÀº ¾ÆÅ°ÅØÃÄ¿¡ µ¶¸³ÀûÀÌ´Ù.

  • head-y

    $(head-y)´Â vmlinux¿¡ ¸µÅ©µÉ ¿ÀºêÁ§Æ®¸¦ ³ª¿­ÇÏ°í ÀÖ´Ù. $(libs-y)´Â lib.a°¡ Á¸ÀçÇÒ ¼ö ÀÖ´Â µð·ºÅ丮¸¦ ³ª¿­ÇÏ°í ÀÖ´Ù. ³ª¸ÓÁö´Â °¢°¢ built-in.o ¿ÀºêÁ§Æ® ÆÄÀÏÀÌ Á¸ÀçÇÒ ¼ö ÀÖ´Â µð·ºÅ丮¸¦ ³ª¿­ÇÏ°í ÀÖ´Ù.

  • init-y

    $(init-y) ¿ÀºêÁ§Æ®´Â $(head-y) µÚ¿¡ À§Ä¡ÇÑ´Ù. ±×¸®°í ³ª¼­ ³ª¸ÓÁö µéÀº ´ÙÀ½°ú °°Àº ¼ø¼­·Î À§Ä¡ÇÑ´Ù.

    $(core-y), $(libs-y), $(drivers-y) ±×¸®°í $(net-y).

    ÃÖ»óÀ§ MakefileÀº ¸ðµç ÀÏ¹Ý µð·ºÅ丮¿¡ ´ëÇÑ °ªÀ» Á¤ÀÇÇÑ´Ù. arch/$(ARCH)/MakefileÀº ¾ÆÅ°ÅØÃÄ ¿¡ µû¸¥ µð·ºÅ丮¿¡¸¸ ´õÇØÁø´Ù.

    	¿¹:
    		#arch/sparc64/Makefile
    		core-y += arch/sparc64/kernel/
    		libs-y += arch/sparc64/prom/ arch/sparc64/lib/
    		drivers-$(CONFIG_OPROFILE)  += arch/sparc64/oprofile/
    						


6.4. Architecture specific boot images

arch MakefileÀº vmlinux ÆÄÀÏÀ» ¸¸µé°í ¾ÐÃàÇÏ°í ºÎÆ®½º·¦ÇÎ ÄÚµå·Î °¨½Î°í Çؼ­ °á°ú¸¦ ¾îµò°¡¿¡ ÀúÀåÇÏ´Â ÀÏÀ» ´ã´çÇÑ´Ù. ÀÌ°ÍÀº ¿©·¯ Á¾·ùÀÇ ¼³Ä¡ ¸í·ÉÀ» Æ÷ÇÔÇÑ´Ù. ½ÇÁ¦ ¸ñÇ¥´Â ¾ÆÅ°ÅØÃÄ ¸¶´Ù ´Ù¸£±â ¶§¹®¿¡ Ç¥ÁØÈ­ µÇ¾î ÀÖÁø ¾Ê´Ù. º¸Åë arch/$(ARCH)/ ¹Ø¿¡ ÀÖ´Â boot/ µð·ºÅ丮¿¡¼­ ¿©·¯ ÇÁ·Î¼¼½ÌÀÌ ½ÇÇàµÈ´Ù. kbuild´Â boot/³»¿¡ Àִ Ÿ°ÙÀ» ¸¸µé±â À§ÇÑ ¹æ¹ýÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ arch/$(ARCH)/MakefileÀº boot/¿¡ Àִ Ÿ°ÙÀ» ºôµåÇϱâ À§ÇØ make¸¦ ¸Å´º¾ó·Î ½ÇÇàÇÑ´Ù.

ÃßõµÈ Á¢±Ù ¹æ¹ýÀº arch/$(ARCH)/Makefile¿¡ ¼ôÄÆÀ» Æ÷ÇÔ½ÃÅ°°í arch/$(ARCH)/boot/Makefile·Î ³»·Á°¥ ¶§ Àüü Æнº¸¦ »ç¿ëÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù.

	¿¹:
		#arch/i386/Makefile
		boot := arch/i386/boot
		bzImage: vmlinux
			$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
				

"$(Q)$(MAKE) $(build)=<dir>"Àº ÇÏÀ§ µð·ºÅ丮¿¡¼­ make¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ ÁÁ´Ù.

¾ÆÅ°ÅØÃÄ¿¡ µû¸¥ Ÿ°ÙÀÇ À̸§À» Á¤Çϴµ¥´Â ±ÔÄ¢ÀÌ ¾ø´Ù. ±×·¯³ª ¡°make help¡±¸¦ ½ÇÇàÇÒ ¶§ °ü°èµÈ ¸ðµç Ÿ°ÙÀ» Ãâ·ÁÇØÁà¾ßÇÑ´Ù. À̸¦ Áö¿øÇϱâ À§Çؼ± $(archhelp)°¡ ¹Ýµå½Ã Á¤ÀǵǾî ÀÖ¾î¾ßÇÑ´Ù.

	¿¹:
		#arch/i386/Makefile
		define archhelp
			echo  '* bzImage      - Image (arch/$(ARCH)/boot/bzImage)'
		endef
				

Make¸¦ ¾Æ±Ô¸ÕÆ® ¾øÀÌ ½ÇÇàÇßÀ» ¶© ù¹ø° ¸ñÇ¥°¡ ¸¸µé¾î Áø´Ù. ÃÖ»óÀ§ Makefile¿¡¼­ ù¹ø° ¸ñÇ¥´Â all: ÀÌ´Ù. ÀϹÝÀûÀ¸·Ð ºÎÆ® °¡´ÉÇÑ À̹ÌÁö¸¦ ¸¸µéµµ·Ï µÇ¾î ÀÖ´Ù. "make help"¸¦ ÇÏ¸é ³ª¿À´Â ¸®½ºÆ®¿¡¼­ ±âº» ¸ñÇ¥°¡ '*'·Î ±¸ºÐµÇ¾î ÀÖ´Ù.

	¿¹:
		#arch/i386/Makefile
		all: bzImage 
				
¿¹Á¦¿¡¼± ¾Æ±Ô¸ÕÆ® ¾øÀÌ ¡°make¡±¸¦ ½ÇÇà ÇßÀ» ¶§ bzImage°¡ ¸¸µé¾îÁø´Ù.


6.5. Building non-kbuild targets

extra-y´Â obj-*¿¡ ÀÇÇØ ÁöÁ¤µÈ Ÿ°Ù ¸»°í ÇöÀç µð·ºÅ丮¿¡¼­ ¸¸µé¾îÁö´Â Ãß°¡ Ÿ°ÙÀ» ÁöÁ¤ÇÑ´Ù. extra-y¿¡ ¸ðµç Ÿ°ÙÀ» ¿­°ÅÇÏ´Â °ÍÀº ´ÙÀ½°ú °°Àº µÎ°¡Áö ¸ñÀûÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù.

  1. kbuild°¡ Ä¿¸Çµå¶óÀο¡ º¯°æÀÌ ÀÖ´ÂÁö üũÇÒ¼ö ÀÖµµ·Ï Çϱâ À§ÇØ $(call if_changed,xxx)°¡ »ç¿ëµÈ °æ¿ì

  2. kbuild°¡ ¡°make clean¡± µ¿¾È ¹«½¼ ÆÄÀÏÀÌ Áö¿öÁ³´ÂÁö ¾Ë¼¼ Çϱâ À§ÇØ

	¿¹:
		#arch/i386/kernel/Makefile
		extra-y := head.o init_task.o
			

ÀÌ ¿¹Á¦¿¡¼± extra-y°¡ ¸¸µé¾îÁö±ä ÇÏÁö¸¸ built-in.oÀÇ ºÎºÐÀ¸·Î ¸µÅ©µÇÁö´Â ¾Ê´Â °ÍÀ» ¿­°ÅÇÏ°í ÀÖ´Ù.


6.6. Commands useful for building a boot image

kbuild´Â ºÎÆ® À̹ÌÁö¸¦ ¸¸µå´Âµ¥ À¯¿ëÇÑ ¸î °¡ÁöÀÇ ¸ÅÅ©·Î¸¦ Á¦°øÇÑ´Ù.

  • if_changed

    if_changed´Â ¾Æ·¡¿Í °°Àº ¶§¿¡ À¯¿ëÇÑ ÀÎÇÁ¶ó ½ºÆ®·°ÃÄ´Ù.

    	»ç¿ë¹ý:
    		target: source(s) FORCE
    			$(call if_changed,ld/objcopy/gzip)
    						

    ±ÔÄ¢ÀÌ Æò°¡µÉ ¶§ ¾î´À ÆÄÀÏÀ̵çÁö ¾÷µ¥ÀÌÆ® µÇ¾ßÇϰųª ¸í·ÉÀÌ ¸¶Áö¸· È£ÃâµÈ ÀÌÈÄ·Î º¯°æµÇ¾ú´Ù¸é ±ÔÄ¢Àº üũµÉ °ÍÀÌ´Ù. ½ÇÇà ÆÄÀÏ¿¡ ´ëÇÑ ¾î´À ¿É¼ÇÀ̵çÁö ¹Ù²î¾ú´Ù¸é ³ªÁß¿¡ °­Á¦·Î ´Ù½Ã ¸¸µé¾îÁú °ÍÀÌ´Ù. if_changed¸¦ »ç¿ëÇÏ´Â ¾î¶² Ÿ°ÙÀ̵çÁö $(targets)¾È¿¡ ¹«Á¶°Ç ³ª¿­µÇ¾ßÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¸í·É üũ´Â ½ÇÆÐÇÏ°í Ÿ°ÙÀº ¸¸µé¾îÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. $(targets)¿¡ ÇÒ´çÇÑ °ÍÀº $(obj)/ Á¢µÎ»ç°¡ ÇÊ¿ä ¾ø´Ù. if_changed´Â 6.7Àý¿¡¼­ Á¤ÀǵǴ Ŀ½ºÅÒ Ä¿¸Çµå¿Í Ãæµ¹ÇÒ ¼öµµ ÀÖ´Ù.

    Note: º¸ÅëÀº ÀÌ·± ½Ç¼ö°¡ FORCE¸¦ ±î¸Ô¾î¼­ »ý±ä´Ù.

  • ld

    Ÿ°ÙÀ» ¸µÅ©ÇÑ´Ù. º¸Åë LDFLAGS_$@°¡ ld¿¡ Ưº°ÇÑ ¿É¼ÇÀ» ¼¼Æ®Çϱâ À§ÇØ »ç¿ëµÈ´Ù.

  • objcopy

    ¹ÙÀ̳ʸ®¸¦ Ä«ÇÇÇÑ´Ù. OBJCOPYFLAGS°¡ arch/$(ARCH)/Makefile¿¡¼­ »ç¿ëµÈ´Ù. OBJCOPYFLAGS_$@´Â Ãß°¡ ¿É¼ÇÀ» ¼³Á¤ÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ´Ù.

  • gzip

    Ÿ°ÙÀ» ¾ÐÃàÇÑ´Ù. ÃÖ´ë ¾ÐÃàÀ» »ç¿ëÇ϶ó.

    	¿¹:
    		#arch/i386/boot/Makefile
    		LDFLAGS_bootsect := -Ttext 0x0 -s --oformat binary
    		LDFLAGS_setup    := -Ttext 0x0 -s --oformat binary -e begtext
    
    		targets += setup setup.o bootsect bootsect.o
    		$(obj)/setup $(obj)/bootsect: %: %.o FORCE
    			$(call if_changed,ld)
    						
    ÀÌ ¿¹Á¦¿¡¼­´Â ¼­·Î´Ù¸¥ ¸µÄ¿ ¿É¼ÇÀ» ÇÊ¿ä·Î ÇÏ´Â µÎ°¡ÁöÀÇ Å¸°ÙÀÌ °¡´ÉÇÏ´Ù. ¸µÄ¿ ¿É¼ÇÀº LDFLAGS_$@ ¹®¹ýÀ» »ç¿ëÇØ °¢°¢¿¡°Ô ÁöÁ¤µÈ´Ù. $(targets)´Â ¸ðµç ºñÁßÀִ Ÿ°Ù¿¡ ÇÒ´çµÈ´Ù. kbuild´Â Ÿ°ÙÀ» ¾Ë°í ÀÖ°í ´ÙÀ½°ú °°Àº °ÍÀ» ½ÇÇàÇÑ´Ù.

    1. Ä¿¸Çµå ¶óÀÎÀÌ º¯°æµÆ´ÂÁö üũ

    2. make clean µ¿¾È Ÿ°ÙÀÌ Áö¿î´Ù

  • ": %: %.o"

    setup.o¿Í bootsect.o ÆÄÀÏÀ» ³ª¿­Çϴµ¥¼­ Çعæ½ÃÄÑÁÖ´Â ¾à¾î´Ù.

    Note: º¸Åë "target :="À» ±î¸Ô¾î ¾Æ¹«·± ÀÌÀ¯µµ ¾øÀÌ Å¸°ÙÀÌ ´Ù½Ã ÄÄÆÄÀϵǴ ½Ç¼ö¸¦ ¸¸µé¾î³½´Ù.


6.7. Custom kbuild commands

KBUILD_VERBOSE=0ÀÎ »óÅ·Πkbuild°¡ ½ÇÇàµÇ¸é È­¸é¿£ ¾à½ÄÀÇ Ç¥½Ã¸¸µÈ´Ù. ÀÌ·± ¸ð¾çÀÇ Ä¿½ºÅÒ Ä¿¸Çµå¸¦ °¡´ÉÇÏ°Ô ÇϱâÀ§Çؼ± µÎº¯¼ö¸¦ ¼¼ÆÃÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

quiet_cmd_<command> - ¹«¾ùÀÌ Ãâ·ÂµÉ °ÍÀΰ¡?

cmd_<command> - ½ÇÇàµÉ Ä¿¸Çµå

	¿¹:
		#
		quiet_cmd_image = BUILD   $@
		cmd_image = $(obj)/tools/build $(BUILDFLAGS) \
			$(obj)/vmlinux.bin > $@

		targets += bzImage
		$(obj)/bzImage: $(obj)/vmlinux.bin $(obj)/tools/build FORCE
			$(call if_changed,image)
			@echo 'Kernel: $@ is ready'
			

$(obj)/bzImage Ÿ°Ù ¶óÀÎÀ» ¾÷µ¥ÀÌÆ®ÇÒ ¶§ BUILD arch/i386/boot/bzImage´Â "make KBUILD_VERBOSE=0"À» Ãâ·ÂÇÒ °ÍÀÌ´Ù.


7. kbuild Variables

ÃÖ»óÀ§ MakefileÀº ´ÙÀ½°ú °°Àº º¯¼ö¸¦ exportÇÑ´Ù.

  • VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION

    ÀÌ º¯¼öµéÀº ÇöÀç Ä¿³ÎÀÇ ¹öÀüÀ» ³ª´Ù³½´Ù. ¸î ¸î ¼Ò¼öÀÇ arch Makefile ¸¸ÀÌ ÀÌ °ªÀ» Á÷Á¢ »ç¿ëÇÑ´Ù. º¸ÅëÀº $(KERNELRELEASE)¸¦ ´ë½Å »ç¿ëÇÑ´Ù. $(VERSIlN), $(PATCHLEVEL), $(SUBLEVEL)Àº '2", "4", "0"°ú °°Àº ±âº»ÀûÀÎ ¹öÀüÀÇ ¼¼ºÎºÐÀ» ³ªÅ¸³½´Ù. ÀÌ ¼¼ °ªÀº ¾ðÁ¦³ª ¼ýÀÚ´Ù. $(EXTRAVERSION)Àº ÇÁ¸® ÆÐÄ¡³ª Ãß°¡ ÆÐÄ¡ÀÇ ¼­ºê·¹º§À» ³ªÅ¸³½´Ù. ¹®ÀÚ ½ºÆ®¸µÀÌ°í ¡°-pre4¡±¿Í °°Àº °ªÀ» °®°í º¸ÅëÀº °ø¹éÀÌ´Ù.

  • KERNELRELEASE

    $(KERNELRELEASE)´Â "2.4.0-pre4"¿Í °°Àº ¹öÀüÀ» ³ªÅ¸³»°Å³ª Ä¿³ÎÀÌ ÀνºÅçµÇ´Â µð·ºÅ丮 À̸§À̵Ǵ ÇϳªÀÇ ½ºÆ®¸µÀÌ´Ù. ¸î¸î arch MakefileÀº ÀÌ·± ¿ëµµ·Î ÀÌ°ÍÀ» »ç¿ëÇÑ´Ù.

  • ARCH

    ÀÌ º¯¼ö´Â Ÿ°Ù ¾ÆÅ°ÅØÃĸ¦ Á¤ÀÇÇÑ´Ù. ¸î¸î kbuild Makefile µéÀº $(ARCH)¸¦ Å×½ºÆ®ÇØ ÄÄÆÄÀϵǾßÇÏ´Â ÆÄÀÏÀ» Á¤ÇÑ´Ù. ±âº»Àº ÃÖ»óÀ§ MakefileÀÌ $(ARCH)¸¦ È£½ºÆ® ½Ã½ºÅÛ°ú °°Àº ¾ÆÅ°ÅØÃÄ·Î ¼³Á¤ÇÑ´Ù. Å©·Î½º ÄÄÆÄÀÏ ÇÏ·Á¸é ÀÌ °ªÀ» Ä¿¸Çµå ¶óÀο¡¼­ ÁöÁ¤ÇÏ¸é µÈ´Ù.

    make ARCH=m68k ...

  • INSTALL_PATH

    ¸Þ¸ð¸®¿¡ »óÁÖÇÒ Ä¿³Î À̹ÌÁö¿Í System.map ÆÄÀÏÀÇ ¼³Ä¡ À§Ä¡¸¦ ³ªÅ¸³½´Ù. ÀνºÅçÇÒ Å¸°ÙÀº ¾ÆÅ°ÅØÃÄ¿¡ ´Ù¶ó ´Ù¸¥ °ÍÀ» »ç¿ëÇÑ´Ù.

  • INSTALL_MOD_PATH, MODLIB

    $(INSTALL_MOD_PATH)´Â ¸ðµâÀÇ ¼³Ä¡ À§Ä¡ÀÎ $(MODLIB)ÀÇ Á¢µÎ»ç´Ù. ÀÌ º¯¼ö´Â Makefile¿¡ Á¤ÀǵǾî ÀÖÁö ¾Ê°í ÇÊ¿äÇÑ °æ¿ì¿¡ »ç¿ëÀÚ¿¡ ÀÇÇØ ³Ñ°ÜÁø´Ù. $(MODLIB)´Â ¸ðµâÀÌ ¼³Ä¡µÉ À§Ä¡¸¦ ³ªÅ¸³½´Ù. ÃÖ»óÀ§ MakefileÀº $(MODLIB)¸¦ $(INSTALL_MOD_PAHT)/lib/modules/$(KERNELRELEASE)·Î Á¤ÀÇÇÑ´Ù. »ç¿ëÀÚ´Â ÇÊ¿äÇÑ °æ¿ì ÀÌ º¯¼ö¸¦ ÀçÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.


8. Makefile language

Ä¿³Î MakefileÀº GNU Make¿Í µ¿ÀÛÇϵµ·Ï ¸¸µé¾îÁ® ÀÖ´Ù. Makefile µéÀº GNU MakeÀÇ ¹®¼­¿¡ ³ª¿Â °Íµé¸¸À» »ç¿ëÇÏÁö¸¸ GNU È®Àåµµ ¸¹ÀÌ »ç¿ëÇÑ´Ù. GNU Make´Â ÇÔ¼ö¸¦ ó¸®ÇÏ´Â ±âº» ¸®½ºÆ®¸¦ Á¦°øÇÑ´Ù. Ä¿³Î Makefile µéÀº ¾à°£ÀÇ ¡°if¡± ¹®ÀåÀ¸·Î ¸¸µé¾îÁö°Å³ª À¯ÁöµÉ ¸®½ºÆ®¿¡ ´ëÇÑ novel styleÀ» »ç¿ëÇÑ´Ù. GNU Makef´Â µÎ °¡ÁöÀÇ ÇÒ´ç ¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù. ¡°:=¡±Àº ¿À¸¥ ÆíÀÇ °ªÀ» ¹Ù·Î °è»êÇÏ°í ¿ÞÆíÀ¸·Î ´ëÀÔÇÑ´Ù. ¡°=¡±´Â °ø½Ä Á¤ÀÇ¿Í ºñ½ÁÇؼ­ ¿À¸¥ ÆíÀÇ °ªÀ» °è»êÇÏÁö ¾Ê°í ¿ÞÆíÀÇ °ªÀÌ »ç¿ëµÉ ¶§ ¸¶´Ù °è»êÇÑ´Ù. ¿©·¯ °æ¿ì¿¡¼­ ¡°=¡±ÀÌ Àû´çÇÏ´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í ¡°:=¡±ÀÌ ¿Ã¹Ù¸¥ ¼±ÅÃÀÌ´Ù.


9. Credits

Original version made by Michael Elizabeth Chastain, <mailto:mec (at) shout.net>

Updates by Kai Germaschewski <kai (at) tp1.ruhr-uni-bochum.de>

Updates by Sam Ravnborg <sam (at) ravnborg.org>


10. TODO

- Describe how kbuild support shipped files with _shipped.

- Generating offset header files.

- Add more variables to section 7


ID
Password
Join
As goatheard learns his trade by goat, so writer learns his trade by wrote.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2004-01-07 14:06:47
Processing time 0.0015 sec