首页 > 解决方案 > 如何用循环简化这个 Makefile

问题描述

我的 Makefile 中有这样的行,任何人都可以建议如何为它编写一个循环,或任何其他方式来简化它。

OBJS :=

obj-y :=
include cpu/Makefile
OBJS += $(patsubst %,cpu/%, $(obj-y))

obj-y :=
include drivers/Makefile
OBJS += $(patsubst %,drivers/%, $(obj-y))

obj-y :=
include lib/Makefile
OBJS += $(patsubst %,lib/%, $(obj-y))

obj-y :=
include init/Makefile
OBJS += $(patsubst %,init/%, $(obj-y))

...

内部 Makefile 没有任何目标,仅用于包含目的。例如cpu/Makefile是这样的:

obj-$(CONFIG_XYZ) += something.c
obj-$(CONFIG_ABC) += something_else.c

所有配置都设置为yn

标签: makefile

解决方案


让我们分阶段进行。

首先,patsubst对这份工作来说太过分了;addprefix会做:

obj-y :=
include cpu/Makefile
OBJS += $(addprefix cpu/, $(obj-y))

然后注意我们可以将“cpu”作为变量拉出来:

DIR=cpu
obj-y :=
include $(DIR)/Makefile
OBJS += $(addprefix $(DIR)/, $(obj-y))

然后使用eval一个食谱模板或“罐头食谱”

define ADD_OBJECTS
obj-y :=
include $(1)/Makefile
OBJS += $$(addprefix $(1)/, $$(obj-y))
endef

$(eval $(call ADD_OBJECTS,cpu))

然后将该eval语句放入foreach循环中:

$(foreach DIR,cpu drivers lib init,$(eval $(call ADD_OBJECTS,$(DIR))))

推荐阅读