[C] Makefile 매크로

EunJin
2 min readMar 16, 2021

--

코드에서 중복되는 파일 이름들을 특정 단어로 치환하면 됩니다. 마치 C언어에서 #define을 하는 것과 비슷한 원리입니다.

매크로를 사용하면 Makefile을 보다 깔끔하고 확장성 있게 작성할 수 있습니다.

매크로 사용 규칙

  • 매크로를 참조할 때는 소괄호나 중괄호 둘러싸고 앞에 ‘$’를 붙입니다.
  • 탭으로 시작해서는 안 되고 :, =, #, ”” 등 매크로 이름에 사용할 수 없습니다.
  • 매크로는 반드시 치환될 위치보다 먼저 정의되어야 합니다.

매크로 사용 예시

다음은 매크로를 사용한 Makefile 예시입니다.

아래는 실행 결과입니다.

여기서 정의한 각 매크로의 의미는 다음과 같습니다. 참고로, 이들 중 CC와 CFLAGS는 Make 내장 매크로입니다.

  • CC : 컴파일러
  • CFLAGS : 컴파일 옵션
  • OBJS : 중간 산물 Object 파일 목록
  • TARGET : 빌드 대상(실행 파일) 이름

그 외에 자주 사용되는 내장 매크로는 다음과 같습니다.

  • LDFLAGS: 링커 옵션
  • LDLIBS: 링크 라이브러리

위에서 사용 된 옵션의 의미는 아래와 같습니다.

  • -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션입니다.
  • -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션입니다.
  • -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생합니다.

자동 변수(Automatic variables)

자동 변수는 위치한 곳의 맥락에 맞도록 치환됩니다. Make에서 지원하는 자동 변수들 중 자주 사용하는 것들은 다음과 같습니다.

  • “$@” : 현재 타겟의 이름
  • “$^” : 현재 타겟의 종속 항목 리스트

Clean Rule

Clean 매크로는 빌드 결과물(e.g. app.out)과 중간 부산물들(*.o, 바이너리)을 모두 삭제하여 ‘깨끗한’ 상태에서 다시 빌드 할 수 있는 환경을 만들어 줍니다. 이렇게 하고 수행하는 빌드를 Clean build라고 합니다.

clean:
rm -f * .o
rm -f $(TARGET)

Clean build는 잘못된 의존성 검사로 인해 변경사항이 반영되지 않아 빌드 오류가 발생하는 것으로 추정될 때 수행합니다. 이는 소스 코드를 수정하면서 의존성이 변동될 때(e.g. 헤더 파일을 추가한 경우) Makefile을 제때 업데이트하면 해결됩니다.

--

--

EunJin
EunJin

No responses yet