무엇이?
Norm에 따르면 make re는 make fclean 후 make all 한 것과 같아야 합니다.
re: fclean all
Makefile
복사
아마도 많이 쓰고 있을 re 규칙 - 절대로 이렇게 쓰면 안 됩니다!
그런데 여러분, 이 경우에 all이 fclean 보다 나중에 실행되지 않을 수 있다는 사실을 아시나요?
왜?
크게 두 가지 경우가 있어요.
순서가 바뀌는 경우
사실 일반적인 경우의 re: fclean all에서 순서가 뒤바뀌지는 않습니다.
문제는 이런 경우입니다.
all: test clean
test: clean
# ... do something
clean:
rm -rf $(TMP_FILES)
Makefile
복사
의도와 다르게 동작하는 Makefile
테스트를 진행한 후 잔여 파일들을 정리하고 싶을 수 있을 거에요.
make test 후 make clean 한 것과 같은 효과를 얻기 위해서 all: test clean으로 작성했습니다.
하지만 실제로는 clean이 먼저 실행됩니다. clean이 이미 test의 의존성에 포함되어 있어서요.
동시에 실행되는 경우
make -j 2 re
Shell
복사
make를 두 개의 스레드를 사용해 병렬로 실행하는 명령어
make의 -j 옵션으로 여러 작업을 동시에 병렬로 처리하도록 할 수 있습니다.
all과 fclean은 의존 관계가 없기 때문에 동시에 시작될 것입니다.
해결 방법
의존성은 의존성일 뿐입니다.
순서가 보장된 작업이 필요한 경우 의존성을 사용하지 마세요.
re:
$(MAKE) fclean
$(MAKE) all
Makefile
복사
의존성을 사용하지 않는, 제대로 동작하는 예시