Makefile语法

2023-10-27

下面来介绍Makefile的基本语法。

12.2.1. 引入文件

OpenWrt 使用三个 makefile 的子文件,分别为:

Include$(TOPDIR)/rules.mk

Include$(INCLUDE_DIR)/kernel.mk

Include$(INCLUDE_DIR)/package.mk

由这些 makefile子文件确立软件包加入 OpenWrt的方式和方法。$(TOPDIR)/rules.mk一般在 Makefile 的开头,$(INCLUDE_DIR)/kernel.mk 文件对于软件包为内核时是不可缺少,$(INCLUDE_DIR)/package.mk一般在软件包的基本信息完成后再引入。

12.2.2. 编写软件包的基本信息

软件包的信息均以 PKG_开头,其意思和作用如下:

PKG_NAME表示软件包名称,将在 menuconfig和 ipkg 可以看到。

PKG_VERSION 表示软件包版本号。

PKG_RELEASE 表示 Makefile 的版本号。

PKG_SOURCE表示源代码的文件名。

PKG_SOURCE_URL表示源代码的下载网站位置。@SF表示在 sourceforge网站,@GNU 表示在 GNU 网站,还有@GNOME、@KERNEL。

PKG_MD5SUM表示源代码文件的效验码。用于核对软件包是否正确下载。

PKG_CAT表示源代码文件的解压方法。包括 zcat,bzcat,unzip等。

PKG_BUILD_DIR表示软件包编译目录。它的父目录为 $(BUILD_DIR)。如果不指定,默认为

$(BUILD_DIR)/$(PKG_NAME)/$(PKG_VERSION)。

12.2.3. 编译包定义

应用程序和内核驱动模块的定义不一样。应用程序软件包使用 Package,內核驱动模块使用

KernelPackage。

1) 应用程序编译包定义

应用程序的编译包以 Package/开头,然后接着软件名,在 Package 定义中的软件名可以与软件包名不一样,而且可以多个定义。下面使用$(PKG_NAME)只是做一个标示,并非真正使用$(PKG_NAME),如

Package/$(PKG_NAME)。

SECTION 表示包的类型,预留。

CATEGORY 表示分类,在 make menuconfig 的菜单下将可以找到。

TITLE 用于软件包的简短描述。

DESCRIPTION 用于软件包的详细描述,已放弃使用。如果使用 DESCRIPTION 将会提示“ error

DESCRIPTION:= is obsolete,usePackage/PKG_NAME/description”。

URL 表示软件包的下载位置。

MAINTAINER 表示维护者,选项。

DEPENDS 表示与其他软件的依赖。即如编译或安装需要其他软件时需要说明。如果存在多個依赖,则每个依赖需要用空格分开。依赖前使用+号表示默认为显示,即对象沒有选中时也会显示,使用@则默认为不显示,即当依赖对象选中后才显示。

在用户空间的应用程序软件包中沒有內核驱动模块的 AUTOLOAD 参数。如果应用软件需要在 boot 时自动运行,则需要在/etc/init.d 中增加相应的脚本文件。脚本文件需要 START 参数,说明在 boot 时的优先级,如果在 boot 过程启动后再关闭,则需要进一步设置 STOP 参数。

如果 STOP参数存在,其值必须大于 START。脚本文件需要 start()和 stop()两个函数,start()是执行程序, stop()是关闭程序。关闭程序一般需要執行 killall 命令。由/etc/rc.d/S10boot 知道,装载內核驱动模块的优先级为 10,需要使用自己设计的內核驱动模块的程序其 START 的值必须大于 10。同样由/etc/rc.d/S40network 知道,使用网络通信的程序其 START 的值必须大于 40。

Package/$(PKG_NAME)/conffiles

本包安裝的配置文件,一行一个。如果文件结尾使用/,则表示为目录。用于备份配置文件说明,在

sysupgrade 命令执行时将会用到。

Package/$(PKG_NAME)/description

软件包的详细描述,取代前面提到的 DESCRIPTION 详细描述。

Build/Prepare

编译准备方法,对于网上下载的软件包不需要再描述。对于非网上下载或自行开发的软件包必须说明编译准备方法。一般的准备方法为:

defineBuild/Prepare

mkdir-p $(PKG_BUILD_DIR)

$(CP)./src/* $(PKG_BUILD_DIR)/

endef

按 OpenWrt 的习惯,一般把自己设计的程序全部放在src 目录下。

Build/Configure

在 Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件包而设计,一般自行开发的软件包可以不在这里说明。需要使用本定义的情况,可参考dropbear。Build/Compile编译方法,没有特别说明的可以不予以定义。如果不定义将使用默认的编译方法Build/Compile/Default。

自行开发的软件包可以考虑使用下面的定义。

defineBuild/Compile

$(MAKE) -C $(PKG_BUILD_DIR)     \

$(TARGET_CONFIGURE_OPTS)

CFLAGS="$(TARGET_CFLAGS)-I$(LINUX_DIR)/include"

Endef

Package/$(PKG_NAME)/install 软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系統的镜像文件系统目录,因此$(1)表示嵌入系统的镜像目录。一般可以采用下面的方法:

definePackage/$(PKG_NAME)/install

$(INSTALL_DIR) $(1)/usr/bin

$(INSTALL_BIN) $(PKG_BUILD_DIR)/ $(PKG_NAME)

$(1)/usr/bin/

endef

INSTALL_DIR、INSTALL_BIN 在$(TOPDIR)/rules.mk文件定义,所以本 Makefile 必须引入$(TOPDIR)/rules.mk

文件。

INSTALL_DIR:=install-d -m0755 意思是创建所属用戶可读写和执行,其他用戶可读可执行的目录。

INSTALL_BIN:=install -m0755 意思编译好的文件存放到镜像文件目录。

如果用戶空间的应用软件在 boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装和配置文件安裝方法。例如:

definePackage/mountd/install

$(INSTALL_DIR)$(1)/sbin/    $(1)/etc/config/$(1)/etc/init.d/

$(INSTALL_BIN)$(PKG_BUILD_DIR)/mountd $(1)/sbin/

$(INSTALL_DATA)    ./files/mountd.config    $(1)/etc/config/mountd

$(INSTALL_BIN)./files/mountd.init $(1)/etc/init.d/mountd

endef

安装文件放在 files 子目录下,不要与源代码文件目录src 混在一起,以提高可读性。

使用清晰的文件扩展名,更方便安装识別文件。

Package/$(PKG_NAME)/preinst

软件包安装前处理方法,使用脚本语言,因此定义的第一行需要下面的格式

#!/bin/sh

调用时带入的参数为嵌入式系統的镜像目录。

Package/$(PKG_NAME)/postinst

软件包安装后处理方法,使用脚本语言。

Package/$(PKG_NAME)/prerm

软件包删除前处理方法,使用脚本语言。

Package/$(PKG_NAME)/postrm

软件包删除后处理方法,使用脚本语言。

2) 内核驱动模块包定义

Linux 分为内核空间和用户空间。开发者开发的内核部分可以直接加入Linux 的 Kernel程序,也可以生成内核模块以便需要时装入内核。OpenWrt一般希望开发者生成内核模块,在 Linux启动后自动装载或手工使用 insmod命令装载。内核模块使用 KernelPackage开头,其他与一般应用软件包基本相同。

在内核驱动模块定义中增加了:

SUBMENU 表示子菜单位置,在$(INCLUDE)/kernel.mk 对内核模块定义了 CATEGORY 为 kernel modules,

所以内核模块在 menuconfig中的主菜单为 kernelmodules,然后有下一级子菜单$(SUBMENU)。在子菜单下可以看到以 kmod-$(PKG_NAME)项目。

DEFAULT 表示直接编入内核或产生内核模块,y 表示直接编入内核,m 表示产生内核模块。

AUTOLOAD 表示自动装入内核,一般表示方法为:

AUTOLOAD:=$(callAutoLoad,$(PRIORITY),$(AUTOLOAD_MODS))

AutoLoad 的第一个参数$(PRIORITY)为优先级,01 为最优先,99 为最后装载。有关自动装载可以在

/etc/modules.d目录下看到,第二个参数$(AUTOLOAD_MODS)模块名,每个模块名以空格符分隔。即可同时装载多个内核模块。

在开发过程最好不要使用自动装载,经过严格调试后再使用,可以减轻调试的工作量。

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

Makefile语法 的相关文章

  • 三层架构介绍

    文章目录 一 什么是三层架构 1 1概述 1 2表示层 1 3业务逻辑层 1 4数据访问层 1 5层与层的关系 二 为什么需要三层架构 三 层架构的应用 3 1原则 3 2例子 实现登录功能 一 什么是三层架构 1 1概述 三层架构 3 t
  • 嵌入式开发——uboot中命令执行函数(main_loop函数)

    1 main loop 函数源码 从uboot中摘抄的部分main loop函数 为了便于理解 函数只保留了主线部分代码 一些用宏定义控制的代码被删除掉了 void main loop void static char lastcomman
  • 单片机电子电路中常用的负压产生电路

    负电压的产生电路图原理 在电子电路中我们常常需要使用负的电压 比如说我们在使用运放的时候常常需要给他建立一个负的电压 下面就简单的以正5V电压到负电压5V为例说一下他的电路 通常我需要使用负电压时一般会选择使用专用的负压产生芯片 但这些芯片
  • 面试准备:操作系统常见面试题汇总

    文章目录 1 为什么要有用户态和内核态 内核态和用户态的运作方式 2 进程间通信方式介绍 3 Linux查看进程状态 cpu状态 占用端口的进程号的命令 linux top命令VIRT RES SHR DATA的含义 4 什么是Swap 5
  • vue父组件数据更新后,子组件页面没刷新

    可以修改子组件绑定的key 这样子组件就会重新渲染
  • linux内核中的驱动查找

    一 使用make menuconfig 可以查看具体编译了哪些驱动 在内核根目录下输入sudo make menuconfig 进入界面后 选择Device Drives 具体界面如下 进去后可以看到很多驱动名字 以I2C为例 选中后选择h
  • Uva 489 Hangman Judge

    本题不难 但是我花了一个学期才AC 找到原因后想狠狠地揍自己一顿 原来是输出的一个单词拼错了 一直在解题思路和细节上找问题的我还曾吐槽这是什么脑残游戏 以后需细心 include
  • qt .pro文件配置

    模板变量TEMPLATE TEMPLATE app 表示是可执行应用程序 TEMPLATE lib 表示是库 TEMPLATE subdirs 创建一个可进入特定目录并为一个项目文件生成 指定项目中使用Qt的模块 默认情况下 QT包含cor
  • 神经网络 — 激活函数

    生物神经网络是一个复杂的网络结构 人工神经网络是借鉴生物神经网络的最基本特征 利用神经元和神经元之间的连接 从而构成的一种数学模型 生物神经元能够接收其他多个神经元的输入 当这些输入累计超过一定的阈值时 这个神经元就会被激活 产生输出 在设
  • Nginx反向代理location与proxy_pass配置规则总结

    一 location配置规则 1 匹配模式及顺序举例 location uri 开头表示精确匹配 只有完全匹配上才能生效 location uri 开头对 URL 路径进行前缀匹配 并且在正则之前 location pattern 开头表示
  • [深度学习]Semantic Segmentation语义分割之UNet(2)

    论文全称 U Net Convolutional Networks for Biomedical Image Segmentation 论文地址 https arxiv org pdf 1505 04597v1 pdf 论文代码 https
  • 用Flutter写一个单例

    在Flutter中创建单例可以使用Dart语言中的静态变量和工厂方法的组合来实现 下面是一个示例代码 class MySingleton 静态变量 static final MySingleton singleton MySingleton
  • PL/SQL 怎么判断两个结果集是否相等

    数据库服务器 Oracle 现在有两个结果集 A1 Cause Rate UEG 2000 GYU 1900 NBU 2900 CET 3000 A2 Cause Rate UEG 2000 GYU 1900 NBU 2900 CET 30
  • png lib error bad parameters to zlib

    目录 1 问题描述 2 问题分析 3 解决方案 3 1 解决方法一 3 2 解决方法二 1 问题描述 在 Linux ubuntu 编译 PNG 库时 出现了 png lib error bad parameters to zlib 错误
  • Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用

    转载请注明本文出自xiaanming的博客 http blog csdn net xiaanming article details 26810303 请尊重他人的辛勤劳动成果 谢谢 大家好 差不多两个来月没有写文章了 前段时间也是在忙换工
  • Elasticsearch 部署以及插件安装(win7)

    Elasticsearch 部署以及插件安装 win7 一 安装版本 找到对应版本 我使用的是2 3 5版本 安装包下载地址https www elastic co downloads past releases elasticsearch
  • LEAKAGE IN NANOMETER CMOS TECHNOLOGIES

    纳米CMOS管技术中的漏电流 https link springer com book 10 1007 0 387 28133 9
  • ORA-00933: SQL 命令未正确结束

    java sql SQLSyntaxErrorException ORA 00933 SQL 命令未正确结束 在数据库中语句运行完全没问题 但是在编程的时候却报这样的错误 控制台看似报一大堆异常原因可能是 1 你没逗号可能没写够 仔细检查S
  • 获取字符串长度的函数sizeof()、strlen()、length()、size()详解和区别

    在C 中计算长度的函数有四种 它们分别是sizeof size strlen str length 一 sizeof 和strlen 两者区别 1 sizeof操作符的结果类型是size t 该类型保证能容纳实现所建立的最大对象的字节大小
  • jQuery 获取 input:file 文件路径( Firefox for Ubuntu )

    在写一个小项目的时候遇到了一个问题 通过jquery获取选择的文件的路径 最开始选择的是通过 val 获取路径 但是后来发现获取到的路径有问题原始路径是 home onemue 案例 表情上传 前端 pic png获取到的路径是C fake

随机推荐

  • C++之萃取技术

    自从C 中引入了template后 以泛型技术为中心的设计得到了长足的进步 STL就是这个阶段杰出的产物 STL的目标就是要把数据和算法分开 分别对其进行设计 之后通过一种名为iterator的东西 把这二者再粘接到一起 设计模式中 关于i
  • 消息队列之基础知识(一)

    来自公众号 灰子学技术 欢迎关注 笔者最近在看消息队列 顺便做了整理 在学习这个知识点之前 笔者问了自己下面几个问题 什么是消息队列 为什么我们需要消息队列 消息队列有什么用 常用的消息队列有那些 以下内容 读者便从这几个方面开始说起 一
  • windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题

    在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed registry count type 1 0 vs 1 Unknown layer type的错误 如下图 这里参考网上资料汇总了几种解决方法
  • 安卓音乐播放器--侧边栏

    侧边栏学习 参考资料 http www chinatarena com Html adpeixun 201307 5251 html 还有一个参考的代码 最后自己的理解是 在scrollView中添加两个水平的视图 musicListLay
  • react中实现拖拽排序react-dnd

    dnd文档 html 拖拽排序 import React useState useRef from react import cloneDeep from lodash import styles from index less const
  • 中国工程院院士倪光南:拥抱开源 与世界协同创新

    2022年7月21日 在中国开源软件推进联盟主办 赛迪传媒 软件和集成电路 杂志社联合承办 CSDN 独家直播的 第十七届开源中国开源世界高峰论坛 上 中国工程院院士倪光南带来了 拥抱开源 与世界协同创新 的主题演讲 以下为倪光南演讲实录
  • 【uni-app】【Android studio】手把手教你运行uniapp项目到Android App

    最开始想写一个自定义背景的弹窗 因为要用到项目的好几个地方 不希望每个地方都需要引入 而且只需要放张图片 加个关闭按钮和功能按钮就行 类似这种效果 开始写的时候找了一篇博客 写的很详细 但是这个是Vue2的 uniapp实现自定义弹窗组件
  • 轴上键槽怎么标注

    百度知道 https zhidao baidu com question 1638366488494069980 html
  • MATLAB图像拼接算法及实现

    论文关键词 图像拼接 图像配准 图像融合 全景图 论文摘要 图像拼接 image mosaic 技术是将一组相互间重叠部分的图像序列进行空间匹配对准 经重采样合成后形成一幅包含各图像序列信息的宽视角场景的 完整的 高清晰的新图像的技术 图像
  • java引用ScriptEngine解析表达式实现计算器功能

    包名 import javax script 使用 String str 2 6 7 ScriptEngine se new ScriptEngineManager getEngineByName JavaScript try double
  • 大数据技术原理与应用(复习)

    大数据 第一章 大数据的四个基本特性 p8 4V 数据量大 Volume 数据类型繁多 Variety 处理速度快 Velocity 价值密度低 Value 举例说明大数据的关键技术 p16 数据采集与预处理 利用ETL工具将分布在异构数据
  • Python123题目解析

    老样子 复习第一位 持续更新 慢慢附加知识点 python123 英寸和厘米的交互 升级版 描述 虽然我国已经很好的普及了国际单位制 而在现实生活中 仍然有很多地方采用了英制单位来描述 例如 我们买一台65寸的电视 这个地方的寸指的就是英寸
  • 编写测试用例的测试方法(等价类、判定表、边界值、正交排列法、场景法)

    一 等价类划分法 1 应用场合 在程序中 有数据输入的地方适合使用等价类划分法进行测试 方法思想 范围 将大量数据划分成若干的范围 等价类 再从每个范围中抽取少量代表数据进行测试 抽样测试 2 两个概念 1 有效等价类 对程序来说 正确的
  • Gerrit合并分支cherry-pick后提交代码push报错,43366 closed问题处理

    Gerrit合并分支cherry pick后提交代码push报错 43366 closed问题处理 这个问题是我cherry pick别的分支代码时遇到的 至于如何cherry pick代码可以参考 链接 如何cherry pick分支代码
  • html字符串转json

    业务场景 后端返回给前端的数据中 有html格式的字符串 如下 font color red 我是提示信息 font 后端使用fastjson data toJsonString 响应给前端 但是格式不是标准的json格式 如 msg fo
  • Qt 的信号与槽

    QT的信号与槽的三种实现方式 3种方式 1 直接在设计选项卡中拖动连接控件 然后选择控件间的关联函数 2 头文件mainwindows h中 ifndef MAINWINDOW H define MAINWINDOW H include
  • jdk8 api

    JDK 8是Java开发工具包的第8个主要版本 它于2014年3月18日发布 JDK 8 API是Java开发人员使用的程序包 类 接口和注释的集合 用于创建Java程序 它包括Java核心库 如java lang和java util 以及
  • MSP430F5529学习笔记(2)——点亮LED

    TI官方MSP430F5529开发板原理图和中文开发手册 MSP430F5529学习笔记 1 环境配置 目录 原理图和中文开发手册获取方法 点亮LED1 分析电路图 写程序 点亮LED1 1 首先我们需要告诉单片机 P1 0是输入还是输出
  • 二叉树的链式存储结构及(C语言)实现

    上一节讲了二叉树的顺序存储 通过学习你会发现 其实二叉树并不适合用数组存储 因为并不是每个二叉树都是完全二叉树 普通二叉树使用顺序表存储或多或多会存在空间浪费的现象 本节我们学习二叉树的链式存储结构 图 1 普通二叉树示意图 如图 1 所示
  • Makefile语法

    下面来介绍Makefile的基本语法 12 2 1 引入文件 OpenWrt 使用三个 makefile 的子文件 分别为 Include TOPDIR rules mk Include INCLUDE DIR kernel mk Incl