首页 > 解决方案 > 制作找不到规则来制作目标

问题描述

我正在尝试获取一些源文件,创建这些源的一些自定义版本,然后将这些自定义源处理为我可以使用的输出文件。我正在使用这个make文件。请注意,这个文件并不完全完整,目前它只做 CSS* 制作,一旦它工作,我将添加类似的 PHP* 制作:

# root sources
CSSSOURCES =    $(wildcard *.scss)
PHPSOURCES =    $(wildcard *.phtml)

# partials, creates a configed source
CSSMSOURCES =   $(addprefix m.,$(CSSSOURCES:.scss=.m)) 
CSSDSOURCES =   $(addprefix d.,$(CSSSOURCES:.scss=.d)) 
PHPMSOURCES =   $(addprefix m.,$(PHPSOURCES:.phtml=.m)) 
PHPDSOURCES =   $(addprefix d.,$(PHPSOURCES:.phtml=.d))

# targets
CSSMTARGETS =   $(CSSMSOURCES:.m=.css)
CSSDTARGETS =   $(CSSDSOURCES:.d=.css)
PHPMTARGETS =   $(PHPMSOURCES:.m=.php)
PHPDTARGETS =   $(PHPDSOURCES:.d=.php)

# ensure no clash with built in rules
.SUFFIXES: .m .d .scss .css .phtml .php

all:    $(CSSMTARGETS)

%.m:    %.scss
    echo "%define MOBILE" | cat - $< >tmp
    mv tmp $@

%.d:    %.scss
    echo "%define DESKTOP" | cat - $< >tmp
    mv tmp $@

%.css:  %.m %d
    cat $< | mym1.pl >$@
    rm $<

.PHONY: test
test:
    @echo "sources - $(CSSSOURCES)"
    @echo "msources - $(CSSMSOURCES)"
    @echo "targets - $(CSSMTARGETS)"

我没有创建 CSS 目标,而是收到此错误:

make: *** No rule to make target 'm.page.css', needed by 'all'. Stop.

标签: makefile

解决方案


make对文件名进行操作;如果没有命名的文件m.page.m和命名的文件m.page.d——这m.page.css取决于你声明的依赖项——那么 Make 将得出结论,它需要创建这些文件。如果它没有任何规则(内置或通过配方)来创建这些规则,那么您收到的错误消息几乎可以准确地告诉您。

我猜你真正想要的是

m.%: %
    echo "%define MOBILE" | cat - $< >$@

d.%: %
    echo "%define DESKTOP" | cat - $< >$@

这告诉make了如何创建m.whateverd.whatever来自whatever; 所以它现在知道如何创建m.x.phtmlfromx.phtmld.y.scssfromy.scss等。

(另请注意,这如何避免mv静态临时文件名的分离,如评论中所述。)

%.css: %.scss
    mym1.pl <$< >$@
%.php: %.phtml
    mym1.pl <$< >$@

这告诉make了如何创建m.z.cssfrom m.z.scssd.w.phpfromd.w.phtml等。我猜这里mym1.pl可以处理这两种情况。

(还要注意重构以避免无用的使用cat。)

这消除了有些神秘.m.d 后缀,因此您可能必须重构Makefile.


推荐阅读