~에 따르면GNU 제작 매뉴얼
여러 목표가 있는 규칙은 각각 목표가 있는 여러 규칙을 작성하는 것과 동일하며 그 외에는 동일합니다. 동일한 레시피가 모든 대상에 적용되지만 "$@"를 사용하여 실제 대상 이름을 레시피로 바꿀 수 있으므로 효과가 다를 수 있습니다. 또한 이 규칙은 모든 대상에 대해 동일한 전제 조건을 제공합니다.
처음 생성된 파일:
%.in %.out:
echo BLANK > $@
해당 bash 세션:
$ ls
Makefile
$ make a.in a.out
echo BLANK > a.in
make: Nothing to be done for 'a.out'.
$ ls
Makefile a.in
$ make a.out
echo BLANK > a.out
$ ls
Makefile a.in a.out
$ make b.in c.out
echo BLANK > b.in
echo BLANK > c.out
$ make d.in d.out
echo BLANK > d.in
make: Nothing to be done for 'd.out'.
$ make e.out e.in
echo BLANK > e.out
make: Nothing to be done for 'e.in'.
$ ls
Makefile a.in a.out b.in c.out d.in e.out
두 번째 생성된 파일:
%.in:
echo BLANK > $@
%.out:
echo BLANK > $@
해당 bash 세션:
$ ls
Makefile
$ make a.in a.out
echo BLANK > a.in
echo BLANK > a.out
$ ls
Makefile a.in a.out
$ # nice
따라서 질문은 다음과 같습니다.
첫 번째 Makefile <name>.in <same name>.out
도 대상을 생성하지 않는 이유는 무엇입니까? 해석이 두 번째 Makefile과 유사하지 않은 이유는 무엇입니까?
답변1
귀하의 규칙에 따르면 make
레시피에 대한 단일 호출로둘 다그리고 목표 .in
..out
https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html이것을 설명합니다. (두 번째 단락에서) 다음과 같이 말합니다.
"패턴 규칙은 여러 대상을 가질 수 있지만 각 대상에는 % 문자가 포함되어야 합니다. 패턴 규칙의 여러 대상은 사용 여부에 관계없이 항상 그룹화된 대상으로 처리됩니다(규칙의 여러 대상 참조): 또는 &: 구분 기호 .”
그다음 링크를 클릭하시면많은 목표그룹화 대상( &:
일반적으로 명시적인 규칙이 있는 경우 구분 기호 사용)이 make
생성할 레시피에 대한 단일 호출을 알려준다고 설명합니다.모두한 번에 하나씩이 아니라 그 중 하나입니다.
따라서 패턴 규칙은 다음과 같습니다.
a.in a.out &:
echo BLANK > $@
...원하는 것과 동등한 대신:
a.in a.out :
echo BLANK > $@
내가 아는 한, 후자처럼 작동하고 한 번에 하나만 생성하는 패턴 규칙을 만들 수 있는 방법은 없습니다. 넌 그냥 갖고 있으면 돼분리%.in
그리고 규칙%.out
답변2
단일 규칙에 여러 암시적 대상이 있으면 안 됩니다. 이것이 어디에서 언급되었는지 기억이 나지 않지만 그러한 규칙은 확실히 나쁜 습관입니다. 일어나는 일은 다음과 같습니다.
$ cat Makefile
%.in %.out :
echo BLANK > $@
$ make -d a.in a.out
[... irrelevant output skipped ...]
Updating goal targets....
Considering target file 'a.in'.
File 'a.in' does not exist.
Looking for an implicit rule for 'a.in'.
Trying pattern rule with stem 'a'.
Found an implicit rule for 'a.in'.
Finished prerequisites of target file 'a.in'.
Must remake target 'a.in'.
echo BLANK > a.in
Successfully remade target file 'a.in'.
Considering target file 'a.out'.
File 'a.out' was considered already.
make: Nothing to be done for 'a.out'.
다음 줄을 확인하세요.
Considering target file 'a.out'.
File 'a.out' was considered already.
암시적 대상은 시도 전에 "존재"하지 않으므로 규칙은 여러 규칙으로 "분할"되지 않습니다. 시도가 이루어 지고 a.in
일치가 성공하면 다른 모든 대상은 시도된 것으로 표시됩니다. 대부분의 경우 이것은 당신이 원하는 것이 아닙니다. 두 가지 규칙만 작성하세요.