수색…


변수 참조하기

변수에 저장된 값을 사용하려면 달러 기호 다음에 괄호 또는 중괄호로 묶인 변수 이름을 사용하십시오.

x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same

변수의 이름이 하나의 문자 만이라면 괄호 / 괄호를 생략 할 수 있습니다 (예 : $x ). 이 방법은 자동 변수 (아래 참조)에 사용되지만 범용 변수에는 권장되지 않습니다.

간단히 확장 된 변수

간단히 확장 된 변수는 기존 프로그래밍 언어의 변수처럼 작동합니다. 오른쪽에있는 표현식이 평가되고 그 결과가 변수에 저장됩니다. 오른쪽에 변수 참조가 포함되어 있으면 할당이 수행되기 전에 해당 변수가 확장됩니다.

x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"

대체 양식은 이중 콜론 할당을 사용하는 것입니다.

x ::= hello

단일 및 이중 콜론 할당은 동일합니다. POSIX make 표준은 ::= 형식만을 언급하므로 엄격한 표준 준수를 가진 구현이 단일 콜론 버전을 지원하지 않을 수 있습니다.

재귀 적으로 확장 된 변수

재귀 적으로 확장 된 변수를 정의 할 때 오른쪽의 내용은있는 그대로 저장됩니다. 변수 참조가 있으면 참조 자체가 저장됩니다 (변수 값 아님). 변수가 실제로 사용될 때까지 변수 참조를 확장하기 위해 대기하십시오.

x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"

이 예제에서, y 의 정의는 재귀 적이다. $(y) 가 확장 될 때까지 $(x) 대한 참조는 확장되지 않습니다. 즉, x 값이 변경 될 때마다 y 값도 변경됩니다.

재귀 적으로 확장 된 변수는 강력하지만 쉽게 오해되는 도구입니다. 그것들은 템플릿이나 함수와 유사한 구조를 생성하거나 makefile의 일부를 자동으로 생성하는 데 사용될 수 있습니다. 또한 디버깅하기 어려운 문제의 원인이 될 수 있습니다. 필요한 경우 재귀 적으로 확장 된 변수 만 사용하도록주의하십시오.

자동 변수

개별 규칙의 컨텍스트 내에서 Make는 많은 수의 특수 변수를 자동으로 정의합니다. 이러한 변수는 makefile의 각 규칙마다 다른 값을 가질 수 있으며 작성 규칙을보다 단순하게 만들도록 설계되었습니다. 이 변수는 규칙의 래서 피 부분에서만 사용할 수 있습니다.

변하기 쉬운 기술
$@ 규칙의 대상 파일 이름
$% 대상의 이름 (해당 규칙 대상이 아카이브 인 경우)
$< 첫 번째 전제 조건의 파일 이름
$^ 모든 필수 구성 요소 목록
$? 대상보다 새로운 모든 필수 구성 요소 목록
$* 암시 적 또는 패턴 규칙의 "줄기"

다음 예제에서는 자동 변수를 사용하여 일반 규칙을 생성합니다. 이것은 같은 이름의 .c 파일에서 .o 파일을 만드는 방법을 지시합니다. 영향을받는 파일의 특정 이름을 알지 못하므로 출력 파일의 이름에 $@ 를 사용하고 필수 목록 (이 경우 입력 파일의 목록)에 대한 자리 표시 자로 $^ 를 사용합니다.

%.o: %.c
    cc -Wall $^ -c $@

조건부 변수 할당

?= 연산자는 변수가 아직 설정되지 않은 경우 에만 할당이 발생한다는 점을 제외하고는 = 처럼 작동하는 확장입니다.

x = hello
x ?= world
# $(x) will yield "hello"

기존 변수에 텍스트 추가

+= 연산자는 지정된 내용을 공백으로 구분하여 변수 끝에 추가하는 공통 확장입니다.

x = hello
x += world

원래 변수가 단순 확장 변수로 정의 된 경우에만 오른쪽에있는 변수 참조가 확장됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow