• OpenWrt之package: Using Dependencies


    OpenWrt之package: Using Dependencies


    前言

    本文我翻译自OpenWrt的文档, 会讲到DEPENDS, @, &, || ()的分析, 难免存在部分问题, 欢迎指出, 有英语基础的同学可以直奔官方

    https://openwrt.org/docs/guide-developer/dependencies

    https://openwrt.org/docs/guide-developer/packages


    总览 / Topic

    一个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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    本文将会讲述 DEPENDS:=+libpcap该行应该是什么样的


    依赖类型 / Dependency types

    • 除非libpcap被选中, 否则tcpdump不可选
    DEPENDS:=libpcap
    
    • 1
    • 如果tcpdump被选中, libpcap也会被选中
    DEPENDS:=+libpcap
    
    • 1
    • 如果tcpdump被选中, arpd也会被选中. 此时libpcap才可以被选中, 否则不可选.
    DEPENDS:=+PACKAGE_arpd:libpcap
    
    • 1
    • BUSYBOX中如果没有HOSTNAME就选中net-tools-hostname
    DEPENDS:=+!BUSYBOX_CONFIG_HOSTNAME:net-tools-hostname
    
    • 1
    • 需存在USB_SUPPORT该选项 (被定义), 否则会看不到tcpdump这个选项
    DEPENDS:=@USB_SUPPORT
    
    • 1
    • 如果tcpdump被选中, 会自动配置KERNEL_DEBUG_FS相关事项 (包括选中).
    DEPENDS:=+@KERNEL_DEBUG_FS
    
    • 1

    注意: 使用opkg install时不会检查KERNEL_DEBUG_FS是否被安装

    • 如果net-tools-hostname没被选中, 就会自动配置BUSYBOX_CONFIG_HOSTNAME相关事项 (包括选中).
    DEPENDS:=+@!PACKAGE_net-tools-hostname:BUSYBOX_CONFIG_HOSTNAME
    
    • 1

    特别说明 / Special Notes

    • 可以在Makefile定义一个OpenWrt没有的Package, 并且在DEPENDS中调用
    define Package/package-name/config
        ...config stuff
    endef
    
    • 1
    • 2
    • 3

    包括以下命令:

    命令含义
    select package如果tcpdump被选中, package也会被选中.
    select package if packageb如果packageb被选中, package也会被选中
    select package if SYMBOL除非CONFIG_SYMBOL被定义, 否则package不可选
    depends packagebtcpdump依赖于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是否被安装


    警告 / Caveats

    包与包赖之间不能互相依赖 ( Package A 依赖Package B, Package B依赖Package A ) , 这种情况是不被允许的, 如果造成这种循环依赖, 在make menuconfig时会出现其他问题.


    使用bool运算符 / Using boolean operators

    • DEPENDS:@SYMBOLDEPENDS:@SYMBOL:package 语法上支持if的bool运算符操作, 包括: !, &&, ||

    • DEPENDS:+SYMBOL:package语法对bool运算符操作有限制, !只能针对整个条件. 括号只是为了可读性, 是没有作用的. &&的优先级高于||. 所以+(YYY||FOO&&BAR):package如果当YYY被选中 或 FOOBAR都被选中, package才可以选.

    • +YYY||(FOO&&BAR):package可读性来说, 可能会更好

    • 但是+(YYY||FOO)&&BAR:package这种加了括号的情况并不会改变优先级, 括号只是为了可读性, 是没有作用的.


    后话

    翻译的还是比较水的, 不知道能不能看懂, 起码我自己是懂了.

    欢迎关注微信公众号: NueXiniShare

    Enjoy it ~

  • 相关阅读:
    python爬虫涨姿势板块
    【Ubuntu 终端终结者Ctrl shift e无法垂直分页解决办法】
    马斯克的这波神操作,让我意识到保持写代码的能力有多重要
    Redis缓存穿透、击穿、雪崩介绍
    python pip
    Redis (主从复制,哨兵模式,集群)概述及部署
    漏斗分析法、假设分析法
    Unity SteamVR 开发教程:SteamVR Input 输入系统(2.x 以上版本)
    企业自己申报高企会遇到哪些问题,如何处理?
    基于UE高渲染的API开发
  • 原文地址:https://blog.csdn.net/a924282761/article/details/126316882