Makefile gnu使在目标中重新创建目录结构
我想用GNUmake做图像压缩和一些网站准备工作 我有一个这样的结构Makefile gnu使在目标中重新创建目录结构,makefile,Makefile,我想用GNUmake做图像压缩和一些网站准备工作 我有一个这样的结构 src www.site1.org images foo.jpg bar.png css style.scss www.site2.org images baz.svg css design.scss 我希望能够在target目
src
www.site1.org
images
foo.jpg
bar.png
css
style.scss
www.site2.org
images
baz.svg
css
design.scss
我希望能够在target
目录中重新创建此结构,同时使用一些其他工具优化/编译源代码,例如convert--strip src/www.site1.org/images/foo.jpg target/www.site1.org/images/foo.jpg
我可以使用类似于SRC:=$(shell find.-name'*.jpg')
的方法来查找我的所有JPEG,甚至可以创建一个包含所有目标的变量,其中targets=$(SRC:SRC=target)
但现在我还没有找到一种方法来编写一条规则,它(天真地)看起来像:
$(TARGET): $(SRC)
convert --strip $< $@
$(目标):$(SRC)
convert--strip$<$@
我已经在互联网上搜索了一段时间,但没有找到合适的答案。您可以使用:
SRC := $(shell find src -name '*.jpg')
TARGETS = $(patsubst src/%,target/%,$(SRC))
all: $(TARGETS)
$(TARGETS): target/%: src/%
convert --strip $< $@
SRC:=$(shell查找SRC-name'*.jpg')
TARGETS=$(patsubst src/%,target/%,$(src))
全部:$(目标)
$(目标):目标/%:src/%
convert--strip$<$@
基本上说:对于目标中的每个单词,匹配它与<代码>目标/%<代码>模式(并记录<代码> %>代码>子表达式),考虑它的唯一依赖性是“代码> SRC/%”并应用该配方。这是一个GNU make特性,记录在手册的第4.12节静态模式规则中
顺便说一句,
$(SRC:SRC=target)
并不像您所想的那样,因为模式只在$(SRC)的每个单词末尾匹配。因此,foo_src
将替换为foo_target
,但src/foo
将保持不变patsubst
是一个更强大的替换功能。感谢您的回答。我会尽快试一试。你知道在哪里可以找到关于双冒号语法的信息吗?我想我在别的地方见过,但在这个问题上找不到什么。(这叫什么?)您可能还需要创建目标目录。使用类似于mkdir-p$$(dirname$)的方法添加了一个参考来回答关于GNU生成静态模式规则的问题。