Search
Duplicate

[토막글] Make와 Sanitizer 더 잘 쓰기

간단소개
sanitizer 바꿀 때마다 Makefile 수정하고 make re 하고... ㅇ아악!!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
C++
개발환경
Makefile
Scrap
태그
makefile
sanitizer
개발환경
9 more properties
관련 글 보기

Sanitizer 기본 사용법

Sanitizer에는 AddressSanitizer, MemorySanitizer, UBSanitizer 등이 있습니다.
CFLAGS += -fsanitize=address
Makefile
복사
기본적인 AddressSanitizer 사용 예시?
CFLAGS 변수에 -fsanitize=address만 추가해도 AddressSanitizer를 사용할 수 있습니다.

문제점

1.
Sanitizer를 사용하면 느려집니다. 필요할 때만 사용해야 합니다.
2.
AddressSanitizerMemorySanitizer를 동시에 사용할 수 없습니다.
3.
Sanitizer 없이 컴파일을 했더라도, Sanitizer를 사용하려면 다시 컴파일해야 합니다.
1번, 2번으로 인해 -fsanitizer 플래그를 자주 바꾸게 되고,
3번으로 인해 -fsanitizer 플래그를 바꿀 때마다 make re로 다시 빌드해야 합니다.

해결 방안

Sanitizer를 사용할 때 목적 파일의 이름을 바꿀 수 있습니다.
SUFFIX := $(if $(SANITIZER),.$(SANITIZER)) %$(SUFFIX).o: %.c $(CC) $(CFLAGS) -c $< -o $@ -MMD $(if $(SANITIZER),-fsanitize=$(SANITIZER),) output$(SUFFIX).a: $(SRCS:.c=$(SUFFIX).o) $(NAME): output$(SUFFIX).a cp $< $@ .PHONY: $(NAME)
Makefile
복사
sanitizer를 사용할 경우 목적 파일의 이름을 바꿔서 사용하는 예시
make SANITIZER=address로 빌드하면 AddressSanitizer를 사용하게 되고,
Sanitizer를 바꾸더라도 이미 빌드한 것을 삭제하지 않아 빠르게 다시 빌드할 수 있습니다.

응용

같은 방법으로 .so(.dylib)로 빌드하기 위한 -fPIC 플래그에 따라서,
또는 dev/prod, debug/release 등 설정에 따라서 목적 파일의 이름을 바꾸면
빌드 환경을 간단하게 구성할 수 있습니다.