openwrt目录结构图

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))

编译流程图

openwrt系统编译框架

相关文章:

  • 2021-11-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-26
  • 2021-12-08
  • 2021-10-05
  • 2021-12-24
猜你喜欢
  • 2021-04-24
  • 2022-12-23
  • 2021-08-14
  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案