本帖最后由 liaoya 于 2021-3-1 10:30 编辑
下面是如何在Ubuntu 18.04或者20.04上使用OpenWRT官方的SDK编译第三方ipk。很抱歉无法把每一个细节都阐述出来,还是去看我的代码吧,https://github.com/liaoya/openwrt-scripts/sdk
首先在Ubuntu上安装必要的软件包
- sudo apt update
- sudo apt install build-essential ccache ecj fastjar file g++ gawk \
- gettext git java-propose-classpath libelf-dev libncurses5-dev \
- libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
- python3-distutils python3-setuptools rsync subversion swig time \
- xsltproc zlib1g-dev
复制代码
下面以armvirt编译为例,首先下载https://mirrors.cloud.tencent.co ... Linux-x86_64.tar.xz。
- 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,然后进入该目录,准备添加第三方源码
- # 用github代替官方仓库
- sed -e 's|git.openwrt.org/openwrt/openwrt|github.com/openwrt/openwrt|g' \
- -e 's|git.openwrt.org/feed/packages|github.com/openwrt/packages|g' \
- -e 's|git.openwrt.org/project/luci|github.com/openwrt/luci|g' \
- -e 's|git.openwrt.org/feed/telephony|github.com/openwrt/telephony|g' \
- -i "${SDK_DIR}"/feeds.conf.default
- echo "src-git Lienol https://github.com/Lienol/openwrt-package" >>feeds.conf.default
- # 请修正"打倒美帝",可以参考代码
- echo "src-git xiaorouji https://github.com/xiaorouji/openwrt-打倒美帝" >>feeds.conf.default
- echo "src-git fw876 https://github.com/fw876/helloworld" >>feeds.conf.default
- echo "src-git kenzok8 https://github.com/kenzok8/openwrt-packages" >>feeds.conf.default
- echo "src-git small https://github.com/kenzok8/small" >>feeds.conf.default
- echo "src-git liuran001 https://github.com/liuran001/openwrt-packages;packages-19.07" >>feeds.conf.default
- # 如果存在upx,使用upx压缩违禁软件
- mkdir -p staging_dir/host/bin
- if [[ $(command -v upx) && ! -L staging_dir/host/bin/upx ]]; then ln -s "$(command -v upx)" staging_dir/host/bin; fi
- if [[ $(command -v upx-ucl) && ! -L staging_dir/host/bin/upx-ucl ]]; then ln -s "$(command -v upx-ucl)" staging_dir/host/bin; fi
- # 你需要非常好的网络访问github.com
- scripts/feeds clean
- ./scripts/feeds update -a || true
- ./scripts/feeds install -a || true
- rm -fr .config ./tmp
- # 如果你不知道下面怎么做,暂时还是不要自己做编译吧,回去补补相关知识
- make defconfig
复制代码 做完 make deconfig运行下面命令进行编译,然后等上若干小时就可以了,当然不保证所有的软件包都能够编译成功,而且来自多个仓库的同一个软件会被多次编译,这个没有优化(因为我不知道那个更好)。
- make -j"$(nproc)" package/feeds/luci/luci-base/compile
- for src_dir in package/feeds/*; do
- [[ -d "${src_dir}" ]] || continue
- _build=1
- for official in base luci packages routing telephony; do
- if [[ ${src_dir} == "package/feeds/$official" || ${src_dir} == "package/feeds/$official/" ]]; then
- _build=0
- break
- fi
- done
- if [[ "${_build}" -gt 0 ]]; then
- for pkg in "${src_dir}"/*; do
- [[ -d ${pkg} ]] || continue
- make -j"$(nproc)" "${pkg}"/compile || true
- done
- fi
- done
复制代码
编译完了你可能需要找到这些ipk,用下面的脚本吧
- declare -a PACKAGES=()
- for src_dir in package/feeds/*; do
- [[ -d "${src_dir}" ]] || continue
- _build=1
- for official in base luci packages routing telephony; do
- if [[ ${src_dir} == "${SRC}/package/feeds/$official" || ${src_dir} == "${SRC}/package/feeds/$official/" ]]; then
- _build=0
- break
- fi
- done
- if [[ "${_build}" -gt 0 ]]; then
- for pkg in "${src_dir}"/*; do
- [[ -d ${pkg} ]] || continue
- pkg=$(basename "${pkg}")
- PACKAGES=(${PACKAGES[@]} "${pkg}")
- if [[ ${pkg} =~ luci-app* ]]; then
- pkg=${pkg/luci-app/luci-i18n}
- PACKAGES=(${PACKAGES[@]} "${pkg}")
- fi
- done
- fi
- done
- for name in "${PACKAGES[@]}"; do
- while IFS= read -r -d '' pkg; do
- ls -1 "${pkg}"
- done < <(find "${SRC}/bin" -iname "*$name*.ipk" -print0)
- done
复制代码 而且请注意官方的SS版本要老一些。请自己想办法解决。
然后你需要创建自己的ipk的仓库,我们先要准备两个程序
- gcc -s -o mkhash ./scripts/mkhash.c
- sudo mv mkhash /usr/local/bin
复制代码- cat <<'EOF' | tee ipkg-make-index.sh
- #!/usr/bin/env bash
- #shellcheck disable=SC2006,SC2086
- set -e
- pkg_dir=$1
- if [ -z $pkg_dir ] || [ ! -d $pkg_dir ]; then
- echo "Usage: ipkg-make-index <package_directory>" >&2
- exit 1
- fi
- empty=1
- for pkg in $(find $pkg_dir -name '*.ipk' | sort); do
- empty=
- name="${pkg##*/}"
- name="${name%%_*}"
- [[ "$name" = "kernel" ]] && continue
- [[ "$name" = "libc" ]] && continue
- echo "Generating index for package $pkg" >&2
- file_size=$(stat -L -c%s $pkg)
- sha256sum=$(mkhash sha256 $pkg)
- # Take pains to make variable value sed-safe
- # sed_safe_pkg=$(echo $pkg | sed -e 's/^\.\///g' -e 's/\\//\\\\\\//g')
- sed_safe_pkg=$(echo $pkg | sed -e 's/^\.\///g')
- tar -xzOf $pkg ./control.tar.gz | tar xzOf - ./control | sed -e "s/^Description:/Filename: $sed_safe_pkg\\
- Size: $file_size\\
- SHA256sum: $sha256sum\\
- Description:/"
- echo ""
- done
- EOF
- sudo mv ipkg-make-index.sh /usr/local/bin
复制代码 用下面的命令创建ipk仓库
- declare -a PACKAGES=()
- for src_dir in package/feeds/*; do
- [[ -d "${src_dir}" ]] || continue
- _build=1
- for official in base luci packages routing telephony; do
- if [[ ${src_dir} == "${SRC}/package/feeds/$official" || ${src_dir} == "${SRC}/package/feeds/$official/" ]]; then
- _build=0
- break
- fi
- done
- if [[ "${_build}" -gt 0 ]]; then
- for pkg in "${src_dir}"/*; do
- [[ -d ${pkg} ]] || continue
- pkg=$(basename "${pkg}")
- PACKAGES=(${PACKAGES[@]} "${pkg}")
- if [[ ${pkg} =~ luci-app* ]]; then
- pkg=${pkg/luci-app/luci-i18n}
- PACKAGES=(${PACKAGES[@]} "${pkg}")
- fi
- done
- fi
- done
- DEST=/tmp/armvirt
- for name in "${PACKAGES[@]}"; do
- while IFS= read -r -d '' pkg; do
- cp -pr "${pkg}" "${DEST}"
- done < <(find bin -iname "*$name*.ipk" -print0)
- done
- (
- cd "${DEST}"
- rm -fr libopenssl*
- ipkg-make-index.sh . >Packages && gzip -9nc Packages >Packages.gz
- )
复制代码
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|