Go to the first, previous, next, last section, table of contents.


MakefileÀÇ Á¶°Ç ºÎºÐ(Conditional Parts of Makefiles)

Á¶°Ç(conditional) Àº makefileÀÇ ¾î¶² ºÎºÐÀÌ º¯¼öÀÇ °ª¿¡ µû¶ó¼­ »ç¿ëµÇ°Å³ª ¹«½ÃµÇµµ·Ï ÇÑ´Ù. Á¶°ÇÀº ÇÑ º¯¼ö¸¦ ´Ù¸¥ °Í°ú, ¶Ç´Â ÇÑ º¯¼öÀÇ °ªÀ» »ó¼ö ¹®ÀÚ¿­°ú ºñ±³ÇÒ ¼ö ÀÖ´Ù. Á¶°ÇÀº make°¡ ½ÇÁ¦·Î makefile¿¡¼­ "º¸´Â" °ÍÀ» Á¦¾îÇÑ´Ù. ±×·¯¹Ç·Î ½ÇÇà½ÃÀÇ ½© ¸í·ÉµéÀ» Á¦¾îÇÏ´Â µ¥¿¡´Â »ç¿ëµÉ ¼ö ¾ø´Ù.

Á¶°ÇÀÇ ¿¹(Example of a Conditional)

´ÙÀ½ Á¶°ÇÀÇ ¿¹Á¦´Â make¿¡°Ô CC º¯¼ö°¡ `gcc'À̶ó¸é ÀÏ´ÜÀÇ ¶óÀ̺귯¸® ¸ðÀ½À» »ç¿ëÇ϶ó°í ¸»ÇÏ´Â °ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é ´Ù¸¥ ¶óÀ̺귯¸® ¸ðÀ½À» »ç¿ëÇϵµ·Ï ¸»ÇÏ´Â °ÍÀÌ´Ù. µÎ ¸í·É ¶óÀεé ÁßÀÇ ¾î¶² °ÍÀÌ ¾î¶² ±ÔÄ¢¿¡ ´ëÇؼ­ »ç¿ëµÉ °ÍÀΰ¡¸¦ Á¦¾îÇÔÀ¸·Î½á ÀÛµ¿ÇÑ´Ù. ±× °á°ú·Î make¿¡ ´ëÇÑ ¸Å°³º¯¼ö·Î½á `CC=gcc'¸¦ ¾²¸é, ¾î¶² ÄÄÆÄÀÏ·¯°¡ »ç¿ëµÉ °ÍÀΰ¡ »Ó¸¸ ¾Æ´Ï¶ó ¾î¶² ¶óÀ̺귯¸®µéÀÌ ¸µÅ©µÉ °ÍÀΰ¡¸¦ º¯°æÇÑ´Ù.

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

ÀÌ Á¶°ÇÀº ¼¼°¡Áö Áö½Ã¾îµéÀ» »ç¿ëÇÑ´Ù: Çϳª´Â ifeq, Çϳª´Â else, ±×¸®°í ³ª¸ÓÁö Çϳª´Â endif.

ifeq Áö½Ã¾î´Â Á¶°ÇÀ» ½ÃÀÛÇÏ°í Á¶°ÇÀ» ÁöÁ¤ÇÑ´Ù. ÄÞ¸Ó·Î ºÐ¸®µÇ°í °ýÈ£·Î µÑ·¯½ÎÀÎ µÎ°³ÀÇ ¸Å°³º¯¼öµéÀ» °¡Áø´Ù. º¯¼ö ´ëÀÔÀÌ µÎ ¸Å°³º¯¼öµé¿¡ ´ëÇؼ­ ¼öÇàµÇ°í ³­ µÚ¿¡ ±×µéÀÌ ºñ±³µÈ´Ù. ifeq µÚ¿¡ ¿À´Â makefileÀÇ ¶óÀεéÀº µÎ ¸Å°³º¯¼öµéÀÌ ÀÏÄ¡ÇÒ °æ¿ì »ç¿ëµÈ´Ù; ±×·¸Áö ¾ÊÀ¸¸é ±×µéÀº ¹«½ÃµÈ´Ù.

else Áö½Ã¾î´Â ´ÙÀ½ ¶óÀεéÀÌ, ÀÌÀü Á¶°ÇÀÌ ½ÇÆÐÇÏ¿´´Ù¸é, ¼öÇàµÇµµ·Ï ÇÑ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ ÀÌ°ÍÀº µÎ¹ø° ´ë¾È ¸µÅ© ¸í·ÉÀÌ, ù¹ø° ´ë¾ÈÀÌ »ç¿ëµÇÁö ¾ÊÀ»¶§¸¶´Ù, »ç¿ëµÈ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. else¸¦ Á¶°Ç¿¡ °¡Áö´Â °ÍÀº ¼±ÅÃÀÌ´Ù.

endif Áö½Ã¾î´Â Á¶°ÇÀ» Á¾·áÇÑ´Ù. ¸ðµç Á¶°ÇÀº ¹Ýµå½Ã endif·Î Á¾·áÇØ¾ß ÇÑ´Ù. ÀÌ µÚ¿¡ Á¶°ÇÀÌ ¾Æ´Ñ makefileÀÇ ÅؽºÆ®°¡ ¿Â´Ù.

¿¹Á¦°¡ ¿¹½ÃÇÏ´Â °Íó·³ Á¶°ÇÀº ÅؽºÆ® ·¹º§¿¡¼­ ÀÛµ¿ÇÑ´Ù: Á¶°ÇÀÇ ¶óÀεéÀº Á¶°Ç¿¡ µû¶ó¼­ makefileÀÇ ÀϺηΠÃë±ÞµÇ°Å³ª ¾Æ´Ï¸é ¹«½ÃµÈ´Ù. ÀÌ°ÍÀº ±ÔÄ¢°ú °°Àº makefileÀÇ ´õ Å« ¹®¹ý À¯´ÖµéÀÌ ¿Ö Á¶°ÇÀÇ ½ÃÀÛÀ̳ª ³¡°ú °ãÃÄÁ® ÀÖÀ» ¼ö Àִ°¡¿¡ ´ëÇÑ ÀÌÀ¯ÀÌ´Ù.

º¯¼ö CC°¡ º¯¼ö `gcc'¸¦ °¡Áú ¶§ À§ÀÇ ¿¹Á¦´Â ´ÙÀ½°ú °°Àº È¿°ú¸¦ °¡Áø´Ù:

foo: $(objects)
        $(CC) -o foo $(objects) $(libs_for_gcc)

º¯¼ö CC°¡ ÀÓÀÇÀÇ ´Ù¸¥ °ªÀ» °¡Áø´Ù¸é ±× °á°ú´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù:

foo: $(objects)
        $(CC) -o foo $(objects) $(normal_libs)

¾î¶² º¯¼ö ÇÒ´çÀ» Á¶°ÇÈ­Çؼ­ º¯¼ö¸¦ ¹«Á¶°Ç »ç¿ëÇÔÀ¸·Î½á, µ¿ÀÏÇÑ °á°ú°¡ ´Ù¸¥ ½ÄÀ¸·Î ¾ò¾îÁú ¼ö ÀÖ´Ù:

libs_for_gcc = -lgnu
normal_libs =

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

foo: $(objects)
        $(CC) -o foo $(objects) $(libs)

Á¶°ÇÀÇ ¹®¹ý(Syntax of Conditionals)

else¸¦ °¡ÁöÁö ¾Ê´Â ´Ü¼øÇÑ Á¶°ÇÀÇ ¹®¹ýÀº ´ÙÀ½°ú °°´Ù:

conditional-directive
text-if-true
endif

text-if-true´Â ÀÓÀÇ ¶óÀÎÀÇ ÅؽºÆ®ÀÏ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº Á¶°ÇÀÌ ÂüÀÏ ¶§ makefileÀÇ ÀϺηΠ¿©°ÜÁø´Ù. Á¶°ÇÀÌ °ÅÁþÀÌ¸é ¾î¶² ÅؽºÆ®µµ »ç¿ëµÇÁö ¾Ê´Â´Ù.

º¹ÀâÇÑ Á¶°ÇÀÇ ¹®Á¢Àº ´ÙÀ½°ú °°´Ù:

conditional-directive
text-if-true
else
text-if-false
endif

Á¶°ÇÀÌ ÂüÀ̸é text-if-true°¡ »ç¿ëµÈ´Ù; ±×·¸Áö ¾ÊÀ¸¸é text-if-false ÀÌ »ç¿ëµÈ´Ù. text-if-false´Â ÀÓÀÇ ¶óÀÎÀÇ ÅؽºÆ®ÀÏ ¼ö ÀÖ´Ù.

conditional-directive ÀÇ ¹®¹ýÀº Á¶°ÇÀÌ ´Ü¼øÇϵçÁö ¾Æ´Ï¸é º¹ÀâÇϵçÁö µ¿ÀÏÇÏ´Ù. ¼­·Î ´Ù¸¥ Á¶°ÇµéÀ» Å×½ºÆ®ÇÏ´Â ¼­·Î ´Ù¸¥ Áö½Ã¾îµéÀÌ ³×°³ ÀÖ´Ù. À̵éÀº ´ÙÀ½°ú °°´Ù:

ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"
arg1°ú arg2¿¡ ÀÖ´Â ¸ðµç º¯¼ö ÂüÁ¶µéÀ» È®ÀåÇÏ°í¼­ ±×µéÀ» ºñ±³ÇÑ´Ù. ±×µéÀÌ ¼­·Î °°´Ù¸é text-if-true°¡ »ç¿ëµÉ °ÍÀÌ°í; ±×·¸Áö ¾Ê´Ù¸é text-if-false°¡, ÀÖ´Ù¸é, »ç¿ëµÉ °ÍÀÌ´Ù. ¾î¶² º¯¼ö°¡ ºó°ÍÀÌ ¾Æ´Ñ °ªÀ» °¡Áø°ÍÀΰ¡ ¾Æ´Ñ°¡¸¦ Å×½ºÆ®ÇÏ°íÀÚ ÇÒ °æ¿ì°¡ ¸¹´Ù. °ªÀÌ º¯¼ö¿Í ÇÔ¼öÀÇ º¹ÀâÇÑ È®ÀåÀ¸·ÎºÎÅÍ ¿Â °ÍÀÏ ¶§, ºó°ÍÀ¸·Î »ý°¢ÇÑ È®ÀåÀÌ ½ÇÁ¦·Î °ø¹é¹®ÀÚµéÀ» ´ã°í À־ ºó°ÍÀ¸·Î º¸ÀÌÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ±×·¯³ª strip ÇÔ¼ö see section ¹®ÀÚ ´ëÀÔ°ú ºÐ¼®À» À§ÇÑ ÇÔ¼öµé(Functions for String Substitution and Analysis)) ¸¦ »ç¿ëÇؼ­ °ø¹é¹®ÀÚ¸¦ ºó°ÍÀÌ ¾Æ´Ñ °ªÀ¸·Î Çؼ®ÇÏ´Â °ÍÀ» ÇÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é:
ifeq ($(strip $(foo)),)
text-if-empty
endif
ÀÌ°ÍÀº $(foo) ÀÇ È®ÀåÀÌ °ø¹é¹®ÀÚ¸¦ ´ã°í ÀÖ´Ù°í ÇÏ´õ¶óµµ text-if-empty ¸¦ Æò°¡ÇÒ °ÍÀÌ´Ù.
ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"
ÀÌ°ÍÀº arg1°ú arg2¿¡ ÀÖ´Â ¸ðµç º¯¼ö ÂüÁ¶µéÀ» È®ÀåÇÑ µÚ ±×°ÍµéÀ» ºñ±³ÇÑ´Ù. ±×µéÀÌ ´Ù¸£´Ù¸é text-if-true °¡ »ç¿ëµÉ °ÍÀÌ°í; ±×·¸Áö ¾Ê´Ù¸é text-if-false°¡, Á¸ÀçÇÑ´Ù¸é, »ç¿ëµÉ °ÍÀÌ´Ù.
ifdef variable-name
º¯¼ö variable-name °¡ ºó°ÍÀÌ ¾Æ´Ñ °ªÀ» °¡Áø´Ù¸é, text-if-true °¡ »ç¿ëµÉ °ÍÀÌ´Ù; ±×·¸Áö ¾Ê´Ù¸é text-if-false °¡, Á¸ÀçÇÑ´Ù¸é, »ç¿ëµÉ °ÍÀÌ´Ù. Çѹøµµ Á¤ÀÇµÈ ¹Ù°¡ ¾ø´Â º¯¼öµéÀº ºó °ªÀ» °¡Áø´Ù. ifdef ´Â ¾î¶² º¯¼ö°¡ °ªÀ» °¡Áö´ÂÁö ¾È°¡Áö´ÂÁö¿¡ ´ëÇؼ­¸¸ Å×½ºÆ®ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇÏÀÚ. ÀÌ°ÍÀº, °ªÀÌ ºó°ÍÀΰ¡ ¾Æ´Ñ°¡¸¦ º¸±â À§Çؼ­ º¯¼ö¸¦ È®ÀåÇÏÁö ¾Ê´Â´Ù. °á°úÀûÀ¸·Î ifdef¸¦ »ç¿ëÇÑ Å×½ºÆ®µéÀº foo =¿Í °°Àº °ÍµéÀ» Á¦¿ÜÇÑ ¸ðµç Á¤Àǵ鿡 ´ëÇؼ­ ÂüÀ» ¸®ÅÏÇÑ´Ù. ºó °ª¿¡ ´ëÇÑ Å×½ºÆ®¸¦ ÇÏ·Á¸é ifeq ($(foo),) ¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î¼­,
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
ÀÌ°ÍÀº `frobozz'¸¦ `yes'·Î ¼³Á¤ÇÏ´Â ¹Ý¸é¿¡ ´ÙÀ½Àº:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
`frobozz'¸¦ `no'·Î ¼³Á¤ÇÑ´Ù.
ifndef variable-name
variable-name º¯¼ö°¡ ºó °ªÀ» °¡Áø´Ù¸é text-if-true °¡ »ç¿ëµÈ´Ù; ±×·¸Áö ¾ÊÀ¸¸é text-if-false, Á¸ÀçÇÑ´Ù¸é, »ç¿ëµÈ´Ù.

Á¶°Ç Áö½Ã¾î ¶óÀο¡¼­ ¸Ç¾Õ¿¡ ÀÖ´Â ¿©ºÐÀÇ °ø¹éµéÀº Çã¿ëµÇ°í À̵éÀº ¹«½ÃµÈ´Ù. ±×·¯³ª ÅÇÀº Çã¿ëµÇÁö ¾Ê´Â´Ù. (ÅÇÀ¸·Î ½ÃÀÛÇÑ´Ù¸é ±ÔÄ¢ÀÇ ¸í·ÉÀ¸·Î »ý°¢µÉ °ÍÀÌ´Ù.) ÀÌ·± °Í ¿Ü¿¡ ¿©ºÐÀÇ °ø¹éµéÀ̳ª ÅǵéÀÌ Áö½Ã¾î À̸§À̳ª ¸Å°³º¯¼ö ¾ÈÀ» Á¦¿ÜÇÏ°í´Â, ¾îµð¿¡¼­³ª ¾Æ¹«·± È¿°ú¾øÀÌ »ðÀ﵃ ¼ö ÀÖ´Ù. `#' ·Î ½ÃÀÛÇÏ´Â ÁÖ¼®ÀÌ ¶óÀÎÀÇ ¸¶Áö¸·¿¡ ¿Ã ¼ö ÀÖ´Ù.

Á¶°ÇÀÇ ÀϺÎÀÎ ´Ù¸¥ µÎ Áö½Ã¾îµéÀº else¿Í endifÀÌ´Ù. ÀÌ·± Áö½Ã¾îµé °¢°¢Àº ´ÜÀÏ ¿öµå·Î, ¸Å°³º¯¼ö ¾øÀÌ »ç¿ëµÈ´Ù. ¿©ºÐÀÇ °ø¹éµéÀÌ ±× ¶óÀÎÀÇ ¸ÇóÀ½¿¡ ¿Ã ¼öµµ ÀÖÀ¸¸ç À̵éÀº ¹«½ÃµÈ´Ù. ±×¸®°í ¶óÀÎÀÇ ³¡¿¡ °ø¹éµéÀ̳ª ÅǵéÀÌ ¿Ã ¼ö ÀÖ´Ù. `#'·Î ½ÃÀÛÇÏ´Â ÁÖ¼®Àº ¶óÀÎÀÇ ³¡¿¡ ³ªÅ¸³¯ ¼ö ÀÖ´Ù.

Á¶°ÇÀº makefileÀÇ ¾î¶² ¶óÀεéÀ» make°¡ »ç¿ëÇÒ °ÍÀΰ¡¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. Á¶°ÇÀÌ ÂüÀ̸é, make´Â text-if-true ¶óÀεéÀ» makefileÀÇ ÀϺηΠÀд´Ù; Á¶°ÇÀÌ °ÅÁþÀ̸é make´Â ÀÌ·± ¶óÀεéÀ» ¿ÏÀüÈ÷ ¹«½ÃÇÑ´Ù. ±ÔÄ¢°ú °°Àº makefileÀÇ ¹®¹ý À¯´ÖµéÀÌ Á¶°ÇÀÇ ³¡À̳ª óÀ½¿¡ °ÉÃÄ ¾ÈÀüÇÏ°Ô ÂÉ°³Áú ¼ö ÀÖ´Ù.

make´Â ±×°ÍÀÌ makefileÀ» ÀÐÀ» ¶§ Á¶°ÇµéÀ» Æò°¡ÇÑ´Ù. °á°úÀûÀ¸·Î Á¶°ÇÀÇ Å×½ºÆ® ¾È¿¡¼­ ÀÚµ¿ º¯¼öµéÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿Ö³Ä¸é ±×µéÀº ¸í·ÉµéÀÌ ½ÇÇàµÇ±â Àü¿¡´Â Á¤ÀǵÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù (see section ÀÚµ¿ º¯¼öµé(Automatic Variables)).

ÂüÀ»¼ö ¾ø´Â È¥µ¿À» ¸·±â À§Çؼ­ ÇϳªÀÇ makefile¾È¿¡¼­ Á¶°ÇÀ» ½ÃÀÛÇÏ°í ´Ù¸¥ makefile ¾È¿¡¼­ ³¡³»Áö´Â °ÍÀº Çã¿ëµÇÁö ¾Ê´Â´Ù. ±×·¯³ª, include Áö½Ã¾î¸¦ Á¶°Ç ¾È¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ü ±× includeµÈ ÆÄÀÏ ¾È¿¡¼­ ±× Á¶°ÇÀ» Á¾·áÇÏ·Á°í ½ÃµµÇÏÁö ¾Ê´Â´Ù¸é ¸»ÀÌ´Ù.

Ç÷¡±× °Ë»ç Á¶°Ç(Conditionals that Test Flags)

`-t'¿Í °°Àº make ¸í·É Ç÷¡±×µéÀ», º¯¼ö MAKEFLAGS°ú findstring ÇÔ¼ö (see section ¹®ÀÚ ´ëÀÔ°ú ºÐ¼®À» À§ÇÑ ÇÔ¼öµé(Functions for String Substitution and Analysis)) ¸¦ »ç¿ëÇÔÀ¸·Î½á, °Ë»çÇÏ´Â Á¶°ÇÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº touch°¡ ÆÄÀÏÀÌ ¾÷µ¥ÀÌÆ®µÈ °ÍÀ¸·Î ¸¸µé±â¿¡ ÃæºÐÇÏÁö ¾ÊÀ» ¶§ À¯¿ëÇÏ´Ù.

findstring ÇÔ¼ö´Â ÇÑ ¹®ÀÚ¿­ÀÌ ´Ù¸¥ °ÍÀÇ ºÎºÐ¹®ÀÚ¿­·Î ³ªÅ¸³­ °ÍÀΰ¡ ¾Æ´Ñ°¡¸¦ °áÁ¤ÇÑ´Ù. `=t' Ç÷¡±×¸¦ Å×½ºÆ®ÇÏ°íÀÚ ÇÑ´Ù¸é `t'¸¦ ù¹ø° ¹®ÀÚ¿­·Î, MAKEFLAGS¸¦ ´Ù¸¥ ¹®ÀÚ¿­·Î »ç¿ëÇÑ´Ù.

¿¹¸¦ µé¾î¼­ ´ÙÀ½Àº ¾ÆÄ«À̺ê ÆÄÀÏÀÌ °»½ÅµÈ °ÍÀ¸·Î Ç¥½ÃÇÏ´Â °ÍÀ» ³¡³»µµ·Ï Çϱâ À§Çؼ­, `ranlib -t'¸¦ »ç¿ëÇؼ­ Á¤¸®ÇÏ´Â ¹æ¹ýÀÌ´Ù:

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
        +touch archive.a
        +ranlib -t archive.a
else
        ranlib archive.a
endif

`+' ÇÁ¸®ÇȽº´Â ÀÌ·± ¸í·É ¶óÀεéÀÌ "Àç±ÍÀû" À̾ ±×µéÀÌ `-t' Ç÷¡±×¿¡µµ ºÒ±¸ÇÏ°í ½ÇÇàµÉ °ÍÀ̶ó´Â °ÍÀ» Ç¥½ÃÇÑ´Ù. See section makeÀÇ Àç±ÍÀû »ç¿ë(Recursive Use of make).


Go to the first, previous, next, last section, table of contents.