您現在所在的位置是: 首頁--> 自由發揮--> makefile for xslt (for Frank的五四三)

2006 Jul 26th

以下是Frank的五四三用來批次產生網頁用的makefile。 注意!直接複製貼上時,有可能tab會不見 (目前測試,Opera 8.54會有此情形,IE6和Firefox 1.5不會)。 又,這是for Windows, 用的是MinGW裡的GNU Make 3.80, 如果要用在Unix上的話, CC要把.exe拿掉,當然前提是有裝xsltproc, 還有,很多語法是GNU Make才有, 在FreeBSD上請打gmake(當然也是要gmake有安裝的情形下)

有什麼東西是比較有趣的嗎, 首先是偷懶招: $(wildcard src/*.xml), 其實這是不推薦的用法, 會把資料夾下所有的檔案都抓進來, 比較好的是把檔案一個個列出來, 不過看著左下角寫68 objects, 還是偷懶一下^^|||。 但是有些檔案沒有要輸出成html檔案, 這時候就要用filter-out這個function, 這個makefile裡用到的都是GNU make的 Built-in Functions。

$(HTML_FILE): menu.xml, 這個也是偷懶招, 讓HTML_FILE這個變數裡的檔案全都加上menu.xml成為prerequisite之一, 這樣menu.xml有更新的時候, 才會讓全部的檔案都更新。

注解寫template,其實應該叫做Implicit Rules , 有了這一行,當prerequisite出現.htm, make就會去找對應的.xml是否存在, 如果.xml比較新的話,就會執行command。

# makefile for xsltproc
# written by franklai, 2006 Jul 14th
# last modified 2006 Jul 26th
#
# use `make --just-print' can test makefile
CC := xsltproc.exe

# set search path
vpath %.xml src

XSL_FILE := style.xsl

# list the xml file in src directory that do not need to output
DONT_OUTPUT := menu _default
# append suffix `.htm' to each word in the word list
FILE_DONT_OUTPUT := $(addsuffix .htm,$(DONT_OUTPUT))

# make word list including all the xml file in the directory `src'
ALL_XML_FILE := $(wildcard src/*.xml)
# replace the suffix `.xml' to `.htm'
ALL_HTML_FILE := $(notdir $(subst .xml,.htm,$(ALL_XML_FILE)))
# take out those files we do not need
HTML_FILE := $(filter-out $(FILE_DONT_OUTPUT), $(ALL_HTML_FILE))

.PHONY: all
all: $(HTML_FILE)

# add this line to let makefile check if menu.xml is newer
$(HTML_FILE): menu.xml


# build template
#   $<: first prerequisite
#   $@: the target
#   $^: all the prerequisites
%.htm:%.xml
	$(CC) -output $@ $(XSL_FILE) $<

# xsltproc.exe parameter
# -verbose
# -output [filename]

clean:
	-if exist *.htm  del *.htm