유추 규칙
NMAKE의 유추 규칙은 대상을 업데이트하고 대상에 대한 종속성을 유추하는 명령을 제공합니다. 유추 규칙의 확장은 동일한 기본 이름을 가진 단일 대상 및 종속 대상과 일치합니다. 유추 규칙은 사용자 정의 또는 미리 정의됩니다. 미리 정의된 규칙을 다시 정의할 수 있습니다.
오래된 종속성에 명령이 없고 종속의 확장명이 포함된 경우 .SUFFIXES
NMAKE는 확장명이 대상과 일치하고 현재 또는 지정된 디렉터리의 기존 파일과 일치하는 규칙을 사용합니다. 둘 이상의 규칙이 기존 파일 .SUFFIXES
과 일치하는 경우 목록에서 사용할 항목을 결정합니다. 목록 우선 순위는 왼쪽에서 오른쪽으로 내림차순입니다. 종속 파일이 없고 다른 설명 블록에 대상으로 나열되지 않은 경우 유추 규칙은 동일한 기본 이름을 가진 다른 파일에서 누락된 종속 파일을 만들 수 있습니다. 설명 블록의 대상에 종속 또는 명령이 없으면 유추 규칙이 대상을 업데이트할 수 있습니다. 유추 규칙은 설명 블록이 없더라도 명령줄 대상을 빌드할 수 있습니다. NMAKE는 명시적 종속이 지정된 경우에도 유추된 종속에 대한 규칙을 호출할 수 있습니다.
규칙 정의
from_ext 종속 파일의 확장자를 나타내며 to_ext 대상 파일의 확장자를 나타냅니다.
.from_ext.to_ext:
commands
확장은 대/소문자를 구분하지 않습니다. 매크로를 호출하여 from_ext 나타내고 to_ext. 전처리 중에 매크로가 확장됩니다. from_ext 앞에 오는 마침표(.
)가 줄의 시작 부분에 나타나야 합니다. 콜론(:
)의 앞에는 0개 이상의 공백 또는 탭이 있습니다. 뒤에는 공백이나 탭, 명령을 지정하는 세미콜론(;
), 주석을 지정하는 숫자 기호(#
) 또는 줄바꿈 문자만 사용할 수 있습니다. 다른 공백은 허용되지 않습니다. 명령은 설명 블록에서와 같이 지정됩니다.
규칙에서 경로 검색
{from_path}.from_ext{to_path}.to_ext:
commands
유추 규칙은 종속성에 지정된 경로가 유추 규칙 경로와 정확히 일치하는 경우에만 종속성에 적용됩니다. from_path 종속의 디렉터리와 대상의 디렉터리를 to_path 지정합니다. 공백은 허용되지 않습니다. 각 확장에 대해 하나의 경로만 지정합니다. 한 확장의 경로에는 다른 확장의 경로가 필요합니다. 현재 디렉터리를 지정하려면 마침표(.
) 또는 빈 중괄호({ }
)를 사용합니다. 매크로는 전처리 중에 호출되는 from_path 및 to_path 나타낼 수 있습니다.
검색 경로의 예
{dbi\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUDBI) $<
{ilstore\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{misc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{misc\}.c{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{msf\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{bsc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{mre\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{namesrvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{src\cvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
일괄 처리 모드 규칙
{from_path}.from_ext{to_path}.to_ext::
commands
일괄 처리 모드 유추 규칙은 N 명령이 이 유추 규칙을 통과할 때 유추 규칙을 하나만 호출합니다. 일괄 처리 모드 유추 규칙이 없으면 N 명령을 호출해야 합니다. N은 유추 규칙을 트리거하는 종속의 수입니다.
표준 유추 규칙과의 유일한 구문 차이는 일괄 처리 모드 유추 규칙이 이중 콜론(::
)으로 끝난다는 것입니다.
참고 항목
호출되는 도구는 여러 파일을 처리할 수 있어야 합니다. 일괄 처리 모드 유추 규칙은 종속 파일에 액세스하기 위해 매크로로 사용해야 $<
합니다.
일괄 처리 모드 유추 규칙은 빌드 프로세스를 가속화할 수 있습니다. 컴파일러 드라이버가 한 번만 호출되므로 일괄 처리 모드에서 컴파일러에 파일을 제공하는 것이 더 빠릅니다. 예를 들어 C 및 C++ 컴파일러는 파일 집합을 처리할 때 전체 프로세스 중에 메모리가 상주할 수 있으므로 더 빠르게 실행됩니다.
다음 예제에서는 일괄 처리 모드 유추 규칙을 사용하는 방법을 보여줍니다.
#
# sample makefile to illustrate batch-mode inference rules
#
O = .
S = .
Objs = $O/foo1.obj $O/foo2.obj $O/foo2.obj $O/foo3.obj $O/foo4.obj
CFLAGS = -nologo
all : $(Objs)
!ifdef NOBatch
{$S}.cpp{$O}.obj:
!else
{$S}.cpp{$O}.obj::
!endif
$(CC) $(CFLAGS) -Fd$O\ -c $<
$(Objs) :
#end of makefile
NMAKE는 일괄 처리 모드 유추 규칙 없이 다음 출력을 생성합니다.
E:\tmp> nmake -f test.mak -a NOBatch=1
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp
foo1.cpp
cl -nologo -Fd.\ -c .\foo2.cpp
foo2.cpp
cl -nologo -Fd.\ -c .\foo3.cpp
foo3.cpp
cl -nologo -Fd.\ -c .\foo4.cpp
foo4.cpp
NMAKE는 일괄 처리 모드 유추 규칙을 사용하여 다음 결과를 생성합니다.
E:\tmp> nmake -f test.mak -a
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp .\foo2.cpp .\foo3.cpp .\foo4.cpp
foo1.cpp
foo2.cpp
foo3.cpp
foo4.cpp
Generating Code...
미리 정의된 규칙
미리 정의된 유추 규칙은 NMAKE 제공 명령 및 옵션 매크로를 사용합니다.
규칙 | 명령 | 기본 작업 | 일괄 처리 규칙 | 플랫폼 |
---|---|---|---|---|
.asm.exe |
$(AS) $(AFLAGS) $< |
ml $< |
아니요 | x86 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml /c $< |
예 | x86 |
.asm.exe |
$(AS) $(AFLAGS) $< |
ml64 $< |
아니요 | X64 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml64 /c $< |
예 | x64 |
.c.exe |
$(CC) $(CFLAGS) $< |
cl $< |
아니요 | all |
.c.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
예 | all |
.cc.exe |
$(CC) $(CFLAGS) $< |
cl $< |
아니요 | all |
.cc.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
예 | all |
.cpp.exe |
$(CPP) $(CPPFLAGS) $< |
cl $< |
아니요 | all |
.cpp.obj |
$(CPP) $(CPPFLAGS) /c $< |
cl /c $< |
예 | all |
.cxx.exe |
$(CXX) $(CXXFLAGS) $< |
cl $< |
아니요 | all |
.cxx.obj |
$(CXX) $(CXXFLAGS) /c $< |
cl /c $< |
예 | all |
.rc.res |
$(RC) $(RFLAGS) /r $< |
rc /r $< |
아니요 | all |
유추된 종속 파일과 규칙
NMAKE는 해당 유추 규칙이 있는 경우 대상에 대해 유추된 종속을 가정합니다. 다음과 같은 경우 규칙이 적용됩니다.
to_ext 대상의 확장과 일치합니다.
from_ext 대상의 기본 이름이 있고 현재 또는 지정된 디렉터리에 있는 파일의 확장명과 일치합니다.
from_ext 있습니다. 일치 규칙의
.SUFFIXES
다른 from_ext 우선 순위가 더 높.SUFFIXES
지 않습니다.명시적 종속성 우선 순위가 더 높
.SUFFIXES
지 않습니다.
유추된 종속성으로 인해 예기치 않은 부작용이 발생할 수 있습니다. 대상의 설명 블록에 명령이 포함된 경우 NMAKE는 규칙의 명령 대신 해당 명령을 실행합니다.
유추 규칙의 우선 순위
유추 규칙이 두 번 이상 정의된 경우 NMAKE는 가장 높은 우선 순위 정의를 사용합니다. 다음 목록에서는 우선 순위 순서를 가장 높음에서 가장 낮은 순서로 보여 있습니다.
메이크파일에서 정의된 유추 규칙입니다. 이후 정의의 우선 순위가 있습니다.
에 정의된
Tools.ini
유추 규칙; 이후 정의에 우선 순위가 있습니다.미리 정의된 유추 규칙입니다.