我在src
目录中有一个网站,有几个级别,包含html,markdown,less,coffee,png,jpg和其他资产。我想使用make 构建我的网站到dist
目录。有了构建,我的意思是
我有以下文件。 cp
语句将替换为相应的工具以进行转换。
sources = $(shell find src -type f)
t1 := $(sources:.md=.html)
t2 := $(t1:.less=.css)
targets := $(t2:.coffee=.js)
targetdirs = $(dir $(targets))
all: $(targets)
%.html: %.md
cp $< $@
%.css: %.less
cp $< $@
%.js: %.coffee
cp $< $@
这会并排创建输出。因此src/index.md
变为src/index.html
,src/assets/stylesheets/app.less
变为src/assets/stylesheets/app.css
,src/assets/scripts/app.coffee
变为src/assets/scripts/app.js
。我想要做的是更改make文件,使其将输出存储在dist
目录中,以便src/index.md
转换为dist/index.html
,src/assets/stylesheets/app.less
编译为{ {1}}和dist/assets/stylesheets/app.css
成为src/assets/scripts/app.coffee
。
所以我按如下方式更改了makefile:
dist/assets/scripts/app.js
现在使用以下内容失败:
sources = $(shell find src -type f)
t0 := $(subst src/,dist/,$(sources:.md=.html))
t1 := $(t0:.md=.html)
t2 := $(t1:.less=.css)
targets := $(t2:.coffee=.js)
targetdirs = $(dir $(targets))
all: $(targets)
%.html: %.md
mkdir -p $(targetdirs)
cp $< $@
%.css: %.less
mkdir -p $(targetdirs)
cp $< $@
%.js: %.coffee
mkdir -p $(targetdirs)
cp $< $@
我能找到的大多数示例仅限于一个目录,或者将多个源文件编译为单个目标。
如果在不知道源目录的内容的情况下如何实现这一目标?
环境:
答案 0 :(得分:2)
在make pattern规则中,目标和先决条件中的模式所代表的词干必须与完全匹配。采取这个规则:
%.html: %.md
mkdir -p $(targetdirs)
cp $< $@
如果目标make想要构建dist/index.html
,那么词干是dist/index
。因此,它将寻找先决条件dist/index.md
。哪个不存在。因此,忽略该模式规则不匹配,并继续寻找可能匹配的更多隐式规则......并且找不到任何失败的规则。
您必须修改规则,以便目录中的更改反映在模式中:
dist/%.html: src/%.md
mkdir -p $(@D)
cp $< $@
(我不确定你为什么要在每个食谱中创建所有目录而不是当前的目录)。现在dist/index.html
的词干仅为index
,而先决条件与src/index.md
匹配,它将起作用。