Makefile에서 와일드 카드와 함께 Nmake를 사용합니다
문제
Balsamiq Mockup 파일을 PNG 파일로 자동으로 내보내기 위해 NMake MakeFile을 설정하려고하지만 모든 파일을 명시 적으로 나열하지 않고 일반적인 규칙을 만드는 방법에 대한 헤드 나 꼬리를 만들 수는 없습니다. 나는 수출을 원한다.
이 페이지 파일을 내보내기위한 명령 줄 구문을 자세히 설명하고 이 페이지 .obj 파일에 대한 일반 규칙이 포함 된 예제가 포함되어 있습니다.
지금까지 시도한 Makefile은 다음과 같이 보입니다.
.bmml.png:
"C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< $@
그러나 이것은 작동하지 않습니다.
단순히 nmake를 실행하는 경우 (일부 구식 PNG 파일 포함) Nmake는 다음을 수행합니다.
[C:\Temp] :nmake
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
[C:\Temp] :
하나의 특정 파일을 작성하도록 요청하면 다음과 같습니다.
[C:\Temp] :nmake "TestFile.png"
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
NMAKE : fatal error U1073: don't know how to make '"TestFile.png"'
Stop.
[C:\Temp] :
나를 똑바로 세울 수있는 nmake 전문가가 있습니까?
예제 MakeFile을 간단히 복사하여 .txt 파일에서 .dat 파일을 작성하고 실험하기 위해 다음과 같습니다.
.txt.dat:
copy $< $@
이것은 아무것도하지 않기 때문에 분명히 그러한 일반적인 규칙이 어떻게 작동하는지 이해하지 못합니다. 내가 원하는 파일을 어떻게 든 나열하는 위의 목표를 지정해야합니까?
편집하다: 새로운 답변에 대한 응답 :
이 makefile :
{}.txt{}.dat:
copy $** $@
이 파일로 (test.dat)
1
2
3
그리고이 명령 :
NMAKE test.txt
이 오류 메시지를 생성합니다.
[C:\] :nmake test.txt
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
NMAKE : fatal error U1073: don't know how to make 'test.txt'
Stop.
해결책
Nmake 패턴 규칙은 GNU가 구식 접미사 규칙을 만드는 것과 매우 유사합니다. 귀하의 경우, 당신은 거의 시작하는 것이 옳았지만 .suffixes 선언이 누락되었습니다. 예를 들어:
.SUFFIXES: .bmml .png
.bmml.png:
@echo Building $@ from $<
나는 이것이 당신의 솔루션의 일부일 뿐이라고 생각합니다. 왜냐하면 당신은 또한 변환 할 모든 파일을 명시 적으로 나열하지 않기를 원했기 때문입니다. 불행히도, NMake에서이를 수행 할 수있는 매우 깨끗한 방법은 모르겠습니다. 종속성 목록에서 와일드 카드 만 확장하고 종속성 목록에서 실제로 원하는 것은 이미 존재하는 파일 목록이 아닙니다 ( *.bmml 파일), 그러나 해당 파일 ( *.png 파일)에서 생성 될 파일 목록. 그럼에도 불구하고, 나는 당신이 다음과 같은 재귀적인 nmake 호출로 당신의 목표를 달성 할 수 있다고 생각합니다.
all: *.bmml
$(MAKE) $(**:.bmml=.png)
여기서는 Nmake가 확장됩니다 *.bmml
PREREQ 목록에서 all
디렉토리의 .BMML 파일 목록으로, 새로운 NMAKE 인스턴스를 시작하여 모든 인스턴스가있는 파일 목록으로 빌드 할 목표를 지정합니다. .bmml
~로 교체되다 .png
. 그래서 모든 것을 합치십시오.
.SUFFIXES: .bmml .png
all: *.bmml
@echo Converting $(**) to .png...
@$(MAKE) $(**:.bmml=.png)
.bmml.png:
@echo Building $@ from $<
파일 test1.bmml 및 test2.bmml 파일을 만들고이 makefile을 실행하면 다음과 같은 출력을 얻습니다.
Converting Test1.bmml Test2.bmml to .png...
Building Test1.png from Test1.bmml
Building Test2.png from Test2.bmml
물론,이 .BMML 파일 중 많은 사람들이 있다면 명령 줄 길이 제한 사항을 우연히 실행할 수 있으므로이를 조심하십시오. 이 경우 소스 파일을 명시 적으로 나열하거나 GNU Make (다양한 형태의 Windows에 사용할 수 있음)와 같은 유능한 메이크 도구를 사용하는 것이 좋습니다.
다른 팁
이것이 당신을 위해 일할 것인가? 이것을 makefile에 넣으십시오. :
export : *.bmml
"C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $** $(**B).png
그런 다음 실행 :
nmake /A
나는 발사미가 없어서 이것을 테스트 할 수 없지만 다음 makefile이 있다면 내 경우에는 다음과 같습니다. :
export : *.txt
copy $** $(**B).dat
그리고 달리기 nmake /A
myfile.txt가있는 폴더에서 myfile.dat을 만듭니다.