2.9. 自定义包目录

在一些具体应用中,用户可能需要在 SDK 之外自行管理自主开发的一些模块和应用,包括使用独立的仓库进行版本管理, 同时又能方便的接入 Luban SDK 进行编译,例如:

LUBAN_SDK/
        ├── dl
        ├── Makefile
        ├── output
        ├── package
        ├── prebuilt
        ├── source
        ├── target
        ├── toolchain
        └── tools

MYCOMPANY/
        ├── package/
        │       ├── mod1
        │       ├── mod2
        │       └── app1
        └── source
                ├── mod1
                ├── mod2
                └── app1

上述例子中,MYCOMPANY 目录并不属于 LUBAN_SDK 的一部分,可以独立管理相关的包配置和源码,但是这些包可以与 LUBAN_SDK 中的其他包一样使用相同的规则进行添加和编译。

这种方案在 Buildroot 中称为 External 配置,当前 Luban SDK 支持这种设置,并且提供了相关的参考设置。

注解

MYCOMPANY 目录可以放在任意其他目录,建议放在与 LUBAN_SDK 同级或者 LUBAN_SDK 的根目录。

2.9.1. 步骤1:建立 External Tree

上述举例中的 MYCOMPANY 目录称之为 External Tree, 建立这样的一个 Tree 需要遵循一定的规则,为了方便修改,这里提供了一个 Example, 用户可参考 Example 创建自己的 Tree。

package/external/example_tree/
├── Config.in
├── external.desc
├── external.mk
├── package
│   └── example_mod
│       ├── Config.in
│       └── example_mod.mk
└── source
        └── example_mod
                ├── CMakeLists.txt
                └── main.c
  1. 复制 “package/external/example_tree”,命令为 “MYCOMPANY” (具体名字用户自定义,但是名字应该只包含大小写字母、数字、下划线)。

    例如 MYCOMPANY Tree 与 LUBAN_SDK 并列

    LUBAN_SDK/
    MYCOMPANY/
    
  2. 修改 MYCOMPANY/external.desc

    name: EXAMPLE_TREE
    desc: Exampe External Tree
    

    external.desc 中有两个配置项,name 需要改为与 MYCOMPANY 目录相同的名称,最好是大写;desc 可以填写上简要的描述,应为 ASCII 字符。 如修改为:

    name: MYCOMPANY
    desc: Packages for MyCompany
    
  3. 修改 MYCOMPANY/external.mk

    external.mk 中需要将 BR2_EXTERNAL_EXAMPLE_TREE_PATH 修改为与新目录相匹配的名字。

    include $(sort $(wildcard $(BR2_EXTERNAL_EXAMPLE_TREE_PATH)/package/*/*.mk))
    

    修改为:

    include $(sort $(wildcard $(BR2_EXTERNAL_MYCOMPANY_PATH)/package/*/*.mk))
    
  4. 修改 MYCOMPANY/Config.in

    Config.in 中需要将 BR2_EXTERNAL_EXAMPLE_TREE_PATH 修改为与新目录相匹配的名字。

    menu "Example"
    
    source "$BR2_EXTERNAL_EXAMPLE_TREE_PATH/package/example_mod/Config.in"
    
    endmenu
    

    修改为:

    menu "MyCompany"
    
    source "$BR2_EXTERNAL_MYCOMPANY_PATH/package/example_mod/Config.in"
    
    endmenu
    

2.9.2. 步骤2:添加源码包

添加一个 MYCOMPANY Tree 中的源码包,分两个步骤:

  1. 在 MYCOMPANY/package/ 下添加新包的编译配置

    参考 MYCOMPANY/package/example_mod 可以添加一个新包的配置。当然也可以使用其他的编译方式,如 autotools 等,具体规则与 Luban SDK 中的其他包相同。

  2. 在 MYCOMPANY/source/ 下添加新包的源码

    参考 MYCOMPANY/source/example_mod 可以添加一个新包的源码。 注意相关源码包名字应该与 package 下的包名字相同,如果包配置中有配置版本号,则源码目录的名字应为 MYCOMPANY/source/example_mod-<ver>。 同时,此目录仅保存源码,编译的输出放在具体的 build 目录下,具体规则与 SDK 其他包相同。

2.9.3. 步骤3:添加到 SDK

复制 package/external/external.mk 到 LUBAN_SDK 根目录 LUBAN_SDK/external.mk,然后在里面添加

LUBAN_EXTERNAL=../MYCOMPANY

此处可以写绝对路径,也可以写相对路径。

2.9.4. 步骤4:配置和编译

配置,使用命令:

make xxx_defconfig
make menuconfig

应用了某个项目配置之后,进入 menuconfig 可看到

Target options  --->
Toolchain  --->
Build options  --->
System configuration  --->
Filesystem images  --->
BootLoader  --->
Linux kernel  --->
ArtInChip packages  --->
Vendor packages  --->
Third-party packages  --->
Host utilities  --->
Firmwares  ----
External options  --->

顶层目录中的 External options ,进去则可以看到相关包的配置。

编译,方法与 SDK 其他包一致。