2017-10-09 59 views
0

我试图得到一些相关的安装目标,在我的Makefile文件的工作方式如下:GNU Linux的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制作手册中描述: https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

我做

make install-part1 

第一,然后手动(即室射频)移除得到创建的$(DESTDIR)目录。现在

,每次我尝试运行上面列出的任何目标,我得到e.g:

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

我得到同样的答案,如果我试图强行让与“-B”标志。如果我添加调试信息(请--debug)我得到

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

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

+1

这可能是因为你的'$(调用partX功能)'扩大到什么。如果是这样,所有食谱都是空的,你得到的消息是正确的:没有什么可做的。请显示您的'partX-function'宏的例子。 –

+0

它只是创建一些目录,然后复制东西: define install-part1: $(mkdir -p $(1)) $(cp -r files $(1)) endef – user12066

回答

3

您的partX-function宏,如您在注释中解释的那样,展开为空字符串。他们做什么被调用时,他们如何扩大是两个不同的东西。因此,您的食谱都是空的,并通过它的nothing to be done消息告诉你。分析你的宏并发现他们做了一些事情并不够智能。您使用GNU make及其功能非常规。为您展示的例子中,这将是更好的使用普通的化妆(除非你有很多文件的安装和性能问题):

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

install-everything: install-part1 install-part2 

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

$(DIR1): 
    mkdir -p [email protected] 

$(addprefix $(DIR1)/,$(FILES1)): $(DIR1)/%: $(SRCDIR)/% | $(DIR1) 
    cp -f $< [email protected] 

install-part2:... 

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

为了充分了解这个示例makefile,您需要了解static pattern rulesorder-only prerequisites

如果你有大量的文件,安装和性能重要,最好是组副本(cp),从而降低外壳调用次数:

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 ......