메이크파일이 있는데 확인하고 싶습니다.모든 규칙순차적으로 실행됩니다. 즉,병렬 실행처형되다.
나는 가지고 있다고 믿는다세 가지 방법이 목표를 달성하려면:
- 그리고
.NOTPARALLEL
표적, - 을 호출하여
make
사용합니다make -j 1
. - 예를 들어 makefile에서 직접 플래그를 설정하면 다음과 같습니다.
MAKEFLAGS := -j 1
세 가지 사이에 "모범 사례"가 있으며 어느 것이 더 강력합니까?
예를 들어, 이건 너무한 걸까요?
MAKEFLAGS := --jobs=1
.NOTPARALLEL:
all:foo bar
.NOTPARALLEL:
foo:bar
.NOTPARALLEL:
bar:
@echo "test"
?
답변1
네, 이건 너무해요.
세 가지 옵션에 관한 한:
두 가지 이유로 this 를 설정하면 안 됩니다
MAKEFLAGS
. 명령줄에 전달된 플래그에 문제가 발생하고MAKEFLAGS
외부에서 강력하게 수정될 수 있는 방식으로 작동하지 않습니다. 이러한 두 가지 문제가 실제로 실행되는 모습을 보려면@echo $(MAKEFLAGS)
시나리오에 규칙을 추가bar
하고 실행하세요make -n bar
.make -j 1
원하는 효과가 있지만 일시적으로 모든 것을 직렬로 실행하려는 경우에 가장 적합합니다. 이는 사용되는 리소스를 제한하려는 경우 또는 병렬 실행 문제를 디버깅하는 경우 유용합니다. 이는 적어도 GNU Make에서는 기본값이기도 합니다. 기본적으로 Make는 한 번에 하나의 작업만 실행합니다..NOTPARALLEL:
원하는 효과를 얻으려면 한 번만 지정하면 되며 직렬화 요구 사항이 Makefile의 속성인 상황에 적합합니다.즉모든 실행은 가능한 외부 영향 없이 지속적으로 이루어져야 합니다.
그러나 빌드가 많이 사용될 예정이라면 시간을 들여 규칙의 병렬 실행이 문제를 일으키는 이유를 파악하고 적절한 종속성을 추가하는 것이 더 낫다고 생각합니다. GNU Make 지원전제 조건만 주문"참신한" 종속성을 적용하지 않고 강제로 주문하는 데 사용할 수 있습니다. 이 경우 이는 종종 도움이 됩니다. 바라보다이 답변SO에서 찾은 질문에.