2008-10-03 30 views
9

Tôi đang cố gắng thiết lập một tệp make-up nmake để xuất tệp balsamiq mockup của chúng tôi thành tệp png một cách tự động, nhưng tôi e rằng mình không thể tạo đầu hay đuôi của quy tắc chung để làm như vậy, không liệt kê rõ ràng tất cả các tệp tôi muốn xuất.Sử dụng nmake với các ký tự đại diện trong makefile

This page chi tiết cú pháp dòng lệnh để xuất tệp và this page chứa ví dụ giống như quy tắc chung cho tệp .obj thành tệp .exe.

Các makefile Tôi đã cố gắng cho đến nay trông như thế này:

.bmml.png: 
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< [email protected] 

Nhưng điều này không làm việc.

Nếu tôi chỉ cần chạy nmake (với một số file png lỗi thời), nmake chỉ thực hiện điều này:

[C:\Temp] :nmake 

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


[C:\Temp] : 

Nếu tôi hỏi nó để xây dựng một tập tin cụ thể, nó thực hiện điều này:

[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] : 

Bất kỳ một bậc thầy nào ra khỏi đó có thể đặt tôi thẳng không?

Một ví dụ makefile mà chỉ đơn giản làm cho các file .dat từ file .txt bằng cách sao chép chúng, để thử nghiệm với, trông như thế này:

.txt.dat: 
    copy $< [email protected] 

này không có gì là tốt, như vậy rõ ràng tôi không hiểu như thế nào quy tắc chung chung như vậy hoạt động. Tôi có cần phải xác định mục tiêu ở trên bằng cách nào đó liệt kê các tệp tôi muốn không?


Sửa: Đáp lại câu trả lời mới:

makefile này:

{}.txt{}.dat: 
    copy $** [email protected] 

với tập tin này (test.dat)

1 
2 
3 

và lệnh này:

NMAKE test.txt 

Tạo thông báo lỗi này:

[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. 

Trả lời

16

Quy tắc mẫu NMAKE rất giống với GNU làm cho các quy tắc hậu tố trường học cũ.Trong trường hợp của bạn, bạn đã có nó gần như ngay từ đầu để bắt đầu, nhưng bạn đã bỏ lỡ tờ khai .SUFFIXES. Ví dụ:

.SUFFIXES: .bmml .png 
.bmml.png: 
    @echo Building [email protected] from $< 

Tôi nghĩ rằng đây chỉ là một phần giải pháp của bạn, bởi vì bạn cũng đã đề cập muốn tránh liệt kê rõ ràng tất cả các tệp cần chuyển đổi. Thật không may, tôi không biết một cách rất rõ ràng để làm điều đó trong NMAKE, vì nó chỉ mở rộng các ký tự đại diện trong danh sách phụ thuộc, và những gì bạn thực sự muốn trong danh sách phụ thuộc của bạn không phải là danh sách các tệp đã tồn tại (* .bmml tệp), nhưng danh sách các tệp sẽ được tạo từ các tệp đó (tệp * .png). Tuy nhiên, tôi nghĩ rằng bạn có thể đạt được mục tiêu của bạn với một invocation nmake đệ quy như thế này:

all: *.bmml 
    $(MAKE) $(**:.bmml=.png) 

Ở đây, nmake sẽ mở rộng *.bmml trong danh sách prereq cho all vào danh sách các file .bmml trong thư mục, và sau đó nó sẽ bắt đầu một phiên bản NMAKE mới, xác định các mục tiêu để xây dựng như danh sách các tệp với tất cả các phiên bản .bmml được thay thế bằng .png. Vì vậy, đặt nó tất cả cùng nhau:

.SUFFIXES: .bmml .png 
all: *.bmml 
    @echo Converting $(**) to .png... 
    @$(MAKE) $(**:.bmml=.png) 

.bmml.png: 
    @echo Building [email protected] from $< 

Nếu tôi tạo file Test1.bmml và Test2.bmml và sau đó chạy makefile này, tôi nhận được kết quả như sau:

Converting Test1.bmml Test2.bmml to .png... 
Building Test1.png from Test1.bmml 
Building Test2.png from Test2.bmml 

Tất nhiên, nếu bạn có rất nhiều các tệp .bmml này, bạn có thể chạy afoul các giới hạn độ dài dòng lệnh, vì vậy hãy chú ý đến điều đó. Trong trường hợp đó, tôi khuyên bạn nên liệt kê rõ ràng các tệp nguồn hoặc sử dụng công cụ tạo khả năng hơn, như GNU make (có sẵn cho Windows dưới nhiều dạng).

+0

Điều này rất tốt. Điều duy nhất là tôi đang tìm thấy nó xây dựng lại mọi lúc ngay cả khi mục tiêu được cập nhật. Làm thế nào một trong những sẽ làm cho nó bỏ qua nếu mục tiêu là mới hơn so với nguồn? – CashCow

+0

@CashCow Tôi không thấy vấn đề đó. Trong ví dụ của Eric, mục tiêu không bao giờ tồn tại! Nó chỉ lặp lại một số văn bản, nó không bao giờ thực sự tạo ra một mục tiêu. Nếu bạn thêm một quy tắc 'copy $ <$ @', thì nó cũng sẽ tạo ra các mục tiêu. Trong trường hợp đó, nó không cần thiết phải xây dựng lại các mục tiêu ngày tháng. –

+0

Tôi mất một lúc để tìm ra điều này. Nếu makefile của bạn không được đặt tên là 'makefile', thì bạn cần sử dụng' -f' trong lời gọi đệ quy. –

0

tác phẩm này với bạn Will? Đặt điều này trong makefile .:

export : *.bmml 
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $** $(**B).png 

Sau đó chạy:

nmake /A 

Tôi không có Balsamiq vì vậy tôi không thể kiểm tra điều này, nhưng trong trường hợp của tôi nếu tôi có makefile sau .:

export : *.txt 
    copy $** $(**B).dat 

và chạy nmake /A trong thư mục với myFile.txt, nó sẽ tạo myFile.dat.

Các vấn đề liên quan