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

Makefile 如何使用make将静态网站构建到dist目录中,makefile,gnu-make,Makefile,Gnu Make,我在src目录下有一个网站,有好几个层次,包含html、markdown、less、coffee、png、jpg和其他资产。我想使用make将我的网站构建到dist目录中。我的意思是,有了身材 将标记文件转换为html 将咖啡编译为js 编译更少的css 缩小html文件 缩小js文件(不是从coffee编译的文件) 缩小css文件(不是从less或sass编译的文件) 准备图像(logo.png)logo@1x.png logo@2x.png logo@3x.png) 我有以下文件。cp语

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

  • 将标记文件转换为html
  • 将咖啡编译为js
  • 编译更少的css
  • 缩小html文件
  • 缩小js文件(不是从coffee编译的文件)
  • 缩小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 $< $@
现在,make会出现以下故障:

make: *** No rule to make target `dist/assets/scripts/app.js', needed by `all'.  Stop.
我能找到的大多数示例都局限于单个目录,或者将多个源文件编译成单个目标

如果不知道源目录的内容,如何实现这一点

环境:

  • GNU Make 3.81
  • OS X 10.11.1

在make pattern rules中,目标和先决条件中的模式表示的茎必须完全匹配。以这条规则为例:

%.html: %.md
        mkdir -p $(targetdirs)
        cp $< $@

(我不知道为什么要在每个菜谱中创建所有目录,而不仅仅是当前的目录)。现在
dist/index.html
的词干就是
index
,前提条件匹配
src/index.md
,它会工作。

创建所有这些目录的原因是:懒惰。。。我的目标是先让它工作,然后再改进。我验证了它的工作原理。你的回答也给了我必要的背景,让我理解为什么它一开始就不起作用。
%.html: %.md
        mkdir -p $(targetdirs)
        cp $< $@
dist/%.html: src/%.md
        mkdir -p $(@D)
        cp $< $@