我有一个用于在C中构建嵌入式项目的makefile。当我构建项目时,我传递一个如下所示的参数,以便设置#define。
make UID=ID123
在makefile中我有
ifdef UID
CFLAGS+=-DUID=\"$(UID)\"
endif
在源代码中,例如app.h我有
#ifndef UID
#define UID NOUID
#endif
我面临的问题是,只有在我首先清理项目时,这才有效。由于项目非常大,因此在重新编译之间需要花费大量时间。
如何避免这种情况? make程序可以选择性地构建受影响的文件吗?就像编辑文件一样?删除这个#define会影响帮助的对象文件还是个坏主意?
这是必要的,因此编程100个设备,每个设备将在构建时传递给程序的唯一ID。
感谢。
答案 0 :(得分:0)
你可以做几件事,但有些事情很复杂。这是一个关于你的优先事项是什么的问题,以及你想要做多少神秘的Make-craft。
首先,您可以确定哪些对象文件依赖于UID。拥有这样的清单将为您节省大量的工作;例如,您只能删除那些目标文件,然后重建它们,而不是使用clean
删除和重建所有目标文件:
clean_uid_objects:
rm -f $(UID_OBJECTS)
您可以自己维护此列表:
OBJECTS := foo.o bar.o
UID_OBJECTS := baz.o qux.o
或者有些聪明,你可能会让Make动态构建列表,但解释说这需要一段时间。
您还可以让您跟踪上次重建目标文件时使用的UID。毕竟,如果你没有改变它,那么你就不必重建任何东西了。一种方法是将最后一个UID记录在名为UID_SAVE
的文件中。然后你可以在makefile中include
那个文件,当你传递一个新的UID时,Make会调整它(并重建makefile,然后重新运行):
-include UID_save
ifdef UID
#CFLAGS+=-DUID=\"$(UID)\"
ifneq ($(UID),$(OLDID))
.PHONY: UID_SAVE
endif
endif
UID_save:
@echo OLDID:=$(UID) > $@
一旦 工作,就可以使UID_SAVE
成为依赖于UID的目标文件的先决条件,这样就不需要进行任何清理。
答案 1 :(得分:0)
我最终使用
.PHONY: myfile1.c myfile2.c myfile1.h
强制重建依赖于传递的参数的文件。
答案 2 :(得分:0)
我的回答类似于Beta的最后一个答案,但它显示了精确的系统方法。你想要的是UID
表现得好像它是一个文件,而不是一个变量,所以你可以依赖它。以下是如何操作,请参阅本文中的答案:
How do I add a debug option to Makefile
您编写函数DEPENDABLE_VAR
。然后,如果您希望变量UID
为"可靠",您只需调用该函数:
$(eval $(call DEPENDABLE_VAR,UID))
现在您可以编写如下内容:
foobar.o: UID