如何使用make将静态网站构建到dist目录中

时间:2015-12-06 08:01:23

标签: makefile gnu-make

我在src目录中有一个网站,有几个级别,包含html,markdown,less,coffee,png,jpg和其他资产。我想使用make 构建我的网站到dist目录。有了构建,我的意思是

  • 将markdown文件转换为html
  • 将咖啡编译为js
  • 编译少到css
  • 缩小html文件
  • 缩小js文件(不是从咖啡编译的文件)
  • 缩小css文件(不是从less或sass编译的)
  • 准备图片(logo.png变为logo@1x.png logo@2x.png logo@3x.png)

我有以下文件。 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.htmlsrc/assets/stylesheets/app.less变为src/assets/stylesheets/app.csssrc/assets/scripts/app.coffee变为src/assets/scripts/app.js。我想要做的是更改make文件,使其将输出存储在dist目录中,以便src/index.md转换为dist/index.htmlsrc/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 $< $@

我能找到的大多数示例仅限于一个目录,或者将多个源文件编译为单个目标。

如果在不知道源目录的内容的情况下如何实现这一目标?

环境:

  • GNU Make 3.81
  • OS X 10.11.1

1 个答案:

答案 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匹配,它将起作用。