5-Openwrt package Makefile

2023-11-20

Openwrt package Makefile

在”Openwrt main Makefile”章节里面有说道主Makefile会通过include package/Makefile调用package下的Makefile,package下的Makefile又会调用调用$(call subdir,package)遍历package子目录下的Makefile。package下的Makefile是源码里面就提供的,不会修改,但package子目录下的Makefile确是我们经常要打交道的,本章节将对其进行说明。

我们随便打开package下面的子目录,通常会发现几样东西:

  • package/$(PKG_NAME)/Makefile [必备]
  • package/$(PKG_NAME)/src/ [可选]
  • package/$(PKG_NAME)/patches/ [可选]
  • package/$(PKG_NAME)/files/ [可选]

src目录、patches目录、files目录都是可选的,src目录存放的是该功能模块的源代码,pactches目录通常包括bug修复和对可执行文件体积的优化,files目录通常是运行脚本包括配置文件等。你也可能看到其它目录,因为只要在Makefile文件中指明,目录名字是可以任取的。

Makefile文件最关键,一般来说它提供了下载、编译、安装这个软件包的步骤。

当我们打开package子目录的Makefile文件,很难认出这是一个Makefile。它的格式跟一般的Makefile不一样,因为它的功能跟普通Makefile就是不一样的,它是一种编写方便的模板。

这里,以package/bridge/Makefile文件为例:

include $(TOPDIR)/rules.mk

PKG_NAME:=bridge
PKG_VERSION:=1.0.6
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION)
PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@SF/bridge
PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
PKG_CAT:=zcat

include $(INCLUDE_DIR)/package.mk

define Package/bridge
  SECTION:=base
  CATEGORY:=Network
  DEFAULT:=y
  TITLE:=Ethernet bridging configuration utility
  DESCRIPTION:=Ethernet bridging configuration utility\\\
    Manage ethernet bridging; a way to connect networks together to\\\
    form a larger network.
  URL:=http://bridge.sourceforge.net/
endef

define Build/Configure
  $(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR))
endef

define Package/bridge/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/
endef

$(eval $(call BuildPackage,bridge))

1.包含全局变量


首先在Makefile中的第一行一定要包含下面这个命令,这是Makefile的一些全局变量的相关定义
include $(TOPDIR)/rules.mk

2.软件包变量


建立一个软件包不需要太多工作;大部分工作都隐藏在其它的makefiles中,编写工作被抽象成对几个变量的赋值。

PKG_NAME : 软件包的名字, 在 menuconfig 和 ipkg 显示
PKG_VERSION :软件包的版本,主干分支的版本正是我们要下载的
PKG_RELEASE :这个 makefile 的擦写版本
PKG_BUILD_DIR :编译软件包的目录
PKG_SOURCE :要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
PKG_SOURCE_URL :下载这个软件包的链接
PKG_MD5SUM :软件包的 MD5 值
PKG_CAT :解压软件包的方法 (zcat, bzcat, unzip)
PKG_BUILD_DEPENDS :需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的DEPENDS一样。

3.BuildPackage相关的宏定义


1.描述软件包在menuconfig和ipkg中的信息,可以定义如下变量:

define  Package/< PKG_NAME >
    SECTION : 软件包类型
    CATEGORY :  软件包在menuconfig里的位置,如Network, Utilities
    SUBMENU : menuconfig中软件包所属的二级目录,如dial-in/up
    DEFAULT: 默认的编译模式,m=编译成模块,y=编译到镜像,n或者不加不编译,[依赖
            包 两个之间通过空格分隔 前面加+为默认显示 选中该软件包自动选中依
            赖包 不加+为默认不显示 选中依赖包才显示] 
    TITLE : 软件包标题
    DESCRIPTION : 软件包的详细说明,由于存在bug,现在已经放弃
    URL : 软件的原始位置,一般是软件作者的主页
    MAINTAINER :  (optional) 软件包维护人员
    DEPENDS : (optional) 依赖项,运行本软件依赖的其他包
endif

2.配置说明

define  Build/Configure (可选)
        在Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件
        包而设计,一般自行开发的软件包可以不在这里说明。
 endif

3.软件包安装

define Package/install
        软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。調用時會帶一
        個參數,就是嵌入系統的鏡像文件系統目錄,因此$(1)表示嵌入系统的镜像目
        录。一般可以采用下面的方法:
        $(INSTALL_DIR)  $(1)/usr/bin
        $(INSTALL_BIN)  $(PKG_BUILD_DIR)/$(PKG_NAME)  $(1)/usr/bin/
endif

4.其他BuildPackage相关的宏定义


上面列出的三个是在bridge这个模块下面用的宏定义,其他还有很多其他的定义,我们也可以了解下,再其他情况可能也会用到。

1.编译准备

define  Build/Prepare (可选)
    对于网上下载的软件包不需要再描述,对于非网上下载或自行开发的软件包
    必须说明编译准备方法,如下:  
    mkdir -p $(PKG_BUILD_DIR)
    创建编译目录,也就是$(TOPDIR)/build_dir/target-<ARCH>*/$(PKG_NAME)-%(PKG_VERSION)
    $(CP) ./src/* $(PKG_BUILD_DIR)/   
    将软件包的src的源码文件拷贝到编译目录去
endif

2.编译源代码

define  Build/Compile (可选)
    默认是编译源码里面的Makefile,如果你想传递一些参数比如环
    境变量什么的,那就可以定义,编译方法,没有特别说明的可以不予以定义。如果不
    定义将使用默认的编译方法Build/Compile/Default
    自行开发的软件包可以考虑使用下面的定义。
    $(MAKE) -C 	$(PKG_BUILD_DIR)    \
                $(TARGET_CONFIGURE_OPTS)  \
                CFLAGS="$(TARGET_CFLAGS)  -I$(LINUX_DIR)/include"
endif

3.安装之前执行的脚本

define  Package/ $(PKG_NAME)/ preinst (可选)
    软件安装之前被执行的脚本,别忘了在第一句加上#!/bin/sh,如果脚本执行完毕要取消 安装过程,直接让它返回false即可。
    #!/bin/sh
    .........
    exit 0
endif

4.安装之后执行的脚本

define  Package/ $(PKG_NAME)/ postinst (可选)
    软件安装之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    #!/bin/sh
    .........
    exit 0
endif

5.删除之前被执行的脚本

define Package/ $(PKG_NAME)/ prerm (可选)
    软件删除之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消 删除过程,直接让它返回false即可。
    #!/bin/sh
    .........
    exit 0
endif

6.删除之后被执行的脚本

define  Package/ $(PKG_NAME)/ postrm (可选)
    软件删除之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    #!/bin/sh
    .........
    exit 0
endif

为什么一些定义是”Package/”前缀,另一些定义却是”Build”前缀?这是因为Openwrt支持一个特性:从单个源代码构建多个软件包。OpenWrt工作在一个Makefile对应一个源代码的假设之上,但是你可以把编译生成的程序分割成任意多个软件包。因为编译只要一次,所以使用全局的”Build”定义是最合适的。然后你可以增加很多“Package/”定义,为各软件包分别指定安装方法。

5.软件包的实现


完成前面定义后,必须使用eval函数实现各种定义。这是最为关键的BuildPackage宏,它是在$(INCLUDE_DIR)/package.mk文件里定义的。BuildPackage宏只要求一个参数,即要编译的软件包名,在本例中是”bridge”。

对于一般软件包$(eval $(call Package,$(PKG_NAME)))

对于内核模块$(eval $(call KernelPackage,$(PKG_NAME)))

如果一个软件包有多个程序,eval函数也可以设计多个软件包处理。

在编辑好Makefile文件,并放到指定目录后,这个新的软件包将在下次执行make menuconfig时出现,你可以选择这个软件包,保存退出,编译,就把一个软件包成功移植到OpenWrt中了,具体例子将在“Openwrt add function module to package”章节就行说明。

Openwrt package Makefile的分析就到这边,有感悟时会持续会更新。

注:以上内容都是本人在学习过程积累的一些心得,难免会有参考到其他文章的一些知识,如有侵权,请及时通知我,我将及时删除或标注内容出处,如有错误之处也请指出,进行探讨学习。文章只是起一个引导作用,详细的数据解析内容还请查看Openwrt相关教程,感谢您的查阅。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5-Openwrt package Makefile 的相关文章

  • 如何在仅限订单的先决条件中调用函数?

    鉴于 Makefile 的这一点 for pattern matching OBJDIR build just to see if a level of indirection will work my dir dir 1 OBJECTS
  • 如何重新编译单个内核模块?

    通常内核源代码存储在 usr src linux 2 6 x 为了避免在修改模块的源代码时重新编译整个内核 如何重新编译该模块 切换到源代码树的根目录并运行以下命令 make modules SUBDIRS drivers the modu
  • Eclipse CDT生成的Makefile在哪里?

    我已经使用 Eclipse helios CDT 构建了一个 hello world C 项目 它编译得很好 但我想看一下生成的 Makefile CDT 我在项目文件夹 调试 发布文件夹或 src 文件夹中找不到它 我在哪里可以找到这个
  • C:创建静态库并使用 Makefile 进行链接

    我在尝试着了解静态和共享库 http randu org tutorials c libraries php 我想执行以下操作来创建一个单独编译和链接的 makefile 以便创建和链接静态库 形成最终的静态可执行文件 我有以下 Makef
  • 如何生成缺失的 #include 文件的列表

    背景 我正在开发一个大型 C 项目 其中包含多个可执行文件和库输出 以及一组工作 make 文件 即假设您拥有整个代码库 您可以输入 make 它将构建所有库和可执行文件 我的问题是我必须部分编译该项目 并且只需链接已为项目其他部分编译的库
  • 有关如何部署 C++ 代码以在任何地方工作的提示

    我不是在谈论制作可移植代码 这更多的是一个分配问题 我有一个中型项目 它对常用库有几个依赖项 例如 openssl zlib 等 它在我的机器上编译得很好 现在是时候将它呈现给世界了 本质上是构建最好的工程 我想制作适用于 Windows
  • 如何将我的 C 代码与 PCRE 库链接? (当前抛出链接器错误。)

    问题 Note 我最初在一个更大的项目中遇到了这个问题 所以我将代码缩减为您在下面看到的测试用例 我不知道如何编译以下测试代码 具体来说 链接器似乎无法找到 PCRE 库 有关 PCRE 的配置方式 请参阅下文 尽管有明确的 L usr l
  • 有没有比“手表制造”更明智的替代方案?

    我遇到了这个有用的提示 如果您经常处理文件并且希望它们自动构建 则可以运行 手表品牌 每隔几秒钟它就会重新运行一次 一切都会构建完成 然而 它似乎一直在吞噬所有的输出 我认为它可能更聪明 也许显示输出流 但抑制 全部 不做任何事情 这样如果
  • makefile 中的路径不起作用

    我正在运行以下命令makefile哪些需要改变dir到特定目标并在那里运行npm install 问题是我能够在输出中看到它将目录 项目 应用程序 打印到正确的目录 但安装 npm install 在上层 项目 上运行 为什么 例如 当我运
  • 如何链接 ndk 应用程序中的任何库

    From 本教程 http marakana com forums android examples 49 html 看到我有一个预构建的静态库 名为stackoverflow a它有stackoverflow h 现在我想使用该静态库的功
  • Readelf 报告程序是共享库而不是可执行文件

    使用独立的 Android NDK r10e 工具链 使用 toolchain x86 clang3 6 开关构建 出现这种奇怪的行为 交叉编译的环境变量已设置在运行makefile之前 SYSROOT指向Android工具链位置 CXX等
  • Cmake 链接到共享库找不到​​库

    在 Ubuntu 上 我有两个目录 build and src In src my CMakeLists txt文件有以下几行 add executable Test main cpp target link libraries Test
  • 检查 makefile 中的文件大小,如果文件太短则停止

    有没有办法检查特定文件的大小是否小于某个常量 我在 makefile 中假设有关大小的事情 并希望确保如果不满足我的假设 我会收到错误 类似于断言 但在 makefile 中 if filesize file gt C then error
  • 使用 makefile 和静态模式规则进行树外构建

    我正在开发一些在 ARM 上运行的裸机嵌入式代码 因此必须处理整个 ARM 与 THUMB 模式的区别 当前的构建系统使用静态模式规则来确定是否以 ARM 或 THUMB 模式编译文件 ACOBJS o c echo CC c CFLAGS
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • 我怎样才能强制Make一直执行一个菜谱

    当前的 Makefile 有这样的内容 target1 lib1 a lib2 a target2 lib1 a lib3 a target3 lib3 a lib1 a MAKE C sub dir all 我想更改此 Makefile
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • makefile 目标中可以有多个 % 符号吗?

    所以我有一个具有如下目标依赖项的 makefile all foreach lang LANGS foreach models MODELS targetName model xml lang targetName 目标如下所示 targe
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry

随机推荐

  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • centos 通过docker搭建 kurento-media-server 遇到的各种奇葩的大坑

    kurento media server里的坑有n多 而且很多是极其初级的坑 忍不住吐槽一下 不知道是故意的还是他们的程序员刚毕业 1 首先kurento media server只能安装在ubuntu14 和16版本 2 如果你想在cen
  • ST-GCN的学习之路(一)论文分析

    目录 St GCN 2018AAAI Introduction Multiple modalities of human action The weakless of previous methods This work s advanta
  • antv-g2语法总结

    目的 使用antv g2完成一个图表 该图表有两种结构组成 散点图与矩形图组成 我们需要将散点图与矩形图分别在两个view中绘制 所以还需要总结一下view的概念 第一步语法基础 首先是引入相应依赖 其次是创建html容器 div div
  • vue---element el-tree全选、清空、展开、收缩等基本功能总结

    目录 el tree 1 获取选中 2 设置选中 3 全选 清空 4 展开收缩 5 完整代码 el tree 用来展示树型结构的信息 具备展开和折叠的功能 通过案例介绍相关知识点内容 案例实现的功能如下 1 获取选中 可通过node和key
  • 内网渗透工具-反向代理nps使用分析

    0x1 简介 nps 是一款轻量级 高性能 功能强大的内网穿透代理服务器 支持 tcp udp 流量转发 可在网页上配置和管理各个tcp udp隧道 内网站点代理 http https解析等 功能强大 操作方便 0x2 前期准备 1 安装编
  • python运算符

    usr bin python encoding utf 8 print fish 输出方式一 print Hello World 输出方式二 if True 判断语法 print True else print False str Runo
  • OSI七层模型详解

    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯 因此其最主要的功能就是帮助不同类型的主机实现数据传输 完成中继功能的节点通常称为中继系统 在OSI七层模型中 处于不同层的中继系统具有不同的名称 一个设备工作
  • Tomcat的多实例和动静分离

    目录 一 多实例 二 nginx tomcat的负载均衡和动静分离 三 Tomcat 客户端 gt 四层代理 gt 七层代理 gt tomcat服务器 实验 问题总结 tomcat日志文件 usr local tomcat logs cat
  • Python机器学习从零开始(五)算法审查

    目录 1 审查分类算法 1 1线性算法审查 1 2非线性算法审查 2 审查回归算法 2 1线性算法审查 2 2非线性算法审查 3 算法比较 总结 程序测试是展现BUG存在的有效方式 但令人绝望的是它不足以展现其缺位 艾兹格 迪杰斯特拉 Ed
  • 2022322

    没有人天生就会某一项技能 只有在后天的成长中 不断的练习和重复 才会越来越熟练 爆发吧 小宇宙 基础知识 1 html css 2 js vue的使用 1 vue的原理和高级用法 1 html css 3 vue cli4中的webpack
  • Function overloaded in C++

    重载定义 如果两个函数名字相同并且在相同的域中被声明 但是参数表不同 则它们就是重载函数 重载函数条件 2 1 参数类型或参数个数不同 2 2 返回值不同不能视为重载 2 3 是否为常函数不能视为重载 2 4 对于普通类型参数只有const
  • C# 委托详解

    文章目录 前言 一 委托是什么 1 官方关于委托的概述 2 通俗解释 二 如何使用委托 1 使用委托详解 1 申明委托 2 编写委托对应的方法 3 实例化委托 4 使用委托 5 委托使用的综合案例 2 使用多播委托详解 委托链 1 关于多播
  • delphi 软件在线人数统计_Redis实现实时统计在线用户人数的几种方案

    一个业务系统网站每天人数的访问量是多少 在线人数是多少 这种业务我们在开发中就要预留 也是在我们的设计范围内的咯 因为一个正在运营的网站 每天都会用到统计 那在线人数是如何统计的呢 这里有几种方案 代码用laravel框架 可以作为开发中参
  • PostgreSQL9.4: jsonb 性能测试 - Postgres2015全国用户大会--重磅嘉宾佳作分享(谭峰)

    Postgres2015全国用户大会 重磅嘉宾佳作分享 谭峰 友情提示 2015Postgres全国大会将于2015年11月20至21日在北京举行 主会场设在北京丽亭华苑酒店 我们期待您的到来 2015Postgres全国大会官方报名地址
  • PAT (Advanced Level) 1001 A+B Format

    1001 A B Format 20 分 Calculate a b and output the sum in standard format that is the digits must be separated into group
  • 软件工程——软件实现

    在我们做好对软件的需求分析 设计之后 就是软件的实施部分了 主要包括软件实现 软件测试 测试方法 黑盒测试 主要是检查功能 数据 以及接口的问题 具体方法有等价划分 边界值分析 错误推断法 白盒测试 对程序所有逻辑路径进行测试 测试方法按覆
  • 点云Las文件是什么?

    点云Las文件是什么 1 LIDAR数据 2 LAS点云规格 3 LAS Header头文件 4 LAS Header版本与LAS点格式 5 点云Header与点格式对应关系 6 示例 查看点云文件的规格和格式 7 LAS读取可参考 pyl
  • python读取CT医学图像

    需要安装OpenCV和SimpleItk SimpleItk比较简单 直接pip install SimpleItk即可 代码如下 coding utf 8 import SimpleITK as sitk import cv2 LKDS
  • 5-Openwrt package Makefile

    Openwrt package Makefile 在 Openwrt main Makefile 章节里面有说道主Makefile会通过include package Makefile调用package下的Makefile package下