부분 직렬화를 위해 GNU make를 사용하는 방법

부분 직렬화를 위해 GNU make를 사용하는 방법

다른 대상보다 먼저 특정 대상을 생성해야 하는 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강제로 생성되도록 할 수 있지만 나중에 다른 파일을 복사하면 이 방법보다 속도가 더 빨라집니다. 다시 한번, 소스가 최신이 될 때까지 복사해도 예상한 결과가 나오지 않는 경우에만 가능합니다.dirdir/file,dir,dirdir/filemakedir/filemakedir/file.

make이것은 또 다른 질문을 제기합니다. 의존하지 않고 복제 전에 생성을 강제하는 종속성 토폴로지를 갖는 것이 가능합니까?dirdir/filedirdir/file.

답변1

GNU make에서는 다음을 사용할 수 있습니다.전제 조건만 주문dir생성하려는 규칙을 실행하기 전에 생성해야 합니다 dir/file.

바라보다이 페이지자세한 내용은.

GNU make 매뉴얼의 예에서 파일을 생성하기 전에 생성되는 디렉터리에 대한 종속성을 추가하기 위해 실제로 맞춤화되어 있음을 볼 수 있습니다.

구체적인 예를 들어 다음과 같이 해야 합니다.

dir/file: | dir
        cp source dir/file

기존 규칙을 수정할 필요는 없지만 Makefile의 다른 곳에 이 종속성을 추가할 수 있습니다.

보다 구체적으로, 메이크파일이 다른 메이크 구현으로 처리될 수 있도록 하는 방식으로 솔루션을 작성해야 합니다.

나는 이것이 다른 make 구현에서는 작동하지 않을 것이라고 생각합니다 ... 가능한 해결책 중 하나 GNUmakefileincludeMakefileGNU에서 만든 특정 확장도 추가되었습니다 .

예를 들어 규칙 .WAITGNUmakefile.

이 지침이 도움이 되기를 바랍니다!

답변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로 확장할 수 있고 sunproSunPro 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

마지막 줄은 관련성이 없는 정크 규칙으로 간주됩니다.

관련 정보