【问题标题】:GNU Linux Makefile PHONY target dependencies not working correctlyGNU Linux Makefile PHONY 目标依赖项无法正常工作
【发布时间】:2017-10-09 11:30:54
【问题描述】:

我正在尝试让一些依赖安装目标在我的 Makefile 中工作,如下所示:

.PHONY: install-everything install-part1 install-part2

install-everything: install-part1 install-part2

install-part1:
    $(call part1-function)

install-part2:
    $(call part2-function)

这与此处的 GNU Make 手册中的描述非常相似:https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

我做到了

make install-part1

首先,然后手动(即 rm -rf)删除创建的 $(DESTDIR) 目录。

现在,每次我尝试运行上面列出的任何目标时,我都会得到例如:

make: nothing to be done for 'install-everything'.

如果我尝试强制使用“-B”标志,我会得到相同的答案。如果我添加调试信息(make --debug),我会得到

File 'install-everything' does not exist.
Must remake target 'install-everything'.

我认为使用 .PHONY 指令可以解决这个问题 - 谁能帮忙?

【问题讨论】:

  • 可能是您的$(call partX-function) 扩展为空。如果是这种情况,则所有食谱都是空的,并且您得到的信息是正确的:没有什么可做的。请展示您的 partX-function 宏示例。
  • 它只是创建一些目录,然后将内容复制到:define install-part1: $(mkdir -p $(1)) $(cp -r files $(1)) endef

标签: linux makefile


【解决方案1】:

您的 partX-function 宏,正如您在评论中解释的那样,扩展为空字符串。他们在被调用时做什么和他们如何展开是两件不同的事情。因此,您的食谱都是空的,make 会通过其nothing to be done 消息告诉您这一点。分析你的宏并发现它们做了什么是不够聪明的。您对 GNU make 及其call 函数的使用是非常规的。对于您展示的示例,使用普通 make 会更好(除非您有很多文件要安装并且性能很重要):

.PHONY: install-everything install-part1 install-part2

install-everything: install-part1 install-part2

install-part1: $(addprefix $(DIR1)/,$(FILES1))

$(DIR1):
    mkdir -p $@

$(addprefix $(DIR1)/,$(FILES1)): $(DIR1)/%: $(SRCDIR)/% | $(DIR1)
    cp -f $< $@

install-part2:...

(假设make变量SRCDIRDIR1FILES1分别定义install-part1的源目录、目标目录和install-part1要复制的文件列表。

为了完全理解这个示例 makefile,您需要理解 static pattern rulesorder-only prerequisites

如果您要安装大量文件并且性能很重要,最好将副本分组 (cp),从而减少 shell 调用次数:

install-part1: $(addprefix $(SRCDIR)/,$(FILES1)) | $(DIR1)
    for f in $(FILES1); do \
         cp -f $(SRCDIR)/$$f $(DIR1);\
    done

甚至:

install-part1: $(addprefix $(SRCDIR)/,$(FILES1)) | $(DIR1)
    cp -f $^ $(DIR1)

它不太优雅,因为所有依赖项都没有正确声明。并且每次调用 make install-part1 时都会复制所有文件,即使它们已经安装并且是最新的,但它应该比其他解决方案快得多。

最后但同样重要的是:在 GNU/Linux 下安装经常使用 install 实用程序而不是 cp...

【讨论】:

    最近更新 更多