找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 2384|回复: 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. )
复制代码



谢谢分享!
回复

使用道具 举报

非常感谢,正需要思考
回复

使用道具 举报

没有对应SDK怎么编译ipk?没找到LEDE的固件对应的SDK
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-5-22 14:00

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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