다른 대상보다 먼저 특정 대상을 생성해야 하는 make 작업이 있는 경우 병렬 모드에서 SunPro Make(dmake)를 사용하면 쉽습니다. 생성된 파일은 다음과 같습니다.
install: dir dir/file
dir:
mkdir dir
dir/file:
cp source dir/file
첫 번째 줄을 평행으로 변경하면 안전하게 수행할 수 있습니다.
install: dir .WAIT dir/file
또는 다음을 사용하여:
.NO_PARALLEL: install
왼쪽이나 오른쪽의 대상 목록이 병렬 모드로 .WAIT
처리되더라도 makefile의 나머지 부분은 여전히 병렬 모드로 처리됩니다.
바라보다:http://schilytools.sourceforge.net/man/man1/make.1s.html그리고http://schilytools.sourceforge.net/man/man1/dmake.1.html
그러나 GNU make에는 비슷한 옵션이 없는 것 같습니다. GNU make로 이것을 할 수 있는 방법이 정말로 없을까요?
보다 구체적으로, 메이크파일이 다른 메이크 구현으로 처리될 수 있도록 하는 방식으로 솔루션을 작성해야 합니다.
특수 대상 .WAIT는 make 프로그램과 관련된 $(WAIT)라는 매크로에 위치할 수 있습니다.
도움이 되지 않는 확실한 해결책이 있습니다.
이론적으로는 복사를 시도하기 전에 dir
종속성을 설정하여 dir/file
강제로 생성되도록 할 수 있지만 나중에 다른 파일을 복사하면 이 방법보다 속도가 더 빨라집니다. 다시 한번, 소스가 최신이 될 때까지 복사해도 예상한 결과가 나오지 않는 경우에만 가능합니다.dir
dir/file,
dir,
dir
dir/file
make
dir/file
make
dir/file.
make
이것은 또 다른 질문을 제기합니다. 의존하지 않고 복제 전에 생성을 강제하는 종속성 토폴로지를 갖는 것이 가능합니까?dir
dir/file
dir
dir/file.
답변1
GNU make에서는 다음을 사용할 수 있습니다.전제 조건만 주문dir
생성하려는 규칙을 실행하기 전에 생성해야 합니다 dir/file
.
바라보다이 페이지자세한 내용은.
GNU make 매뉴얼의 예에서 파일을 생성하기 전에 생성되는 디렉터리에 대한 종속성을 추가하기 위해 실제로 맞춤화되어 있음을 볼 수 있습니다.
구체적인 예를 들어 다음과 같이 해야 합니다.
dir/file: | dir
cp source dir/file
기존 규칙을 수정할 필요는 없지만 Makefile의 다른 곳에 이 종속성을 추가할 수 있습니다.
보다 구체적으로, 메이크파일이 다른 메이크 구현으로 처리될 수 있도록 하는 방식으로 솔루션을 작성해야 합니다.
나는 이것이 다른 make 구현에서는 작동하지 않을 것이라고 생각합니다 ... 가능한 해결책 중 하나 GNUmakefile
는include
Makefile
GNU에서 만든 특정 확장도 추가되었습니다 .
예를 들어 규칙 .WAIT
을 GNUmakefile
.
이 지침이 도움이 되기를 바랍니다!
답변2
디렉터리가 그 아래의 파일보다 먼저 생성되도록 종속성을 추가해야 합니다.
"태그" 파일을 사용하여 디렉터리의 종속성을 표시하면 그 아래에 파일을 생성해도 디렉터리의 타임스탬프에 영향을 주지 않습니다. 또한 GNU make 특정 기능이 필요하지 않습니다.
귀하의 예에서 :
install: dir/file
dir/.marker:
mkdir -p dir
touch dir/.marker
dir/file: dir/.marker
cp source dir/file
.directory
또는 마크업 파일로 .dir
사용할 수 있습니다 ..folder
답변3
다음은 Filipe Brandenburger가 제안한 아이디어와 Schily Makefile 시스템에서 사용되는 일반적인 접근 방식에서 파생된 내 답변입니다.
makefile 시스템은 make macros
다음이 이러한 방식으로 설정되도록 보장합니다.
WAIT= # empty with GNU make
WAIT= .WAIT # .WAIT special target with SunPro Make
MAKEPROG= <name of the make program> # This is from: smake, gmake, sunpro
_UNIQ= .XxZzy-
이제 위의 매크로 정의 makefile을 사용하십시오.
_NORULE= $(_UNIQ)$(MAKEPROG)
__NORULE= $(_NORULE:$(_UNIQ)gmake=)
NORULE= $(__NORULE:$(_UNIQ)%=%)
install: dir $(WAIT) dir/file
dir/file: source
cp source dir/file
dir:
mkdir -p dir
$(NORULE)dir/file: | dir
$(NORULE)
gmake를 사용하여 null로 확장할 수 있고 sunpro
SunPro Make를 사용하여 null로 확장할 수 있습니다.
gmake의 경우 전체 makefile은 다음과 같이 확장됩니다.
install: dir dir/file
dir/file: source
cp source dir/file
dir:
mkdir -p dir
dir/file: | dir
SunPro Make의 경우 전체 makefile은 다음으로 확장됩니다.
install: dir .WAIT dir/file
dir/file: source
cp source dir/file
dir:
mkdir -p dir
sunprodir/file: | dir
마지막 줄은 관련성이 없는 정크 규칙으로 간주됩니다.