본문 바로가기

Makefile에서 ?= 연산자와 = 연산자는 다르게 동작합니다.

= 연산자

단순 할당 연산자로, 변수를 정의하고 값을 할당합니다. 예를 들어:

SIM = icarus

이 코드는 항상 SIM 변수를 icarus로 설정합니다.

?= 연산자

조건부 할당 연산자로, 변수가 이미 정의되지 않았을 때만 값을 할당합니다. 예를 들어:

SIM ?= icarus

이 코드는 SIM 변수가 아직 정의되지 않았을 때에만 icarus 값을 할당합니다. 만약 SIM 변수가 이미 다른 값으로 설정되어 있다면, ?= 연산자는 아무런 동작도 하지 않습니다.

예시

다음 예시를 통해 =?=의 차이를 명확히 이해할 수 있습니다:

# 예시 Makefile

# SIM이 이미 정의되어 있다면, ?=는 아무 동작도 하지 않습니다.
SIM ?= icarus

all:
    @echo $(SIM)

Makefile을 실행하면 다음과 같은 동작이 일어납니다:

  1. make를 실행할 때 환경 변수로 SIM이 설정되지 않았다면, SIMicarus로 설정됩니다.
  2. make를 실행할 때 환경 변수로 SIM이 설정되어 있다면, 그 값이 사용됩니다.
make

출력:

icarus
make SIM=verilator

출력:

verilator

요약

  • =: 항상 변수를 설정합니다.
  • ?=: 변수가 아직 설정되지 않았을 때만 변수를 설정합니다.

따라서, SIM ?= icarusSIM 변수가 이미 설정되지 않은 경우에만 icarus로 설정되도록 합니다. 이는 기본값을 설정할 때 유용합니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.