openwrt目录结构图
目录结构说明
SDK:开源openwrt源代码根目录
SDK/package:软件包顶层目录
SDK/staging_dir:工具链存放路径
SDK/build_dir:实际编译路径
SDK/package/xxx_package:特定的软件包
SDK/package /xxx_package/patches:存放针对指定软件包patch的文件夹
SDK/package /xxx_package/src:存放.c .h已经符合openwrt规范的基础makefile文件
SDK/package /xxx_package/Makefile:用于构建编译src路径下源文件环境
Openwrt系统编译规则
Openwrt系统编译架构由一套编译规则实现,正是由于这套规则,开发者可以方便编写跨平台的软件包以及易于支持跨平台的开源软件包。
主要规则说
SDK/rules.mk:主要定义编译工具链相关宏、公共路径宏、常用编译选项
SDK/include/autotools.mk:主要实现autoconf相关的一些逻辑
SDK/include/package.mk:主要实现编译过程中用到的各种宏
SDK/include/package-defaults.mk:定义部分编译默认宏,当软件包没指定时,使用此规则里面的宏
基于openwrt系统编译iproute2
Makefile文件及分析如下
include $(TOPDIR)/rules.mk #引用rules.mk,通用规则用户态软件包均需引用
PKG_NAME:=iproute2 #包名,用户自定义
PKG_VERSION:=4.0.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=http://kernel.org/pub/linux/utils/net/iproute2/#iproute2源码下载地址
PKG_MD5SUM:=3adc263ade4ee76c35032e8f50b54108
PKG_BUILD_PARALLEL:=1
PKG_LICENSE:=GPL-2.0
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk #引用package.mk,用户态软件包均需引用
define Package/iproute2/Default
TITLE:=Routing control utility ($(2))
SECTION:=net
CATEGORY:=Network
URL:=http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2
SUBMENU:=Routing and Redirection
MAINTAINER:=Russell Senior <[email protected]>
DEPENDS:= +libnl-tiny
VARIANT:=$(1)
endef
define Package/ip
$(callPackage/iproute2/Default,tiny,Minimal)
CONFLICTS:=ip-full
endef
Package/ip-full=$(call Package/iproute2/Default,full,Full)
define Package/ip/conffiles
/etc/iproute2/rt_tables
endef
definePackage/ip-$(BUILD_VARIANT)/conffiles
$(Package/ip/conffiles)
endef
define Package/tc
$(call Package/iproute2/Default)
TITLE:=Traffic control utility
DEPENDS:=+kmod-sched-core
endef
define Package/genl
$(call Package/iproute2/Default)
TITLE:=General netlink utility frontend
endef
define Package/ip-bridge
$(call Package/iproute2/Default)
TITLE:=Bridge configuration utility from iproute2
endef
define Package/ss
$(call Package/iproute2/Default)
TITLE:=Socket statistics utility
endef
ifeq ($(BUILD_VARIANT),tiny)
IP_CONFIG_TINY:=y
endif
define Build/Configure
$(SED) "s,-I/usr/include/db3,," $(PKG_BUILD_DIR)/Makefile
$(SED) "s,^KERNEL_INCLUDE.*,KERNEL_INCLUDE=$(LINUX_DIR)/include,"\
$(PKG_BUILD_DIR)/Makefile
$(SED)"s,^LIBC_INCLUDE.*,LIBC_INCLUDE=$(STAGING_DIR)/include," \
$(PKG_BUILD_DIR)/Makefile
echo "static const char SNAPSHOT[] =\"$(PKG_VERSION)-$(PKG_RELEASE)-openwrt\";" \
>$(PKG_BUILD_DIR)/include/SNAPSHOT.h
endef
ifdef CONFIG_USE_GLIBC
TARGET_CFLAGS += -DHAVE_SETNS
endif
ifdef CONFIG_USE_MUSL
TARGET_CFLAGS += -DHAVE_SETNS
endif
TARGET_CFLAGS += -ffunction-sections-fdata-sections
MAKE_FLAGS += \
EXTRA_CCOPTS="$(TARGET_CFLAGS) -I../include-I$(STAGING_DIR)/usr/include/libnl-tiny" \
KERNEL_INCLUDE="$(LINUX_DIR)/include" \
SHARED_LIBS="" \
LDFLAGS="-Wl,--gc-sections" \
IP_CONFIG_TINY=$(IP_CONFIG_TINY) \
FPIC="$(FPIC)"
define Build/Compile
+$(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS)
endef
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include
$(CP) $(PKG_BUILD_DIR)/include/libnetlink.h $(1)/usr/include/
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_BUILD_DIR)/lib/libnetlink.a $(1)/usr/lib/
endef
define Package/ip/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/iproute2
$(INSTALL_DATA) $(PKG_BUILD_DIR)/etc/iproute2/rt_tables$(1)/etc/iproute2
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ip/ip $(1)/usr/sbin/
endef
define Package/ip-$(BUILD_VARIANT)/install
$(Package/ip/install)
endef
define Package/tc/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tc/tc $(1)/usr/sbin/
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_BIN) ./files/15-teql $(1)/etc/hotplug.d/iface/
endef
define Package/genl/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/genl/genl $(1)/usr/sbin/
endef
define Package/ip-bridge/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bridge/bridge $(1)/usr/sbin/
endef
define Package/ss/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/misc/ss $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,ip)) # BuildPackage 定义在package.mk中,此宏实现
#download,patch,configure,compile,install
$(eval $(call BuildPackage,ip-full))
$(eval $(call BuildPackage,tc))
$(eval $(call BuildPackage,genl))
$(eval $(call BuildPackage,ip-bridge))
$(eval $(call BuildPackage,ss))
编译流程图