本文我翻译自OpenWrt的文档, 会讲到DEPENDS, @, &, || ()的分析, 难免存在部分问题, 欢迎指出, 有英语基础的同学可以直奔官方
https://openwrt.org/docs/guide-developer/dependencies
https://openwrt.org/docs/guide-developer/packages
一个package的Makefile包括以下部分:
define Package/tcpdump/default
SECTION:=net
CATEGORY:=Network
DEPENDS:=+libpcap
TITLE:=Network monitoring and data acquisition tool
URL:=http://www.tcpdump.org/
endef
本文将会讲述 DEPENDS:=+libpcap该行应该是什么样的
libpcap被选中, 否则tcpdump不可选DEPENDS:=libpcap
tcpdump被选中, libpcap也会被选中DEPENDS:=+libpcap
tcpdump被选中, arpd也会被选中. 此时libpcap才可以被选中, 否则不可选.DEPENDS:=+PACKAGE_arpd:libpcap
BUSYBOX中如果没有HOSTNAME就选中net-tools-hostnameDEPENDS:=+!BUSYBOX_CONFIG_HOSTNAME:net-tools-hostname
USB_SUPPORT该选项 (被定义), 否则会看不到tcpdump这个选项DEPENDS:=@USB_SUPPORT
tcpdump被选中, 会自动配置KERNEL_DEBUG_FS相关事项 (包括选中).DEPENDS:=+@KERNEL_DEBUG_FS
注意: 使用opkg install时不会检查KERNEL_DEBUG_FS是否被安装
net-tools-hostname没被选中, 就会自动配置BUSYBOX_CONFIG_HOSTNAME相关事项 (包括选中).DEPENDS:=+@!PACKAGE_net-tools-hostname:BUSYBOX_CONFIG_HOSTNAME
Makefile定义一个OpenWrt没有的Package, 并且在DEPENDS中调用define Package/package-name/config
...config stuff
endef
包括以下命令:
| 命令 | 含义 |
|---|---|
| select package | 如果tcpdump被选中, package也会被选中. |
| select package if packageb | 如果packageb被选中, package也会被选中 |
| select package if SYMBOL | 除非CONFIG_SYMBOL被定义, 否则package不可选 |
| depends packageb | tcpdump依赖于packageb, 除非packageb被选中,否则看不到tcpdump |
| depends packageb if packagec | 如果packagec被选中, tcpdump会依赖packageb |
| select SYMBOL | 如果tcpdump被选中, 设置为CONFIG_SYMBOL=y. |
| select SYMBOL if packageb | 如果packageb被选中, 执行select SYMBOL的操作 |
| select SYMBOL if SYMBOL2 | 如果SYMBOL2被定义, 执行select SYMBOL的操作 |
需要注意的是, 在Package/foo/config使用select bar时, 会选中bar编译, 但是当使用opkg install foo时, 不需要保证foo是否被安装
包与包赖之间不能互相依赖 ( Package A 依赖Package B, Package B依赖Package A ) , 这种情况是不被允许的, 如果造成这种循环依赖, 在make menuconfig时会出现其他问题.
DEPENDS:@SYMBOL和DEPENDS:@SYMBOL:package 语法上支持if的bool运算符操作, 包括: !, &&, ||
DEPENDS:+SYMBOL:package语法对bool运算符操作有限制, !只能针对整个条件. 括号只是为了可读性, 是没有作用的. &&的优先级高于||. 所以+(YYY||FOO&&BAR):package如果当YYY被选中 或 FOO和BAR都被选中, package才可以选.
+YYY||(FOO&&BAR):package可读性来说, 可能会更好
但是+(YYY||FOO)&&BAR:package这种加了括号的情况并不会改变优先级, 括号只是为了可读性, 是没有作用的.
翻译的还是比较水的, 不知道能不能看懂, 起码我自己是懂了.
欢迎关注微信公众号: NueXiniShare
Enjoy it ~