Openwrt有一套自己管理軟件包的方法,可以用來(lái)管理數(shù)千個(gè)軟件包與數(shù)十個(gè)硬件平臺(tái),我們也可以使用這套管理方法將我們的軟件加入到Openwrt系統(tǒng)中。
文件結(jié)構(gòu)
下面的文件結(jié)構(gòu)是dns軟件包的結(jié)構(gòu),該軟件包存放在 openwrt/package/network/services目錄下,這個(gè)軟件包下存在兩個(gè)文件夾跟一個(gè)Makefile文件。
dnsmasq/
├── Makefile
├── files
└── patches
- Makefile:這個(gè)文件是必須有的,該文件的提供下載、編譯、安裝以及生成OPKG安裝包的功能。這個(gè)Makefile與通常Makefile不同,Openwrt沒(méi)有遵守傳統(tǒng)的Makefile格式風(fēng)格,而是將Makefile寫成面向?qū)ο蟮母袷?,這樣簡(jiǎn)化了多平臺(tái)移植過(guò)程。
- files:這個(gè)目錄是可選的,一般用于保存默認(rèn)配置文件與初始化啟動(dòng)腳本
- patches:這個(gè)目錄是可選的,一般用于存放缺陷修改或者用于優(yōu)化可執(zhí)行程序大小的補(bǔ)丁文件。如果為Openwrt本身項(xiàng)目所包含的軟件模塊,因?yàn)榇a將完全收到自己控制,這時(shí)將不會(huì)有patches而是一個(gè)src目錄,用于存放代碼。
Makefile解析
這個(gè)是dnsmasq軟件包的Makefile,這個(gè)Makefile的語(yǔ)法與傳統(tǒng)的Makefile不一樣。
這個(gè)Makefile大概過(guò)程就是:
- 使用“include”指示符導(dǎo)入頂層目錄的rules.mk文件;
- 定義軟件包的基本信息的變量,如名稱、版本、下載地址、許可協(xié)議和編譯目錄等信息;
- 使用“include”指示符導(dǎo)入頂層目錄的package.mk文件;
- 軟件包的宏定義和一些編譯選項(xiàng)定義;
- 最后調(diào)用BuildPackage。
#
# Copyright (C) 2006-2016 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=dnsmasq
PKG_UPSTREAM_VERSION:=2.86
PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION)))
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz
PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq
PKG_HASH:=28d52cfc9e2004ac4f85274f52b32e1647b4dbc9761b82e7de1e41c49907eb08
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING
PKG_CPE_ID:=cpe:/a:thekelleys:dnsmasq
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_UPSTREAM_VERSION)
PKG_INSTALL:=1
PKG_BUILD_PARALLEL:=1
PKG_ASLR_PIE_REGULAR:=1
PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcp \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcpv6 \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_ipset \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_conntrack \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_noid \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_broken_rtc \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_tftp
include $(INCLUDE_DIR)/package.mk
define Package/dnsmasq/Default
SECTION:=net
CATEGORY:=Base system
TITLE:=DNS and DHCP server
URL:=http://www.thekelleys.org.uk/dnsmasq/
DEPENDS:=+libubus
USERID:=dnsmasq=453:dnsmasq=453
endef
define Package/dnsmasq
$(call Package/dnsmasq/Default)
VARIANT:=nodhcpv6
endef
define Package/dnsmasq-dhcpv6
$(call Package/dnsmasq/Default)
TITLE += (with DHCPv6 support)
DEPENDS+=@IPV6
VARIANT:=dhcpv6
PROVIDES:=dnsmasq
endef
define Package/dnsmasq-full
$(call Package/dnsmasq/Default)
TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset, Conntrack, NO_ID enabled by default)
DEPENDS+=+PACKAGE_dnsmasq_full_dnssec:libnettle \
+PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset \
+PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack
VARIANT:=full
PROVIDES:=dnsmasq
endef
define Package/dnsmasq/description
It is intended to provide coupled DNS and DHCP service to a LAN.
endef
define Package/dnsmasq-dhcpv6/description
$(call Package/dnsmasq/description)
This is a variant with DHCPv6 support
endef
define Package/dnsmasq-full/description
$(call Package/dnsmasq/description)
This is a fully configurable variant with DHCPv4, DHCPv6, DNSSEC, Authoritative DNS
and IPset, Conntrack support & NO_ID enabled by default.
endef
define Package/dnsmasq/conffiles
/etc/config/dhcp
/etc/dnsmasq.conf
/etc/dnsmasq.d/
endef
define Package/dnsmasq-full/config
if PACKAGE_dnsmasq-full
config PACKAGE_dnsmasq_full_dhcp
bool "Build with DHCP support."
default y
config PACKAGE_dnsmasq_full_dhcpv6
bool "Build with DHCPv6 support."
depends on IPV6 && PACKAGE_dnsmasq_full_dhcp
default y
config PACKAGE_dnsmasq_full_dnssec
bool "Build with DNSSEC support."
default y
config PACKAGE_dnsmasq_full_auth
bool "Build with the facility to act as an authoritative DNS server."
default y
config PACKAGE_dnsmasq_full_ipset
bool "Build with IPset support."
default y
config PACKAGE_dnsmasq_full_conntrack
bool "Build with Conntrack support."
default y
config PACKAGE_dnsmasq_full_noid
bool "Build with NO_ID. (hide *.bind pseudo domain)"
default y
config PACKAGE_dnsmasq_full_broken_rtc
bool "Build with HAVE_BROKEN_RTC."
default n
config PACKAGE_dnsmasq_full_tftp
bool "Build with TFTP server support."
default y
endif
endef
Package/dnsmasq-dhcpv6/conffiles = $(Package/dnsmasq/conffiles)
Package/dnsmasq-full/conffiles = $(Package/dnsmasq/conffiles)
TARGET_CFLAGS += -flto
TARGET_LDFLAGS += -flto=jobserver
COPTS = -DHAVE_UBUS -DHAVE_POLL_H \
$(if $(CONFIG_IPV6),,-DNO_IPV6)
ifeq ($(BUILD_VARIANT),nodhcpv6)
COPTS += -DNO_DHCP6
endif
ifeq ($(BUILD_VARIANT),full)
COPTS += $(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcp),,-DNO_DHCP) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcpv6),,-DNO_DHCP6) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec),-DHAVE_DNSSEC) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth),,-DNO_AUTH) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_ipset),,-DNO_IPSET) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_conntrack),-DHAVE_CONNTRACK,) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_noid),-DNO_ID,) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_broken_rtc),-DHAVE_BROKEN_RTC) \
$(if $(CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_tftp),,-DNO_TFTP)
COPTS += $(if $(CONFIG_LIBNETTLE_MINI),-DNO_GMP,)
else
COPTS += -DNO_AUTH -DNO_IPSET -DNO_ID
endif
MAKE_FLAGS := \
$(TARGET_CONFIGURE_OPTS) \
CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS)" \
COPTS="$(COPTS)" \
PREFIX="/usr"
define Package/dnsmasq/install
$(INSTALL_DIR) $(1)/usr/sbin
$(CP) $(PKG_INSTALL_DIR)/usr/sbin/dnsmasq $(1)/usr/sbin/
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/dhcp.conf $(1)/etc/config/dhcp
$(INSTALL_CONF) ./files/dnsmasq.conf $(1)/etc/dnsmasq.conf
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/dnsmasq.init $(1)/etc/init.d/dnsmasq
$(INSTALL_DIR) $(1)/etc/hotplug.d/dhcp
$(INSTALL_DIR) $(1)/etc/hotplug.d/neigh
$(INSTALL_DIR) $(1)/etc/hotplug.d/ntp
$(INSTALL_DIR) $(1)/etc/hotplug.d/tftp
$(INSTALL_DATA) ./files/dnsmasqsec.hotplug $(1)/etc/hotplug.d/ntp/25-dnsmasqsec
$(INSTALL_DIR) $(1)/usr/share/dnsmasq
$(INSTALL_CONF) ./files/dhcpbogushostname.conf $(1)/usr/share/dnsmasq/
$(INSTALL_CONF) ./files/rfc6761.conf $(1)/usr/share/dnsmasq/
$(INSTALL_DIR) $(1)/usr/lib/dnsmasq
$(INSTALL_BIN) ./files/dhcp-script.sh $(1)/usr/lib/dnsmasq/dhcp-script.sh
$(INSTALL_DIR) $(1)/usr/share/acl.d
$(INSTALL_DATA) ./files/dnsmasq_acl.json $(1)/usr/share/acl.d/
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/50-dnsmasq-migrate-resolv-conf-auto.sh $(1)/etc/uci-defaults
endef
Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install)
define Package/dnsmasq-full/install
$(call Package/dnsmasq/install,$(1))
ifneq ($(CONFIG_PACKAGE_dnsmasq_full_dnssec),)
$(INSTALL_DIR) $(1)/usr/share/dnsmasq
$(INSTALL_CONF) $(PKG_BUILD_DIR)/trust-anchors.conf $(1)/usr/share/dnsmasq
endif
endef
$(eval $(call BuildPackage,dnsmasq))
$(eval $(call BuildPackage,dnsmasq-dhcpv6))
$(eval $(call BuildPackage,dnsmasq-full))
導(dǎo)入mk文件
以include開(kāi)頭,用來(lái)包含源碼已經(jīng)定義好的mk文件,以此來(lái)調(diào)用Openwrt已經(jīng)定義好的語(yǔ)法。
Openwrt已經(jīng)定義好了的文件:
- rules.mk:這個(gè)文件定義了全局的編譯變量,在每一個(gè)軟件包的Makefile文件的第一行均首先包含這個(gè)文件;
- package.mk:軟件包的基本信息PKG_NAME PKG_SOURCE等完成再引入,用于編譯一般的軟件包;
定義變量
Openwrt預(yù)定義了很多變量,這些變量減少了使用者的開(kāi)發(fā)代價(jià),但需要使用者按照語(yǔ)義進(jìn)行使用。
系統(tǒng)變量
下面的變量是定義好了系統(tǒng)變量,實(shí)際工程在使用時(shí)只需要調(diào)用這些變量即可。主要定義了編譯時(shí)使用的系統(tǒng)信息,如頭文件目錄、安裝軟件包的解壓目錄。
變量名 | 定義的文件 | 含義 |
---|---|---|
INCLUDE_DIR | rules.mk | 源代碼頂層目錄下的include目錄 |
BUILD_DIR | rules.mk | 代碼編譯的根目錄,通常為“build_dir/target-*”目錄 |
TARGET_CFLAGS | rules.mk | 指定平臺(tái)的C語(yǔ)言編譯選項(xiàng) |
TARGET_LDFLAGS | rules.mk | 指定目標(biāo)平臺(tái)的編譯鏈接選項(xiàng) |
INSTALL_DIR | rules.mk | 創(chuàng)建目錄,并設(shè)置目錄權(quán)限為0755 |
INSTALL_DATA | rules.mk | 安裝數(shù)據(jù)文件,即復(fù)制并設(shè)置權(quán)限為0644 |
INSTALL_CONF | rules.mk | 安裝配置文件,即復(fù)制并設(shè)置權(quán)限為0600 |
INSTALL_BIN | rules.mk | 安裝可執(zhí)行程序,即復(fù)制并設(shè)置權(quán)限為0755 |
用戶變量
下面的變量是Openwrt預(yù)定義好的部分變量,這些變量減少了使用者的開(kāi)發(fā)代價(jià),但需要使用者按照語(yǔ)義使用。
變量名 | 含義 | 示例 |
---|---|---|
PKG_NAME | 軟件包名稱,可以通過(guò)menuconfig和ipkg看到 | dnsmasq |
PKG_VERSION | 上游軟件的版本號(hào),為2.73 | 2.73 |
PKG_RELEASE | Makefile的版本號(hào) | 1 |
PKG_SOURCE | 原始的源代碼文件名 | |
PKG_SOURCE_URL | 用于下載源碼的地址(目錄) | http://thekelleys.org.uk/dnsmasq |
PKG_HASH | 軟件包的MD5值,用于驗(yàn)證下載的文件是否正確 | 28d52cfc9e2004ac4f85274f52b32e1647b4dbc9761b82e7de1e41c49907eb08 |
PKG_LICENSE | 這個(gè)軟件的許可證,開(kāi)源軟件的許可證以GPL家族最多 | GPL-2.0 |
PKG_LICENSE_FILES | 許可協(xié)議文件,是指代碼目錄下的文件名,一般均為COPYING | COPYING |
PKG_BUILD_DIR | 軟件包的編譯目錄 | |
PKG_INSTALL | 設(shè)置為1將調(diào)用軟件包自己的“make install”, 安裝目錄前綴為PKG_INSTALLDIR | 1 |
PKG_BUILD_PARALLEL | 是否可以并行編譯 | 1 |
PKG_CONFIG_DEPENDS | 編譯依賴,指定那些選項(xiàng)依賴本軟件包 | |
PKG_INSTAll_DIR | 當(dāng)調(diào)用原始軟件包“make install”時(shí)的安裝目錄 | |
PKG_SOURCE_PROTO | 用于下載的傳輸協(xié)議(git、svn),如果為壓縮包則不用指定 | |
PKG_SOURCE_SUBDIR | 下載目錄,如果下載傳輸協(xié)議為“svn”或“git”時(shí)必須指定。 | |
PKG_SOURCE_VERSION | 下載協(xié)議為“git”時(shí)必須指定。指定的提交哈希點(diǎn)將會(huì)被檢出 | |
PKG_MAINTAINER | 維護(hù)者的姓名和郵件地址 | |
PKG_BUILD_DEPENDS | 軟件包編譯依賴,即在這個(gè)包編譯之前編譯,但是在運(yùn)行時(shí)不需要,和DEPENDS有相同的語(yǔ)法 |
軟件包定義
宏定義以Package/開(kāi)頭,Package開(kāi)頭的定義用于make menuconfig選擇及編譯生成軟件包。
Package選項(xiàng)
實(shí)際使用時(shí),**<>**需要替換成軟件包的名稱。
變量名 | 是否必須 | 含義 |
---|---|---|
Package/<> | 是 | 定義軟件包的描述信息,例如網(wǎng)站地址和menuconfig中的菜單分類等 |
Package/<>/Default | 可選 | 軟件包的默認(rèn)選項(xiàng) |
Package/<>/description | 是 | 軟件包的詳細(xì)描述 |
Package/<>/install | 是 | 復(fù)制文件到ipkg目錄中,使用 ( 1 ) 代表 i p k g 的目錄,在源代碼中使用相對(duì)目錄。編譯生成的安裝文件由 (1)代表ipkg的目錄,在源代碼中使用相對(duì)目錄。編譯生成的安裝文件由 (1)代表ipkg的目錄,在源代碼中使用相對(duì)目錄。編譯生成的安裝文件由(PKG_INSTALL_DIR)目錄復(fù)制到ipkg的目錄下 |
Package/<>/config | 可選 | 根據(jù)軟件包的選擇對(duì)編譯選項(xiàng)進(jìn)行定義 |
Package/<>/conffiles | 可選 | 定義本軟件包的運(yùn)行配置文件列表,一行一個(gè)文件 |
Package/<>/preinst | 可選 | 這是在安裝之前實(shí)際執(zhí)行的腳本,需要包含#!/bin/sh。如果需要中止安裝就返回false |
Package/<>/postinst | 可選 | 這是在安裝之后實(shí)際執(zhí)行的腳本,需要包含#!/bin/sh。 |
Package/<>/prerm | 可選 | 這是在刪除之前實(shí)際執(zhí)行的腳本,需要包含#!/bin/sh。如果需要中止安裝就返回false |
Package/<>/postrm | 可選 | 這是在刪除之后實(shí)際執(zhí)行的腳本,需要包含#!/bin/sh。如果需要中止安裝就返回false |
Package變量
軟件包定義還需要定義一些變量,這些參數(shù)傳遞給buildroot進(jìn)行交叉編譯。這些參數(shù)會(huì)在menuconfig里面和實(shí)體的ipkg安裝包中顯示。在軟件包**Package/**定義下需要給下列變量賦值。
- SECTION:軟件包類型,如network、sound、Utilities或Multimedia。
- CATEGORY:在menuconfig中顯示到菜單分類中。
- TITLE:標(biāo)題,是軟件包的簡(jiǎn)短描述。
- URL:軟件包的原始網(wǎng)站網(wǎng)址。
- MAINTAINER:維護(hù)者的姓名和郵件地址。一般為這個(gè)軟件包作者的郵件地址。
- DEPENDS:依賴項(xiàng),需要在本軟件包之前編譯和安裝的軟件包。
構(gòu)建
宏定義以**Build/**開(kāi)頭,這些用于代碼編譯。通常包含準(zhǔn)備(Prepare)、配置(Configure)、編譯(Compile)和安裝(Install)等4步。這部分在構(gòu)建時(shí)都是可選的。
Build步驟 | 是否必須 | 含義 |
---|---|---|
Build/Prepare | 是 | 一組用于解包及打補(bǔ)丁的命令,也可以不使用 |
Build/Configure | 是 | 如果源代碼不需要configure來(lái)生成Makefile或者是通用的configure腳本,就不需要這部分。 |
Build/Compile | 是 | 編譯源代碼,大多數(shù)情況下不用定義而使用默認(rèn)值。如果你想傳遞給make特定的參數(shù),可以使用“$(call Build/Compile/Default, FOO=bar)” |
Build/Install | 是 | 安裝編譯后的文件,默認(rèn)是調(diào)用make install。如果你想傳遞給make特定的參數(shù),可以使用“$(call Build/Compile/Install, FOO=bar)” |
Build/InstallDev | 是 |
BuildPackage
BuildPackage是在頭文件 include/package.mk中定義的。BuildPackage僅需要一個(gè)直接參數(shù)–要編譯的軟件包名稱。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-770701.html
示例
創(chuàng)建一個(gè)自己的軟件包文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-770701.html
到了這里,關(guān)于OpenWrt--軟件包管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!