一个Makefile实例
Makefile规则比较复杂,小白只能一点点学习,这里以一个Makefile实例说明Makefile的一般结构
include $(TOPDIR)/rules.mk#一般在 Makefile 的开头
PKG_NAME:=ralink-wifi-mt7688#表示软件包名称,将在 menuconfig 和 ipkg 可以看到
PKG_RELEASE:=1#表示软件包版本号
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
include $(INCLUDE_DIR)/kernel.mk#文件对于软件包为内核时是不可缺少
include $(INCLUDE_DIR)/package.mk#一般在软件包的基本信息完成后再引入
define Package/ralink-wifi-mt7688#编译包定义,应用程序软件包使用Package,內核驱动使用KernelPackage
SUBMENU:=Ralink #进行分类 可以在make menuconfig中看到
FILES:=$(PKG_BUILD_DIR)/ralink-wifi-mt7688.ko#模块文件
TITLE:=Ralink APSoC WiFi SoftAP driver
DEPENDS:=@TARGET_ramips_mt7688 +wireless-tools +maccalc #所需的依赖
endef
define Package/ralink-wifi-mt7688/description#描述
Ralink APSoC WiFi driver for DreamBox
endef
define Build/Prepare#编译前准备工作
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
$(Build/Patch)
$(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used)
endef
define Build/Compile#进行编译
cd $(LINUX_DIR); \
ARCH=mips CC=$(TARGET_CC) \
$(MAKE) M=$(PKG_BUILD_DIR)/rt2860v2_ap/ V=1 modules
endef
define Package/ralink-wifi-mt7688/install
$(INSTALL_DIR) $(1)/lib/modules/$(LINUX_VERSION) $(1)/etc/Wireless/RT2860/
$(CP) -rf ./files/* $(1)/
$(CP) modules/* $(1)/lib/modules/$(LINUX_VERSION)
endef
$(eval $(call BuildPackage,ralink-wifi-mt7688))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
以上实例是我在网上搬一个wifi驱动时的驱动文件,当我按照教程将整个驱动文件置于package目录下后,make menuconfig能够看到menu增加了Ralink项目,但无法加载其中的内容,我百思不得其解。
首先怀疑的是否是路径问题,但仔细排查,这里并没有绝对路径,因此应该不是路径的问题。
再注意到DEPENDS的内容,怀疑是依赖文件缺失因此加载不起来,这里有@TARGET_ramips_mt7688 +wireless-tools +maccalc三个依赖,通过make menuconfig仔细查找到wireless-tools +maccalc勾选后,还是不行。
最后一个TARGET_ramips_mt7688 没看明白什么意思,后来好像是网上搜了搜,make menuconfig的target没有勾选mt7688选项,但是拉的代码本来就没这个mt7688,而是mt76x8,咋办?暴力一点直接将@TARGET_ramips_mt7688改为@TARGET_ramips_mt76x8,这样子果然解决了问题。(这是个wifi驱动,驱动与内核有关,不是随便搬来就能用的,这种操作是错误的,果不其然,固件写到板子后wifi并没驱动起来,报bug)
linux中的make menuconfig
Linux的代码配置项由Kconfig来完成的,关于Kconfig语法可参见:linux/Documentation/kbuild/kconfig-language.txt。在编译时,先进行配置,目的是根据需求选择功能以及编译生成方式类型(模式或包含在内核中),配置项操作可以由如下命令中的其中一条来完成
make config:这个要求你手动选择所有配置项,配置完成后生成.config文件
make menuconfig:显示以curses的图形配置菜单,当已有.config文件存在时,它会根据.config文件设定默认项。若不存在.config文件,则根据各级Kconfig文件来设定菜单项,完成配置后生成.config文件
make oldconfig:与make menuconfig相同,区别在于这个没有图形界面,当已有.config文件存在时,它根据.config文件设定默认项,若kconfig有新配置项时,会提示你进行选择,若不存在.config文件,则根据各级Kconfig文件来设定菜单项,完成配置后生成.config文件。若已存在.config文件, make menuconfig及make oldconfig都会把原.config另存为.config.old
make xx_defconfig: 一般源码中都有不同硬件平台的默认配置文件,你也可以制做自己的默认配置文件,当这个命令执行时,它会根据kconfig及xx_defconfig来生成.config文件。在执行完其中一条config命令后,会生成.config及autoconf文件,autoconf是根据配置项生成的相应宏定义,供makefile使用,当执行make命令时,就会根据autoconf定义的宏及makefile去编译源码
参考链接
Linux中的 make config, make menuconfig, make oldconfig, make xx_defconfig