Skip to content

Make:AutomaticVariables

make에서 사용하는 자동변수에 대한 자세한 설명을 정리한다.

자동 변수들 (Automatic Variables)

$*
확장자가 없는 목표이름.
묵시적 규칙이 일치하는 (See section How Patterns Match1) 대상 줄기(stem). 타겟이 'dir/a.foo.b' 이고 타겟 패턴이 'a.%.b' 이라면 줄기는 'dir/foo' 이다. 줄기는 관련된 파일들의 이름을 만들때 유용하다. 정적 패턴 규칙에서 줄기는 타겟 패턴에서 '%' 과 일치한, 파일 이름의 일부분을 말한다. 명시적 규칙에서는 줄기가 없다. 그래서 $*는 그런식으로 결정될 수 없다. 대신에 타겟 이름이 인식된 접미사로 끝난다면 (See section Old-Fashioned Suffix Rules2), $* 는 타겟 이름 빼기 접미사로 설정된다. 예를 들어서, 타겟 이름이 'foo.c' 이라면, $* 는 'foo' 로 설정된다, 왜냐면 '.c' 가 접미사이기 때문이다. GNU make 는 다른 make 구현물과의 호환성을 위해서만 이런 괴기스런 일을 한다. 일반적으로 묵시적 규칙들이나 정적 패턴 규칙들을 제외하고는 $* 를 쓰지 않도록 해야 할 것이다. 명시적 규칙 안의 타겟 이름이 인식된 접미사로 끝나지 않는다면 $* 는 그 규칙에 대해서 빈 문자열로 설정된다. $? 는 변경한 종속물들에 대해서만 작업을 하고자 할 때, 명시적 규칙들 안에서도 유용하다. 예를 들어서 'lib' 라는 이름의 아카이브가 몇개의 오브젝트 파일들의 복사물들을 담고 있다고 가정해보자. 다음 규칙은 변경된 오브젝트 파일들만을 아카이브에다 넣을 것이다.
$@
target 으로 치환.
규칙에 있는 타겟의 파일 이름. 타겟이 아카이브 멤버이면 $@는 아카이브 파일의 이름이다. 여러개의 타겟들(See section Introduction to Pattern Rules3)을 가지고 있는 패턴 규칙에서 $@는 규칙의 명령이 실행되도록 만든 타겟이면 무엇이든 이 타겟의 이름이 된다.
$%
타겟이 아카이브 멤버(See section Using make to Update Archive Files4)일 때, 타겟 멤버 이름. 예를 들어서 타겟이 'foo.a(bar.o)'이면 $%는 'bar.o'이고 $@는 'foo.a'이다. 타겟이 아카이브 멤버가 아니면 $%는 빈 것이 된다.
$^
dependency 전체로 치환.
모든 종속물들의 이름. 이들 사이에는 스페이스들이 들어간다. 아카이브 멤버인 종속물들에 대해서 이름있는(지정된) 멤버만이 사용된다 (See section Using make to Update Archive Files5). 타겟은 이것이 의존하는 다른 각 파일들에 대해서 각 파일이 종속물 리스트에서 몇번이나 나왔는가에 상관없이, 딱 한번만 사용한다. 그래서 어떤 타겟을 위해서 한번 이상 종속물을 사용한다면 $^의 값은 그 이름을 딱 한번 담고 있는 형태가 된다.
$<
열거된 dependency중 가장 왼쪽에 기술된 1개의 dependency로 치환.
첫번째 종속물의 이름. 타겟이 묵시적 규칙으로부터 그의 명령들을 얻었다면 이것은 묵시적 규칙에 의해서 추가된 첫번째 종속물이 될 것이다 (See section Using Implicit Rules6)
$?
target과 dependency중 변경날짜를 비교하여 dependency의 변경날짜 중 최근에 변경된것만 치환. 주로 라이브러리의 생성 및 관리에 사용된다.
타겟보다 더 새로운 모든 종속물들의 이름들. 이들 사이에는 스페이스들이 들어간다. 아카이브 멤버들인 종속물들에 대해서 이름이 있는 멤버만이 사용된다 (see section Using make to Update Archive Files7).
$+
이것은 $^와 비슷하다. 그러나 종속물들이 makefile 에서 리스트된 순서와 나타난 대로 중복되었다고 해도 한번 이상 리스트된다. 이것은 특별한 순서로 라이브러리 파일 이름들을 반복하는 것이 의미가 있는 링크 명령들 안에서 주로 유용하다.

변종 자동변수 테이블

$(@D)
The directory part of the file name of the target, with the trailing slash removed. If the value of $@ is 'dir/foo.o' then $(@D) is 'dir'. This value is '.' if $@ does not contain a slash.
$(@F)
타겟의 파일 이름에서 디렉토리 파트에 들어 있는 파일 부분을 가리킨다. $@ 의 값이 'dir/foo.o' 이라면 $(@F) 는 'foo.o' 이다. $(@F)$(notdir $@) 과 동일하다.
$(*D), $(*F)
줄기의 디렉토리 부분과 디렉토리 파트 안에 들어 있는 파일 부분을 가리킨다. 이 예제의 경우라면 'dir' 과 'foo' 가 될 것이다.
$(%D), $(%F)
타겟 아카이브 멤버 이름 중에서 디렉토리 파트와 디렉토리 파트 안에 들어 있는 파일 부분을 가리킨다. 이것은 'archive(member)' 형태의 아카이브 멤버 타겟들에 대해서만 의미가 있고 member 가 디렉토리 이름을 갖고 있을 때만 유용하다. (See section Archive Members as Targets08)
$(<D), $(<F)
첫번째 종속물의 디렉토리 파트와 디렉토리 파트 안에 들어 있는 파일 부분을 가리킨다.
$(^D), $(^F)
모든 종속물들의 디렉토리 부분들과 디렉토리에 들어 있는 파일 부분들을 가리킨다.
$(?D), $(?F)
타겟보다 더 새로운 모든 종속물들의 디렉토리 부분들과 디렉토리 내 파일들 부분을 가리킨다.

See also

References


  1. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_10.html#SEC98 항목 참조 

  2. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_10.html#SEC102 항목 참조 

  3. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_10.html#SEC95 항목 참조 

  4. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_11.html#SEC104 항목 참조 

  5. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_11.html#SEC104 항목 참조 

  6. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_10.html#SEC89 항목 참조 

  7. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_11.html#SEC104 항목 참조 

  8. Viper.pe.kr-make-ko.7z의 viper.pe.kr/make-ko/make-ko_11.html#SEC105 항목 참조