makefile - 如何用循环简化这个 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
所有配置都设置为y
或n
解决方案
让我们分阶段进行。
首先,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))))
推荐阅读
- javascript - 使用外部值更新角反应形式模型
- javascript - 如何检查字符串是否在javascript中以base32编码
- python - QStyledItemDelegate 水平截断文本并且不添加水平滚动条
- sql - 在一个结果集中计算 2 个不同的列
- java - 尝试运行 JavaFX 程序时出现 InvocationTargetException
- java - Java 8 - 返回一个空的 Optional
- c++ - 从c ++ / c中的函数返回的问题
- eclipse - 发生错误请参阅日志文件 eclipse .metadata.log
- asp.net-core - ASP.NET Identity Core 2:根据登录 URL 添加自定义声明
- vba - 返回值后格式化报表文本框