找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 2296|回复: 3

如何使用OpenWRT官方的SDK编译第三方ipk

[复制链接]
本帖最后由 liaoya 于 2021-3-1 10:30 编辑

下面是如何在Ubuntu 18.04或者20.04上使用OpenWRT官方的SDK编译第三方ipk。很抱歉无法把每一个细节都阐述出来,还是去看我的代码吧,https://github.com/liaoya/openwrt-scripts/sdk

首先在Ubuntu上安装必要的软件包
  1. sudo apt update
  2. sudo apt install build-essential ccache ecj fastjar file g++ gawk \
  3. gettext git java-propose-classpath libelf-dev libncurses5-dev \
  4. libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
  5. python3-distutils python3-setuptools rsync subversion swig time \
  6. xsltproc zlib1g-dev
复制代码

下面以armvirt编译为例,首先下载https://mirrors.cloud.tencent.co ... Linux-x86_64.tar.xz
  1. curl -sL -o - https://mirrors.cloud.tencent.com/openwrt/releases/19.07.7/targets/armvirt/64/openwrt-sdk-19.07.7-armvirt-64_gcc-7.5.0_musl.Linux-x86_64.tar.xz | tar -I xz -xf -
复制代码
然后会得到一个目录openwrt-sdk-19.07.7-armvirt-64_gcc-7.5.0_musl.Linux-x86_64,然后进入该目录,准备添加第三方源码
  1. # 用github代替官方仓库
  2. sed -e 's|git.openwrt.org/openwrt/openwrt|github.com/openwrt/openwrt|g' \
  3.     -e 's|git.openwrt.org/feed/packages|github.com/openwrt/packages|g' \
  4.     -e 's|git.openwrt.org/project/luci|github.com/openwrt/luci|g' \
  5.     -e 's|git.openwrt.org/feed/telephony|github.com/openwrt/telephony|g' \
  6.     -i "${SDK_DIR}"/feeds.conf.default

  7. echo "src-git Lienol https://github.com/Lienol/openwrt-package" >>feeds.conf.default
  8. # 请修正"打倒美帝",可以参考代码
  9. echo "src-git xiaorouji https://github.com/xiaorouji/openwrt-打倒美帝" >>feeds.conf.default
  10. echo "src-git fw876 https://github.com/fw876/helloworld" >>feeds.conf.default
  11. echo "src-git kenzok8 https://github.com/kenzok8/openwrt-packages" >>feeds.conf.default
  12. echo "src-git small https://github.com/kenzok8/small" >>feeds.conf.default
  13. echo "src-git liuran001 https://github.com/liuran001/openwrt-packages;packages-19.07" >>feeds.conf.default

  14. # 如果存在upx,使用upx压缩违禁软件
  15. mkdir -p staging_dir/host/bin
  16. if [[ $(command -v upx) && ! -L staging_dir/host/bin/upx ]]; then ln -s "$(command -v upx)" staging_dir/host/bin; fi
  17. if [[ $(command -v upx-ucl) && ! -L staging_dir/host/bin/upx-ucl ]]; then ln -s "$(command -v upx-ucl)" staging_dir/host/bin; fi

  18. # 你需要非常好的网络访问github.com
  19. scripts/feeds clean
  20. ./scripts/feeds update -a || true

  21. ./scripts/feeds install -a || true
  22. rm -fr .config ./tmp

  23. # 如果你不知道下面怎么做,暂时还是不要自己做编译吧,回去补补相关知识
  24. make defconfig
复制代码
做完 make deconfig运行下面命令进行编译,然后等上若干小时就可以了,当然不保证所有的软件包都能够编译成功,而且来自多个仓库的同一个软件会被多次编译,这个没有优化(因为我不知道那个更好)。
  1. make -j"$(nproc)" package/feeds/luci/luci-base/compile

  2. for src_dir in package/feeds/*; do
  3.     [[ -d "${src_dir}" ]] || continue
  4.     _build=1
  5.     for official in base luci packages routing telephony; do
  6.         if [[ ${src_dir} == "package/feeds/$official" || ${src_dir} == "package/feeds/$official/" ]]; then
  7.             _build=0
  8.             break
  9.         fi
  10.     done
  11.     if [[ "${_build}" -gt 0 ]]; then
  12.         for pkg in "${src_dir}"/*; do
  13.             [[ -d ${pkg} ]] || continue
  14.             make -j"$(nproc)" "${pkg}"/compile || true
  15.         done
  16.     fi
  17. done
复制代码

编译完了你可能需要找到这些ipk,用下面的脚本吧
  1. declare -a PACKAGES=()

  2. for src_dir in package/feeds/*; do
  3.     [[ -d "${src_dir}" ]] || continue
  4.     _build=1
  5.     for official in base luci packages routing telephony; do
  6.         if [[ ${src_dir} == "${SRC}/package/feeds/$official" || ${src_dir} == "${SRC}/package/feeds/$official/" ]]; then
  7.             _build=0
  8.             break
  9.         fi
  10.     done
  11.     if [[ "${_build}" -gt 0 ]]; then
  12.         for pkg in "${src_dir}"/*; do
  13.             [[ -d ${pkg} ]] || continue
  14.             pkg=$(basename "${pkg}")
  15.             PACKAGES=(${PACKAGES[@]} "${pkg}")
  16.             if [[ ${pkg} =~ luci-app* ]]; then
  17.                 pkg=${pkg/luci-app/luci-i18n}
  18.                 PACKAGES=(${PACKAGES[@]} "${pkg}")
  19.             fi
  20.         done
  21.     fi
  22. done

  23. for name in "${PACKAGES[@]}"; do
  24.     while IFS= read -r -d '' pkg; do
  25.         ls -1 "${pkg}"
  26.     done < <(find "${SRC}/bin" -iname "*$name*.ipk" -print0)
  27. done
复制代码
而且请注意官方的SS版本要老一些。请自己想办法解决。

然后你需要创建自己的ipk的仓库,我们先要准备两个程序
  1. gcc -s -o mkhash ./scripts/mkhash.c
  2. sudo mv mkhash /usr/local/bin
复制代码
  1. cat <<'EOF' | tee ipkg-make-index.sh
  2. #!/usr/bin/env bash
  3. #shellcheck disable=SC2006,SC2086
  4. set -e

  5. pkg_dir=$1

  6. if [ -z $pkg_dir ] || [ ! -d $pkg_dir ]; then
  7.     echo "Usage: ipkg-make-index <package_directory>" >&2
  8.     exit 1
  9. fi

  10. empty=1

  11. for pkg in $(find $pkg_dir -name '*.ipk' | sort); do
  12.     empty=
  13.     name="${pkg##*/}"
  14.     name="${name%%_*}"
  15.     [[ "$name" = "kernel" ]] && continue
  16.     [[ "$name" = "libc" ]] && continue
  17.     echo "Generating index for package $pkg" >&2
  18.     file_size=$(stat -L -c%s $pkg)
  19.     sha256sum=$(mkhash sha256 $pkg)
  20.     # Take pains to make variable value sed-safe
  21.     # sed_safe_pkg=$(echo $pkg | sed -e 's/^\.\///g' -e 's/\\//\\\\\\//g')
  22.     sed_safe_pkg=$(echo $pkg | sed -e 's/^\.\///g')
  23.     tar -xzOf $pkg ./control.tar.gz | tar xzOf - ./control | sed -e "s/^Description:/Filename: $sed_safe_pkg\\
  24. Size: $file_size\\
  25. SHA256sum: $sha256sum\\
  26. Description:/"
  27.     echo ""
  28. done
  29. EOF

  30. sudo mv ipkg-make-index.sh /usr/local/bin
复制代码
用下面的命令创建ipk仓库
  1. declare -a PACKAGES=()

  2. for src_dir in package/feeds/*; do
  3.     [[ -d "${src_dir}" ]] || continue
  4.     _build=1
  5.     for official in base luci packages routing telephony; do
  6.         if [[ ${src_dir} == "${SRC}/package/feeds/$official" || ${src_dir} == "${SRC}/package/feeds/$official/" ]]; then
  7.             _build=0
  8.             break
  9.         fi
  10.     done
  11.     if [[ "${_build}" -gt 0 ]]; then
  12.         for pkg in "${src_dir}"/*; do
  13.             [[ -d ${pkg} ]] || continue
  14.             pkg=$(basename "${pkg}")
  15.             PACKAGES=(${PACKAGES[@]} "${pkg}")
  16.             if [[ ${pkg} =~ luci-app* ]]; then
  17.                 pkg=${pkg/luci-app/luci-i18n}
  18.                 PACKAGES=(${PACKAGES[@]} "${pkg}")
  19.             fi
  20.         done
  21.     fi
  22. done

  23. DEST=/tmp/armvirt
  24. for name in "${PACKAGES[@]}"; do
  25.     while IFS= read -r -d '' pkg; do
  26.         cp -pr "${pkg}" "${DEST}"
  27.     done < <(find bin -iname "*$name*.ipk" -print0)
  28. done
  29. (
  30.     cd "${DEST}"
  31.     rm -fr libopenssl*
  32.     ipkg-make-index.sh . >Packages && gzip -9nc Packages >Packages.gz
  33. )
复制代码



我的恩山、我的无线 The best wifi forum is right here.
谢谢分享!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

非常感谢,正需要学习
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

没有对应SDK怎么编译ipk?没找到LEDE的固件对应的SDK
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-30 01:25

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表