如果目标名称包含目录部分,则生成目录

问题描述 投票:0回答:1

我有此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添加不必要的调用,不是吗?

makefile wildcard gnu-make
1个回答
1
投票

您不能仅使用模式规则将先决条件添加到给定的一组目标。模式规则不是这样工作的:它们是rules:它们必须具有与之关联的配方。没有配方的模式规则实际上删除该模式规则(请参见Canceling Implicit Rules)。

您可以创建两组模式规则,一组用于所有目标,另一组仅用于以tcp/开头的具有附加前提条件的目标,但是您必须编写整个模式规则两次,包括配方,不只是图案线。

或者只是将mkdir放入配方中。已经存在的目录中的mkdir甚至不会引起注意。

© www.soinside.com 2019 - 2024. All rights reserved.