본문 바로가기

카테고리 없음

makefile에서 사용하는 예약된 특수한 변수 목록

$로 시작하는 특수한 목적의 예약어들

----------------------------------------------------------------------

 

$@: 현재 타겟(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의 유연성을 높이고 특정 조건에 맞는 동작을 쉽게 구현할 수 있게 해줍니다.