首页 > 解决方案 > 具有相同目标的两条规则的生成文件

问题描述

我有一个makefile来创建一个库,我需要它来创建一个80%的库或一个完整的库,这意味着一个包含80%函数的库或一个包含所有函数的库。

当我调用 make 时,“all”规则应该创建 80% 的库(到目前为止一切都很好),当我调用“make complete”时,“complete”规则应该创建 100% 的库(仍然很容易),它应该无论如何都不要重新链接,这里我有问题。

进展顺利:

这是我所拥有的:

all: $(NAME)

$(NAME): $(OBJS)
    ar -rc $@ $^

complete: $(NAME) $(MORE_OBJS)
    ar -rc $^

%.o : %.c
    gcc -I. -c -o $@ $<

.PHONY: complete

所以如果我运行它:

>make
gcc -I. -c -o function01.o function01.c
gcc -I. -c -o function02.o function02.c
gcc -I. -c -o function03.o function03.c
gcc -I. -c -o function04.o function04.c
ar -rc libtest.a function01.o function02.o function03.o function04.o

并再次制作:

>make
make: Nothing to be done for 'all'.

完美的。然后完成:

>make complete
gcc -I. -c -o function_05.o function05.c
gcc -I. -c -o function_06.o function06.c
ar -rc libtest.a function05.o function06.o

或者当然:

>make fclean
rm *.o
rm libtest.a
>make complete
gcc -I. -c -o function01.o function01.c
gcc -I. -c -o function02.o function02.c
gcc -I. -c -o function03.o function03.c
gcc -I. -c -o function04.o function04.c
ar -rc libtest.a function01.o function02.o function03.o function04.o
gcc -I. -c -o function_05.o function05.c
gcc -I. -c -o function_06.o function06.c
ar -rc libtest.a function05.o function06.o

出了什么问题:

但如果我再次提示完成:

>make complete
ar -rc libtest.a function05.o function06.o

我不重新编译,但我重新链接库。

我尝试了很多方法,使用特定于目标的分配,以许多不同的组合重新排序目标和规则,但我没有找到任何方法。我错过了什么还是真的很难?

另外,我不能用自己的makefile将附加功能放在另一个文件中,并使用“make -C”来制作它,然后将它添加到库中,所有内容都必须在这个makefile中,并且源代码位于根目录中

标签: makefile

解决方案


make complete将始终运行,因为目标名称是complete并且没有创建任何文件名complete。据make了解,该文件不是最新的,需要重建。

没有直接的方法可以做到这一点,因为make不支持创建相同目标的多个不同配方。

您可以通过使用标记文件来告知 make 目标是否存在来伪造它。为此,您需要创建文件complete,以便 make 可以使用它来跟踪是否需要重建。尝试:

complete: $(NAME) $(MORE_OBJS)
        ar -rc $^
        @touch $@

推荐阅读