2012-07-30 11 views
5

Tôi có các tệp .haml và muốn tự động chuyển đổi chúng thành các tệp .html và cập nhật tệp sau khi .haml được thay đổi.Unix tìm bằng GNU Hãy tự động cập nhật các tệp

Nguyên tắc makefile chung là không có vấn đề:

%.html: %.haml 
    hamlpy $< [email protected] 

Nhưng bây giờ tôi cần một quy tắc hay một lệnh để làm như sau:

  • tất cả X.haml file trong templates/
  • thực hiện make X.html lệnh, trong đó X có cùng tên tệp (haml được thay thế bằng html).

Tôi không thể tìm thấy cách thực hiện việc này bằng GNU hoặc Unix.

Trả lời

8

Nếu tất cả các tập tin của bạn *.haml là cái tên nổi (tức là không có khoảng trắng hoặc ký tự hài hước khác), bạn có thể làm điều đó với một cuộc gọi đến find(1):

HAML_FILES = $(shell find templates/ -type f -name '*.haml') 
HTML_FILES = $(HAML_FILES:.haml=.html) 

all: $(HTML_FILES) 

%.html : %.haml 
     hamlpy $< [email protected] 
7

Bạn có thể sử dụng GNU làm wildcard chức năng để tìm tập tin trong một thư mục nhất định:

INDIR := templates 
OUTDIR := ${CURDIR} 

haml_files := $(wildcard ${INDIR}/*.haml) 
html_files := $(subst ${INDIR}/,${OUTDIR}/,${haml_files:.haml=.html}) 

all : ${html_files} 

clean : 
    rm -f ${html_files} 

${OUTDIR}/%.html : ${INDIR}/%.haml 
    hamlpy $< [email protected] 

.PHONY : all clean 

INDIROUTDIR thể được tùy chỉnh trên dòng lệnh, ví dụ, để sử dụng thư mục hiện hành đối với đầu vào và iutputs:

$ make INDIR=. OUTDIR=. 
+0

Điều gì xảy ra nếu chúng có thể sâu hơn 'mẫu'? –

+0

Ở trên giả định rằng các tệp '.haml' là tất cả trong một thư mục bất kể mức độ sâu, ví dụ: 'mẫu/a/b/c/d/e /'. –

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