各级目录下的Makefile和Kconfig文件小结
代码目录
├── Makefile
├── files
│ ├── etc
│ └── usr
└── src
├── Makefile
├── kern
└── usr
files目录下的文件是编译时只要拷贝到指定目录下的脚本或是文件src目录下是需要进行编译的源码,kern目录下是内核源码,usr目录下是用户态代码
1. package目录下makefile
.
├── Makefile
├── files
└── src
makefile文件末尾有两行:
$(eval $(call BuildPackage,$(PKG_NAME)))
$(eval $(call KernelPackage,$(PKG_NAME)))
$(eval <text>)
是将<text>
作为Makefile文件中的一部分。
这里引用BuildPackage
和KernelPackage
变量中的内容并将内部的$(1)
替换为$(PKG_NAME)
,然后将处理后的内部作为Makefile中的一部分。
BuildPackage 变量定义在 include/package.mk
文件中。
BuildPackage 变量
-
语法简介
$() #表示要执行的一条语句
$(if 条件, 成立执行, 失败执行) #if条件分支
$(foreach 变量, 成员列表, 执行体) #成员遍历语句,语句是可以嵌套使用的。
$(N) #表示第N个参数
BuildPackage 变量定义
define BuildPackage
$(Build/IncludeOverlay)
$(eval $(Package/Default)) #定义在package-defaults.mk文件里
$(eval $(Package/$(1))) #调用用户自定义的 Package/<包名> 宏
ifdef DESCRIPTION
$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description)
endif
#检查有没有定义 Package/<包名>/description宏,如果没有定义,则以TITLE默认定义一个
ifndef Package/$(1)/description
define Package/$(1)/description
$(TITLE)
endef
endif
BUILD_PACKAGES += $(1)
#查找DEPENDS,依赖库
$(STAMP_PREPARED): $$(if $(QUILT)$(DUMP),,$(call find_library_dependencies,$(DEPENDS)))
#检查 TITLE, CATEGORY, SECTION, VERSION 是否定义,如果没有定义则报错
$(foreach FIELD, TITLE CATEGORY SECTION VERSION,
ifeq ($($(FIELD)),)
$$(error Package/$(1) is missing the $(FIELD) field)
endif
)
#如果有定义DUMP,那就引入Dumpinfo/Package宏的内部。
#如果没有,那么就引用 Packaget/<包名>/targets里面的每一个target
#如果没有定义Package/<包名>/targets宏,那么将PKG_TARGETS里的每个target取出来,
#如果也没有定义PKG_TARGETS,那就默认ipkg作为target。将每一个target,引用 BuildTarget/$(target)。
$(if $(DUMP), \
$(Dumpinfo/Package), \
$(foreach target, \
$(if $(Package/$(1)/targets),$(Package/$(1)/targets), \
$