C定义的Makefile参数 - 需要干净

时间:2014-11-21 22:41:42

标签: c makefile

我有一个用于在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。

感谢。

3 个答案:

答案 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