根据我所读到的关于makefile的内容,假目标是任何与实际文件名不对应的目标。我的直觉说,作为目标的目录将被视为与文件相同。
为什么这很重要?我的makefile中有一个目录作为目标。当我把它作为我的主要可执行文件的先决条件时,总是会生成可执行文件,无论一切是否都是最新的。如果我把它作为先决条件,我的makefile足够聪明,知道什么时候需要构建,但我有一个问题,就是不知道是否需要创建目录。根据我所读到的关于make的内容,任何虚假目标都不是先决条件,因为make不知道它们是否是最新的,因此它们将始终重建相关目标。这是我的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}
,目录名称,虚假目标?
答案 0 :(得分:28)
编辑:这仅适用于GNU make - 给出“linux”标签的公平假设。
你的目标是真正的目标,而不是PHONY目标。问题是当您在其中放置目标时输出目录会更新,以使其始终比您的目标更新。这意味着您的目标将始终构建,因为它的依赖关系已过时。
您需要的是order-only prerequisite。这些先决条件允许您指定在不存在时需要构建它,但不要注意时间戳。也就是说,对于仅订单的先决条件,目标不会过时。
您可以这样指定:
$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR}
...
垂直条之后的任何内容都是仅限订单的先决条件。
您现在可以简化OBJ_DIR目标:
${OBJ_DIR} :
mkdir -p ${OBJ_DIR}
注意:我使用${OBJ_DIR}
语法而不是$(OBJ_DIR)
,因为这是您使用的。仅订单的先决条件不依赖于该语法。
答案 1 :(得分:7)
这是一个真正的目标。
make系统不会自动检测到Phony目标 - 必须使用.PHONY
目标来识别它们。
明智的虚假目标包括all
和clean
- 这些目标与真实文件不对应,但与操作相对应,您希望makefile执行此操作。以下是如何解释这一点:
.PHONY: all clean install test
目录是makefile规则的合法目标。你不应该犯这些假的。
mydir:
mkdir mydir
.PHONY目标当然是假的。
可以找到GNU文档here。