Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile只识别已更改的先决条件,而不识别新的先决条件_Makefile_Gnu Make - Fatal编程技术网

Makefile只识别已更改的先决条件,而不识别新的先决条件

Makefile只识别已更改的先决条件,而不识别新的先决条件,makefile,gnu-make,Makefile,Gnu Make,尝试编写一个简单的makefile,用Pandoc将标记文件编译成HTML。我不想将所有的prerequisite.md文件显式添加到makefile中,因此我尝试使用模式规则和通配符prerequisite: all: www/*.html www/%.html: src/%.md pandoc -f markdown -t html $< > $@ 此操作已关闭,但仅处理已存在.html目标文件且已过期的必备.md文件。没有.html文件的新.md文件将被忽略,因此,

尝试编写一个简单的makefile,用Pandoc将标记文件编译成HTML。我不想将所有的prerequisite.md文件显式添加到makefile中,因此我尝试使用模式规则和通配符prerequisite:

all: www/*.html

www/%.html: src/%.md
    pandoc -f markdown -t html $< > $@
此操作已关闭,但仅处理已存在.html目标文件且已过期的必备.md文件。没有.html文件的新.md文件将被忽略,因此,如果所有非新文件都已生成,我将得到make:all无需执行任何操作

我遗漏了什么概念?我不知道如何告诉make在src/中的已更改和新.md文件上运行,并将模式规则应用于每个文件。

尝试以下方法:

$ cat Makefile
input := foo.md bar.md baz.md
output := $(input:%.md=www/%.html)

.PHONY: all

all: ${output}

www/%.html: src/%.md
        pandoc -f markdown -t html $< > $@

$ make -n
pandoc -f markdown -t html src/foo.md > www/foo.html
pandoc -f markdown -t html src/bar.md > www/bar.html
pandoc -f markdown -t html src/baz.md > www/baz.html
试试这个:

$ cat Makefile
input := foo.md bar.md baz.md
output := $(input:%.md=www/%.html)

.PHONY: all

all: ${output}

www/%.html: src/%.md
        pandoc -f markdown -t html $< > $@

$ make -n
pandoc -f markdown -t html src/foo.md > www/foo.html
pandoc -f markdown -t html src/bar.md > www/bar.html
pandoc -f markdown -t html src/baz.md > www/baz.html

您可以从src/目录中已有的.md文件中获取要生成的.html文件列表

首先,可以通过内置函数获取现有.md文件的列表:

md-files := $(wildcard src/*.md)
然后,将a应用于md files变量,以便删除src/前缀,并将.md文件列表中每个元素的后缀.md替换为.html:

最后,通过将内置函数应用于结果列表,可以将前缀www/添加到该列表的每个元素:

html-files := $(addprefix www/,$(md-files:src/%.md=%.html))
将所有内容放在一起,生成的makefile将是:

md-files := $(wildcard src/*.md)
html-files := $(addprefix www/,$(md-files:src/%.md=%.html))

.PHONY: all
all: $(html-files)

www/%.html: src/%.md
    pandoc -f markdown -t html $< > $@

您可以从src/目录中已有的.md文件中获取要生成的.html文件列表

首先,可以通过内置函数获取现有.md文件的列表:

md-files := $(wildcard src/*.md)
然后,将a应用于md files变量,以便删除src/前缀,并将.md文件列表中每个元素的后缀.md替换为.html:

最后,通过将内置函数应用于结果列表,可以将前缀www/添加到该列表的每个元素:

html-files := $(addprefix www/,$(md-files:src/%.md=%.html))
将所有内容放在一起,生成的makefile将是:

md-files := $(wildcard src/*.md)
html-files := $(addprefix www/,$(md-files:src/%.md=%.html))

.PHONY: all
all: $(html-files)

www/%.html: src/%.md
    pandoc -f markdown -t html $< > $@

我的直觉是*.html被视为当前与模式匹配的任何内容,而不是通配符。我并不是一个Makefile专家,但你们可能会想研究变量替换,这是我一直回避的问题。试着这样开始:我认为你在正确的轨道上。如果我清除所有生成的*.html文件并运行,它实际上会根据其中一个先决条件创建一个名为www/*.html的文件…绝对不会按照我预期的方式处理通配符。我的直觉是,*.html被视为当前与模式匹配的任何内容,而不是通配符。我并不是一个Makefile专家,但你们可能会想研究变量替换,这是我一直回避的问题。试着这样开始:我认为你在正确的轨道上。如果我清除所有生成的*.html文件并运行,它实际上会根据其中一个先决条件创建一个名为www/*.html的文件……绝对不会像我预期的那样处理通配符。