• openWRT自学---对官方的开发指导文档的解读和理解 记录1:编译一个package


    针对的是:http://kamikaze.openwrt.org/docs/openwrt.html#x1-390002

    1.If you want, you can also modify the kernel config for the selected target system. simply run "make kernel_menuconfig" and the build system will unpack the kernel sources (if necessary), run menuconfig inside of the kernel tree, and then copy the kernel config to target/linux/<platform>/config so that it is preserved over "make clean" calls.  ---- 如果你愿意,你也可以修改内核配置为选定的目标系统简单地运行“make kernel_menuconfig”和构建系统解压缩内核源代码如果有必要。此命令会展示针对内核的配置选择界面然后其结果再复制内核配置到目标/ linux的/<platform>/配置。这样得到的针对内核的.config文件,在"make clean"后依然是保留的。

    2.During the build process, buildroot will download all sources to the "dl" directory and will start patching and compiling them in the "build_dir/<arch> " directory. When finished, the resulting firmware will be in the "bin" directory and packages will be in the "bin/packages" directory -- 在编译过程中buildroot会所有的下载到“dl”目录下,并在“build_dir/<arch>”目录中对它们进行patch和编译完成后,所产生的固件将在“bin”目录,而各个package将在“bin/packages"目录中

    3.openwrt中的一个典型的package目录结构:

    • package/<name>/Makefile  --- 必须存在;其作用是定义下载包和编译包的步骤
    • package/<name>/patches   --- 可有可无;是对所下载包的修复和优化,即补丁
    • package/<name>/files        --- 可有可无;是此包特有的启动脚本和配置文件

    4.openwrt中的一个典型的package目录结构(以backfire的package/bridge-utils为例)。其makefile的内容如下:

    #
    # Copyright (C) 2006-2008 OpenWrt.org
    #
    # This is free software, licensed under the GNU General Public License v2.
    # See /LICENSE for more information.
    #

    include $(TOPDIR)/rules.mk
    include $(INCLUDE_DIR)/kernel.mk

    PKG_NAME:=bridge-utils    //The name of the package, as seen via menuconfig and ipkg。不过我在CPE上使用opkg list命令,看到的是bridge - 1.4-1;而通过make menuconfig看到的是 bridge(在Base System里面)。 此外,在package中有一个bridge-utils;在feeds/package中也有一个。到底这些如何对应呢?
    PKG_RELEASE:=1  //The version of this package Makefile
    PKG_SOURCE_URL:=@SF/bridge  //Where to download the sources from (no trailing slash), you can add multiple download sources by separating them with a and a carriage return. @SF表示从SourceForge下载

    ifeq ($(CONFIG_LINUX_2_4),y)
      PKG_VERSION:=1.0.6
      PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
    endif

    ifeq ($(CONFIG_LINUX_2_6),y)
      PKG_VERSION:=1.4  //The upstream version number that we are downloading
      PKG_MD5SUM:=0182fcac3a2b307113bbec34e5f1c673  //A checksum to validate the download
    endif

    PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz   //The filename of the original sources,这里就是 bridge-utils-1.4.tar.gz

    include $(INCLUDE_DIR)/package.mk  //位于 backfire_10.03/include/package.mk,用于定义任何一个package下载的统一的方式脚本

    define Package/bridge
      SECTION:=net   //The type of package (currently unused)
      CATEGORY:=Base system   //Which menu it appears in menuconfig: Network, Sound, Utilities, Multimedia ...
      TITLE:=Ethernet bridging configuration utility  //A short description of the package
      URL:=http://bridge.sourceforge.net/   //Where to find the original software
    endef

    define Package/bridge/description
     Manage ethernet bridging: a way to connect networks together to
     form a larger network.
    endef

    CONFIGURE_ARGS +=
        --with-linux-headers="$(LINUX_DIR)"

    define Build/Prepare   //这是可选项。A set of commands to unpack and patch the sources. You may safely leave this undefined.
    $(call Build/Prepare/Default)
        ( cd $(PKG_BUILD_DIR) ;    //PKG_BUILD_DIR定义在下载包后将此包解压缩到$(BUILD_DIR)的具体位置。对于此bridge-util包,其位置在backfire_10.03/build_dir/linux-brcm47xx/bridge-utils-1.4 中;同时这就说明用的是package中的,而不是feeds/package中的
            [ -f ./configure ] || {
                ln -sf configure.in configure.ac ;
                autoconf ;
            }
        )
    endef

    define Package/bridge/install
        $(INSTALL_DIR) $(1)/usr/sbin   //$(INSTALL_DIR)即为:install -d -m0755  
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/   //$(INSTALL_BIN)即为: install -m0755
    endef

    $(eval $(call BuildPackage,bridge))   //这是真正开始执行的位置。BuildPackage定义在package.mk中,其调用的参数是bridge。这样就会走到package.mk中的:define BuildPackage
      $(Build/IncludeOverlay)
      $(eval $(Package/Default))
      $(eval $(Package/$(1)))   //对应就是$(Package/bridge),从而又找到package/bridge-utils/Makefile中的 define Package/bridge 位置。

    再举一个稍微复杂的例子,package/dropbear(一个轻量级的ssh客户端与服务端开源),其目录中包含了:files(内含配置文件和启动脚本),patches(内含补丁)和Makefile;如下是Makefile:

    #
    # Copyright (C) 2006-2009 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:=dropbear  //The name of the package, as seen via menuconfig and ipkg
    PKG_VERSION:=0.52  //The upstream version number that we are downloading
    PKG_RELEASE:=4  //The version of this package Makefile

    PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz   //The filename of the original sources,这里就是 dropbear-0.52.tar.gz
    PKG_SOURCE_URL:=      //下载源码包的url地址,这里就写了多个地址,用回车换行+一个斜杠来排列表示
        http://matt.ucc.asn.au/dropbear/releases/
        http://www.mirrors.wiretapped.net/security/cryptography/apps/ssh/dropbear/
    PKG_MD5SUM:=1c69ec674481d7745452f68f2ea5597e  //MD5校验和

    include $(INCLUDE_DIR)/package.mk  //实际是include了 backfire_10.03/include/package.mk

    define Package/dropbear/Default
      URL:=http://matt.ucc.asn.au/dropbear/  //Where to find the original software
    endef

    define Package/dropbear   //由 BuildPackage 命令调用
      $(call Package/dropbear/Default)
      SECTION:=net  //The type of package (currently unused)
      CATEGORY:=Base system  //Which menu it appears in menuconfig: Network, Sound, Utilities, Multimedia ...
      TITLE:=Small SSH2 client/server  //A short description of the package
    endef

    define Package/dropbear/description
     A small SSH2 server/client designed for small memory environments.
    endef

    define Package/dropbear/conffiles  //此项可选,A list of config files installed by this package, one file per line.表示此package会安装的一些配置文件
    /etc/dropbear/dropbear_rsa_host_key
    /etc/dropbear/dropbear_dss_host_key
    /etc/config/dropbear
    endef

    define Package/dropbearconvert   //这是另一个package,也是从dropbear的源码包里面会得到的。
      $(call Package/dropbear/Default)
      SECTION:=utils
      CATEGORY:=Utilities
      TITLE:=Utility for converting SSH keys
    endef

    CONFIGURE_ARGS +=
        --with-shared
        --disable-pam
        --enable-openpty
        --enable-syslog
        $(if $(CONFIG_SHADOW_PASSWORDS),,--disable-shadow)
        --disable-lastlog
        --disable-utmp
        --disable-utmpx
        --disable-wtmp
        --disable-wtmpx
        --disable-loginfunc
        --disable-pututline
        --disable-pututxline
        --disable-zlib

    define Build/Configure  //此项可选。用于编译时传递一些自定义参数
        $(SED) 's,^/* #define PKG_MULTI.*,#define PKG_MULTI,g' $(PKG_BUILD_DIR)/options.h
        $(SED) 's,^#define DO_HOST_LOOKUP,/* & */,g' $(PKG_BUILD_DIR)/options.h
        $(call Build/Configure/Default)
    endef

    define Build/Compile  //此项可选。表示如何编译源码包
        $(MAKE) -C $(PKG_BUILD_DIR)
            $(TARGET_CONFIGURE_OPTS)
            LD="$(TARGET_CC)"
            PROGRAMS="dropbear dbclient dropbearkey scp"
            MULTI=1 SCPPROGRESS=1
        $(MAKE) -C $(PKG_BUILD_DIR)
            $(TARGET_CONFIGURE_OPTS)
            LD="$(TARGET_CC)"
            PROGRAMS="dropbearconvert"
    endef

    define Package/dropbear/install  //A set of commands to copy files out of the compiled source and into the ipkg which is represented by the $(1) directory
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dropbearmulti $(1)/usr/sbin/dropbear
        $(INSTALL_DIR) $(1)/usr/bin
        ln -sf ../sbin/dropbear $(1)/usr/bin/scp
        ln -sf ../sbin/dropbear $(1)/usr/bin/ssh
        ln -sf ../sbin/dropbear $(1)/usr/bin/dbclient
        ln -sf ../sbin/dropbear $(1)/usr/bin/dropbearkey
        $(INSTALL_DIR) $(1)/etc/config
        $(INSTALL_DATA) ./files/dropbear.config $(1)/etc/config/dropbear
        $(INSTALL_DIR) $(1)/etc/init.d
        $(INSTALL_BIN) ./files/dropbear.init $(1)/etc/init.d/dropbear
        $(INSTALL_DIR) $(1)/usr/lib/opkg/info
        $(INSTALL_DIR) $(1)/etc/dropbear
        touch $(1)/etc/dropbear/dropbear_rsa_host_key
        touch $(1)/etc/dropbear/dropbear_dss_host_key
    endef

    define Package/dropbearconvert/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dropbearconvert $(1)/usr/bin/dropbearconvert
    endef

    $(eval $(call BuildPackage,dropbear))  //调用package.mk中的BuildPackage,开始编译dropbear
    $(eval $(call BuildPackage,dropbearconvert))  //调用package.mk中的BuildPackage,开始编译dropbearconvert

    在你创建你的 package/<NAME>/ Makefile文件后新的软件包会自动下一次运行make menuconfig时”,出现在菜单中。如果选中,此该package将在下一次make中被自动编译

  • 相关阅读:
    利用 PHP 导出 Git 某个分支下,新增或修改过的文件
    [翻译] 10 个实用的 Git 高级命令
    Django web project
    install virtualenv
    js原型继承
    HTML 学习杂记
    IDEA 文件列表隐藏某后缀文件
    coocsCreator杂记
    mac install brew
    c编程:输入一个数字n,则n代表n行,每行输入2个数字a,b计算每行的a+b问题。
  • 原文地址:https://www.cnblogs.com/lagujw/p/3661375.html
Copyright © 2020-2023  润新知