根据我所读到的有关 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}
、目录名、是否是虚假目标?
编辑:这仅适用于 GNU make - 考虑到“linux”标签,这是一个合理的假设。
你的目标是一个真实的目标,而不是一个虚假的目标。问题是,当您将目标放入其中时,输出目录会更新,以便它始终比您的目标新。这意味着您的目标将始终被构建,因为它的依赖项已经过时了。
你需要的是一个仅订购先决条件 http://www.gnu.org/s/hello/manual/make/Prerequisite-Types.html。这些先决条件允许您指定如果不存在则需要构建,但不需关注时间戳。也就是说,就仅订单先决条件而言,目标不会过时。
您可以这样指定:
$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR}
...
竖线之后的任何内容都是仅订购的先决条件。
您现在可以使 OBJ_DIR 目标更简单:
${OBJ_DIR} :
mkdir -p ${OBJ_DIR}
注意:我用过${OBJ_DIR}
语法而不是$(OBJ_DIR)
因为那是你用的。仅订单先决条件不依赖于该语法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)