GNU Linux Makefile PHONY目标依赖不能正常工作

我想要获得一些依赖的安装目标在我的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指令可以解决这个问题 - 任何人都可以帮忙吗?


正如你在注释中解释的那样,你的partX-function宏展开为空字符串。 他们在被调用时什么以及它们如何扩展是两件不同的事情。 因此,你的食谱都是空的,并告诉你它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:...

(假设使变量SRCDIRDIR1FILES1定义源目录,目标目录install-part1和文件的列表中,为复制install-part1分别)。

为了充分理解这个例子的makefile,你需要了解静态模式规则和仅限订单的先决条件。

如果你有很多安装文件和性能问题,最好对拷贝进行分组( 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 ...

链接地址: http://www.djcxy.com/p/64129.html

上一篇: GNU Linux Makefile PHONY target dependencies not working correctly

下一篇: How to generate phony target by premake?