Makefile gnu使在目标中重新创建目录结构

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目

我想用GNUmake做图像压缩和一些网站准备工作

我有一个这样的结构

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生成静态模式规则的问题。