makefile - 制作找不到规则来制作目标
问题描述
我正在尝试获取一些源文件,创建这些源的一些自定义版本,然后将这些自定义源处理为我可以使用的输出文件。我正在使用这个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.
解决方案
make
对文件名进行操作;如果没有命名的文件m.page.m
和命名的文件m.page.d
——这m.page.css
取决于你声明的依赖项——那么 Make 将得出结论,它需要创建这些文件。如果它没有任何规则(内置或通过配方)来创建这些规则,那么您收到的错误消息几乎可以准确地告诉您。
我猜你真正想要的是
m.%: %
echo "%define MOBILE" | cat - $< >$@
d.%: %
echo "%define DESKTOP" | cat - $< >$@
这告诉make
了如何创建m.whatever
和d.whatever
来自whatever
; 所以它现在知道如何创建m.x.phtml
fromx.phtml
和d.y.scss
fromy.scss
等。
(另请注意,这如何避免mv
静态临时文件名的分离,如评论中所述。)
%.css: %.scss
mym1.pl <$< >$@
%.php: %.phtml
mym1.pl <$< >$@
这告诉make
了如何创建m.z.css
from m.z.scss
,d.w.php
fromd.w.phtml
等。我猜这里mym1.pl
可以处理这两种情况。
(还要注意重构以避免无用的使用cat
。)
这消除了有些神秘.m
和.d
后缀,因此您可能必须重构Makefile
.
推荐阅读
- r - R减去行
- mysql - mysql5.7 + macos catalina,mysql默认临时密码不起作用
- gradle - IntelliJ 不会从 gradle 复合构建中导入模块
- c# - 检测到 CallbackOnCollectedDelegate(在 WinEventProc 调用 Process.GetProcessByID 之后)
- python - 多个 if/else 条件来检查字符串列表中的最后一个字符
- html - ViewEncapsulation.None 不适用于 innertHTML
- java - MigLayout,为什么这个单元格使用了额外的空间?
- flutter - 我可以检索流的倒数第二个值吗?
- angular - 无论如何使用带有 express-ws 的 websockets 和带有 Angular Universal 9 应用程序的 WebSocket 客户端 api?
- can-bus - CAN 总线中的帧确认