$로 시작하는 특수한 목적의 예약어들
----------------------------------------------------------------------
$@: 현재 타겟(target) 이름.
$%: 아카이브 파일에서 타겟의 이름. 아카이브 파일의 특정 멤버를 대상으로 할 때 사용.
$<: 첫 번째 의존성 파일 이름.
$?: 타겟보다 나중에 수정된 모든 의존성 파일의 목록.
$^: 모든 의존성 파일의 목록 (중복 제거).
$+: 모든 의존성 파일의 목록 (중복 포함).
$|: 모든 명령줄의 의존성 파일 목록.
$*: 타겟의 확장자를 제외한 부분.
예시
# example Makefile
target: dependencies
command $@ $< $^
# 'target'이라는 타겟이 있고 'dependencies'라는 의존성이 있을 때,
# 아래의 'command'는 'target'의 이름, 첫 번째 의존성, 모든 의존성을 사용하게 됩니다.
이 외에도 GNU Make에서는 자동화 변수를 다룰 때 유용한 몇 가지 추가 변수가 있습니다:
$(@D): 타겟의 디렉토리 부분.
$(@F): 타겟의 파일 이름 부분.
$(<D): 첫 번째 의존성의 디렉토리 부분.
$(<F): 첫 번째 의존성의 파일 이름 부분.
$(^D): 모든 의존성의 디렉토리 부분.
$(^F): 모든 의존성의 파일 이름 부분.
$(MAKE)
현재의 make 프로그램을 호출할 때 사용.
예: $(MAKE) all
$(MAKECMDGOALS)
명령줄에서 지정된 목표(target)들의 목록.
예: make clean all에서 $(MAKECMDGOALS)는 clean all.
$(MAKEFLAGS)
명령줄에서 전달된 모든 옵션 및 인수.
예: make -j4에서 $(MAKEFLAGS)는 -j4.
$(CURDIR)
현재 작업 디렉토리.
예: $(CURDIR)는 현재 디렉토리의 경로.
$(SHELL)
Make가 명령을 실행하기 위해 사용하는 쉘 프로그램.
기본값은 /bin/sh.
$(.VARIABLES)
현재 정의된 모든 변수의 목록.
$(.INCLUDE_DIRS)
include 디렉토리의 목록.
$(.DEFAULT_GOAL)
기본 목표.
별도로 설정하지 않으면 첫 번째 타겟이 기본 목표가 됨.
$(.RECIPEPREFIX)
명령줄을 시작할 때 사용할 접두사 문자.
기본값은 탭 문자.
$(.SHELLFLAGS)
쉘에 전달할 기본 인수.
$(.LIBPATTERNS)
라이브러리를 찾기 위해 사용하는 패턴의 목록.
# Makefile 예시
.DEFAULT_GOAL := all
all: compile link
compile:
@echo "Compiling..."
$(MAKE) $(MAKECMDGOALS)
link:
@echo "Linking..."
$(MAKE) $(MAKECMDGOALS)
print-vars:
@echo "MAKECMDGOALS = $(MAKECMDGOALS)"
@echo "MAKEFLAGS = $(MAKEFLAGS)"
@echo "CURDIR = $(CURDIR)"
@echo "SHELL = $(SHELL)"
@echo ".VARIABLES = $(.VARIABLES)"
@echo ".INCLUDE_DIRS = $(.INCLUDE_DIRS)"
@echo ".DEFAULT_GOAL = $(.DEFAULT_GOAL)"
@echo ".RECIPEPREFIX = $(.RECIPEPREFIX)"
@echo ".SHELLFLAGS = $(.SHELLFLAGS)"
@echo ".LIBPATTERNS = $(.LIBPATTERNS)"
.으로 시작하는 특수한 목적의 예약어들
------------------------------------------------------------
.PHONY
파일 시스템에 실제로 존재하지 않는 가상 목표(target)를 정의할 때 사용.
예: .PHONY: clean
.SUFFIXES
사용 가능한 파일 확장자의 목록을 정의.
예: .SUFFIXES: .c .o .cpp
.DEFAULT
지정된 목표(target)를 찾을 수 없을 때 실행할 명령을 정의.
예: .DEFAULT: @echo "No rule to make target '$@'"
.PRECIOUS
중간 파일들이 삭제되지 않도록 보호.
예: .PRECIOUS: %.o
.INTERMEDIATE
중간 파일을 나타내며, 필요 없을 때 삭제됨.
예: .INTERMEDIATE: %.o
.SECONDARY
.INTERMEDIATE와 비슷하지만, 필요 없을 때 삭제되지 않음.
예: .SECONDARY: %.o
.SECONDEXPANSION
두 번째 확장을 허용.
예: .SECONDEXPANSION:
.EXPORT_ALL_VARIABLES
모든 변수를 환경 변수로 내보냄.
예: .EXPORT_ALL_VARIABLES:
.NOTPARALLEL
병렬 실행을 비활성화.
예: .NOTPARALLEL:
.ONESHELL
하나의 쉘 인스턴스에서 모든 명령을 실행.
예: .ONESHELL:
.POSIX
POSIX 표준을 준수하도록 설정.
예: .POSIX:
.IGNORE
명령의 실패를 무시.
예: .IGNORE: errors
.LOW_RESOLUTION_TIME
타임스탬프 비교를 초 단위로 수행.
예: .LOW_RESOLUTION_TIME:
.SILENT
명령을 실행할 때 명령을 출력하지 않음.
예: .SILENT:
.DELETE_ON_ERROR
명령이 실패할 경우 생성된 타겟 파일을 삭제.
예: .DELETE_ON_ERROR:
예시 makefile
.PHONY: all clean
all: compile link
compile:
@echo "Compiling..."
link:
@echo "Linking..."
clean:
@echo "Cleaning up..."
rm -f *.o
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
.DEFAULT:
@echo "No rule to make target '$@'"
.IGNORE: clean
이 예시에서는 .PHONY, .SUFFIXES, .DEFAULT, .IGNORE를 사용하여
다양한 Makefile 동작을 정의하고 제어하는 방법을 보여줍니다.
이러한 예약어들은 Makefile의 유연성을 높이고 특정 조건에 맞는 동작을 쉽게 구현할 수 있게 해줍니다.