在一个makefile文件中,目录名称是一个虚假的目标还是“真正的”目标?

根据我读到的有关makefile的信息,虚假目标是任何不符合实际文件名的目标。 我的直觉说,作为一个目标的目录将被视为一个文件。

为什么这很重要? 我有一个目录作为我的生成文件中的目标。 当我把它作为我的主要可执行文件的先决条件时,总是得到可执行文件,不pipe是否所有文件都是最新的。 如果我把它作为先决条件,我的makefile是足够聪明的,知道什么时候需要build立,但我有问题,不知道是否需要创build目录。 根据我所读到的关于make的东西,任何假目标都不是先决条件,因为make并不知道它是否是最新的,所以他们总是会重build相关的目标。 这是我的makefile的摘录。

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS) @echo "--------------------------------------------"; @echo "$(THIS_DIR) $(MACHINE)"; @echo "Linking Shared Library"; @echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}"; ar -rc $(EXEC_WITH_PATH) $(OBJS); @echo "--------------------------------------------"; # Make dirs for object code and links ${OBJ_DIR} : @if [ ! -d ${OBJ_DIR} ]; then \ mkdir ${OBJ_DIR}; \ fi; 

那么在这种情况下, ${OBJ_DIR}是一个目录名称,还是一个假目标?

Solutions Collecting From Web of "在一个makefile文件中,目录名称是一个虚假的目标还是“真正的”目标?"

编辑:这只适用于GNU make – 一个公平的假设给“linux”标签。

你的目标是真正的目标,而不是PHONY。 问题是当你把目标放到目录里时,输出目录会被更新,所以它总是比你的目标更新。 这意味着你的目标总是会被建立,因为它的依赖性已经过时了。

你需要的是订单唯一的先决条件 。 这些先决条件允许您指定如果它不存在,则需要构建它,但不要注意时间戳。 也就是说,一个目标不会过时,只有订单的先决条件。

你可以这样指定它:

 $(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR} ... 

竖条之后的任何内容都是订单唯一的先决条件。

你现在可以简化你的OBJ_DIR目标:

 ${OBJ_DIR} : mkdir -p ${OBJ_DIR} 

注:我已经使用了${OBJ_DIR}语法而不是$(OBJ_DIR)因为这是您使用的。 仅限订单的先决条件不依赖于该语法。

这是一个真正的目标。

假目标不会由make系统自动检测 – 它们必须由您使用.PHONY目标识别。

明智的虚假目标包括allclean – 这些不是对应于真实的文件,而是你想要makefile的行为。 以下是如何解释这个:

 .PHONY: all clean install test 

目录是makefile规则的合法目标。 你不应该做这些假的。

 mydir: mkdir mydir 

.PHONY的目标当然是假的。

GNU文档可以在这里找到。