[makefile] #1. Target, Automatic Variables and Wildcards

문연수·2022년 9월 14일
0

Makefile

목록 보기
2/8

1. Targets

 한번에 여러 개의 target 을 동시에 make 하고 싶다면 all target 을 만들면 된다. all 이 가장 첫 번째로 등장하는 rule 로 설정한다면 makedefaultall target 에 해당하는 rule 을 수행한다:

all: one two three

one:
	touch one
    
two:
	touch two
    
three:
	touch three
    
clean
	rm -f one two three

- 다중 타겟

 만일 하나의 rule 에 여러 target 이 존재한다면, command 는 각각의 target 에 대해서 수행된다:

all: f1.o f2.o

f1.o f2.o:
	echo $@

$@ 와 관련된 내용은 곧바로 더 자세하게 기술할 것이지만 간단하게 설명하면 target name 을 포함하는 automatic variable 중 하나이다. 위 예제는 아래와 동일하다:

f1.o:
	echo f1.o
    
f2.o:
	echo f2.o

2. Wildcards

- * Wildcard

* wildcard 는 파일시스템 내에서 일치하는 이름의 파일들을 찾는다. 그러나 가급적이면 * wildcard 는 wildcard 함수 내에서 사용하는 것이 좋다. 그 이유는 아래에 후술한다:

print: $(wildcard *.c)
	ls -la $?

*target, prerequisite, 혹은 wildcard 함수 내에서 사용되어질 수 있다. 그러나 * wildcard wildcard 함수 내에서 사용하지 않으면 다음과 같은 문제가 발생할 수 있다:

  1. * 를 변수 정의(variable definition) 에 직접 사용할 수 없다.
  2. 만일 일치하는 파일이 존재하지 않는다면, 공백이 아닌 * wildcard 자체가 그 자리에 남는다.
thing_wrong := *.o # Don't do this! '*' will not get expanded
thing_right := $(wildcard *.o)

all: one two three four

# Fails, because $(thing_wrong) is the string "*.o"
one: $(thing_wrong)

# Stays as *.o if there are no files that match this pattern :(
two: *.o

# Works as you would expect! In this case, it does nothing.
three: $(thing_right)

# Same as rule three
four: $(wildcard *.o)

- % Wildcard

% 은 매우 유용하지만 다양한 상황에서 쓰이기 때문에 다소 혼란스러울 수 있다:

  1. "matching" 모드로 사용될 때, 문자열에서 하나 혹은 그 이상의 문자들을 매칭한다. 이러한 매칭을 "stem" 이라 부른다.
  2. "replacing" 모드로 사용될 때, 매칭한 stem 을 받아서 이를 통해 문자열을 치환한다.
  3. % 는 대부분의 경우 rule 정의 그리고 일부 특정한 함수에서 사용된다.

% 와 관련된 더 자세한 사항은 Pattern Rules 에서 더 자세하게 다룰 것이다.

3. Automatic Variables

make 에는 다양한 종류의 automatic variable 이 있지만 가장 자주 사용하는 세 가지 변수만 추리면 다음과 같다:

hey: one two
	# Outputs "hey", since this is the target name
	echo $@
    
    # Outputs all prerequisites newer than the target
    echo $?
    
    # Outputs all prerequisites
    echo $^
    
    touch hey
    
one:
	touch one
    
two:
	touch two
    
clean:
	rm -f hey one two

출처

[사이트] https://makefiletutorial.com/#getting-started

profile
2000.11.30

0개의 댓글