我有此makefile代码:
$(DIRS):
@echo " MKDIR build/tmp/base/socket/$@"
$(Q)mkdir -p $@/
%.a.s:
@echo " CC build/tmp/base/socket/$@"
$(Q)$(CC) $(CFLAGS_A) -S $< -o $@
%.so.s:
@echo " CC build/tmp/base/socket/$@"
$(Q)$(CC) $(CFLAGS_SO) -S $< -o $@
%.o: %.s
@echo " AS build/tmp/base/socket/$@"
$(Q)$(AS) $< -o $@
tcp/client.a.s: $(TCP_CLIENT_SRC) $(TCP_CLIENT_INC)
tcp/client.so.s: $(TCP_CLIENT_SRC) $(TCP_CLIENT_INC)
tcp/server.a.s: $(TCP_SERVER_SRC) $(TCP_SERVER_INC)
tcp/server.so.s: $(TCP_SERVER_SRC) $(TCP_SERVER_INC)
我想在名称中带有前导| tcp
的所有目标的前提条件中添加tcp/
,但我希望能够一行完成。我不想手动将其附加到需要它的每一行。
我想添加此新规则:
tcp/%.s: | tcp
但是它什么也没做。
我还想到了更通用的方法,它会更好,但结果相同:
%.s: | $(@D)
我应该怎么写?
一种解决方法是每次都调用mkdir(在%.a.s和%.so.s规则中都包括它,但这会向mkdir添加不必要的调用,不是吗?
您不能仅使用模式规则将先决条件添加到给定的一组目标。模式规则不是这样工作的:它们是rules:它们必须具有与之关联的配方。没有配方的模式规则实际上删除该模式规则(请参见Canceling Implicit Rules)。
您可以创建两组模式规则,一组用于所有目标,另一组仅用于以tcp/
开头的具有附加前提条件的目标,但是您必须编写整个模式规则两次,包括配方,不只是图案线。
或者只是将mkdir
放入配方中。已经存在的目录中的mkdir
甚至不会引起注意。