同一目标具有两个规则的makefile

同一目标具有两个规则的makefile,makefile,Makefile,我有一个makefile来创建一个库,我需要它来创建一个80%的库或一个完整的库,这意味着一个包含80%函数的库或一个包含所有函数的库 当我调用make时,“all”规则应该创建80%的库(到目前为止还不错),而当我调用“make complete”时,“complete”规则应该创建100%的库(仍然很容易),并且在任何情况下都不应该重新链接,这里我有一个问题 什么进展顺利: 以下是我所拥有的: all: $(NAME) $(NAME): $(OBJS) ar -rc $@ $^

我有一个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
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”来创建它,然后将其添加到库中:(,everythind必须在此makefile中,根目录下的源代码将始终运行,因为目标名称是
complete
,并且从未创建名为
complete
的文件。只要
make
知道该文件不是最新的,需要重建

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

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

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

complete
不应该是
虚假的目标。如果我从
中删除
complete
当然可以。虚假的
是一个解决办法,我希望有更干净的东西?我目前正在考虑gcc的选项-m,因为有人告诉我这可能是一种方式,但我不知道他到目前为止的意思是什么:pplus,there是一个限制:如果我想进一步做两次,首先
make
60%,
make more
80%和
make complete
100%,当我第一次运行
make coomplete
时,它将运行规则
more
,然后运行规则
complete
,因此
complete
将修改
$(名称)
more
最近,因此
more
将重新运行…以避免我可以在规则
complete
中放置
触摸更完整的
,但它确实不干净:/什么?不,您有
complete:more$(NAME)$(more\u OBJS)
然后它的
touch$@
将创建
complete
,在此之前它将构建
more
目标,该目标有自己的
touch$@
将创建
more
文件。然而,基本答案是不,没有“更干净”的东西.Make的基本设计是构建目标,它与磁盘上的一个文件相关,并且有一个单一的方法来构建每个目标。没有简单的方法可以让同一个目标通过不同的方法多次构建,这取决于命令行上要求的方法。我不知道
gcc-M
可以做些什么来帮助o我认为该建议可能会对你想要做什么感到困惑。或者我是:)正如@MadScientist所写,
make
并不是为了让多个食谱修改同一个目标而设计的。你有时可以或多或少地解决这个问题,但很少没有负面影响(比如尝试使用
-j
时出现的问题)。至少gnu make有一个将归档成员作为目标和依赖项的概念,您也许可以将其用于您的目的(但IIRC,该功能与
-j
有关)。
complete: $(NAME) $(MORE_OBJS)
        ar -rc $^
        @touch $@