Search
Duplicate
🚫

`re: fclean all`을 쓰지 마세요!

간단소개
Makefile 토막 상식: re: fclean all 쓰시는 분 필독! 0점 받아도 할 말 없어요
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Makefile
42seoul
Scrap
태그
makefile
9 more properties

무엇이?

Norm에 따르면 make remake fcleanmake all 한 것과 같아야 합니다.
re: fclean all
Makefile
복사
아마도 많이 쓰고 있을 re 규칙 - 절대로 이렇게 쓰면 안 됩니다!
그런데 여러분, 이 경우에 allfclean 보다 나중에 실행되지 않을 수 있다는 사실을 아시나요?

왜?

크게 두 가지 경우가 있어요.

순서가 바뀌는 경우

사실 일반적인 경우의 re: fclean all에서 순서가 뒤바뀌지는 않습니다.
문제는 이런 경우입니다.
all: test clean test: clean # ... do something clean: rm -rf $(TMP_FILES)
Makefile
복사
의도와 다르게 동작하는 Makefile
테스트를 진행한 후 잔여 파일들을 정리하고 싶을 수 있을 거에요.
make testmake clean 한 것과 같은 효과를 얻기 위해서 all: test clean으로 작성했습니다.
하지만 실제로는 clean이 먼저 실행됩니다. clean이 이미 test의 의존성에 포함되어 있어서요.

동시에 실행되는 경우

make -j 2 re
Shell
복사
make를 두 개의 스레드를 사용해 병렬로 실행하는 명령어
make의 -j 옵션으로 여러 작업을 동시에 병렬로 처리하도록 할 수 있습니다.
allfclean은 의존 관계가 없기 때문에 동시에 시작될 것입니다.

해결 방법

의존성은 의존성일 뿐입니다.
순서가 보장된 작업이 필요한 경우 의존성을 사용하지 마세요.
re: $(MAKE) fclean $(MAKE) all
Makefile
복사
의존성을 사용하지 않는, 제대로 동작하는 예시