makefile - 具有相同目标的两条规则的生成文件
问题描述
我有一个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中,并且源代码位于根目录中
解决方案
make complete
将始终运行,因为目标名称是complete
并且没有创建任何文件名complete
。据make
了解,该文件不是最新的,需要重建。
没有直接的方法可以做到这一点,因为make
不支持创建相同目标的多个不同配方。
您可以通过使用标记文件来告知 make 目标是否存在来伪造它。为此,您需要创建文件complete
,以便 make 可以使用它来跟踪是否需要重建。尝试:
complete: $(NAME) $(MORE_OBJS)
ar -rc $^
@touch $@
推荐阅读
- kubernetes - GKE:修改现有集群 - 删除节点标签并更改网络
- reporting-services - 将日期范围调整为 MDX 中的现有成员
- angular - 角度指令在按钮中显示微调器
- android - 适用于 android 的自定义谷歌搜索 api 颜色过滤器
- r - 计数列等于 R 中每一行的向量
- laravel - 如何从不同的字段 Laravel 路由 Nexmo 通知?
- hibernate - java.lang.IllegalArgumentException:无法将 java.lang.Long 字段 com.test.app.entity.User.userId 设置为 com.test.app.entity.User
- android - 在 MIT 应用 Inventor 2 中使用 Spinner
- hibernate - Hibernate Search + Spring Boot:java.lang.IllegalStateException:没有事务实体管理器可用
- vba - MS Project VBA:循环所有打开的 .MPP,打印 PDF