diff --git a/amd64/additional-base-lib/build.sh b/amd64/additional-base-lib/build.sh new file mode 100755 index 0000000..8adfc80 --- /dev/null +++ b/amd64/additional-base-lib/build.sh @@ -0,0 +1,300 @@ +#!/bin/bash +# Special thank to Shiroko, he give me the insight of coding in proper way + +################################# Here we import our tools +source /opt/bashimport/sbs-utils.bashimport +source /opt/bashimport/sbs-build-helper.bashimport + +if [ "$1" = "amd64" ] || [ "$1" = "x64" ];then +ARCH="amd64" +ARCH_ANOTHERWAY="-amd64" +ARCH_STORE_PATH="amd64-store" +elif [ "$1" = "arm64" ] || [ "$1" = "arm" ];then +ARCH="arm64" +ARCH_ANOTHERWAY="-aarch64" +ARCH_STORE_PATH="arm64-store" +elif [ "$1" = "loong64" ];then +ARCH="loong64" +ARCH_ANOTHERWAY="-loong64" +ARCH_STORE_PATH="loong64-store" +else +log.error "Err:Invalid Architecture" +exit 1 +fi + +################################# Here we set the configs +REALPATH=`realpath $0` +HERE_PATH=`dirname $REALPATH` +REPO_PATH="${REPO_PATH:-/root/store-dir/}" +WORKDIR=`mktemp -d` +ARCH="" # Define it later +ARCH_ANOTHERWAY="" # Define it later + +PKG_NAME="additional-base-lib" +APP_NAME="附加基础库 Additional Base Lib" +SOURCE_LIST_FILE="" +GITHUB_REPO="" +VERSION="" #Here we use other way to get version so do not write here +TAGS="ubuntu;deepin;uos;community" +CATAGORY="tools" #https://gitee.com/deepin-community-store/spark-store/blob/dev/DOCS/spk-doc.md +DETAIL="内置glibc和libstdc++\n其实原理还是我们最爱的bwrap,创建一个容器把libc和ld.so替换掉,就这么简单(bwrap真是为大家节约了不少生命)。此外用了一点小技巧让大家仍然可以自己\n设置LD_LIBRARY_PATH变量来寻找自己安装的动态库。选用的glibc和libstdc++是从debian bookworm(debian 12,目前是测试版)上下载的,支持到GLIBC_2.36、GLIBCXX_3.4.30。\n安装:下载解压得到deb包,打开终端,输入 sudo apt install ,输入空格后在文件管理器里用鼠标按住deb包拖拽过去,然后按回车。\n使用:安装好了后,在终端运行不兼容的软件时,只需要在前面加上ablrun和空格就可以了。ablrun [命令]\n删除:sudo apt remove additional-base-lib\n注意事项:\n1、所有gcc库中我只加入了libstdc++(毕竟比较常用)。如果需要其他比如objective-c,fortran,d等语言的标准库,可以留言\n2、应该能在其他基于debian的发行版上运行,但是我还没测试\n3、由于包括的库比较少,只能解决部分兼容问题。但是通过学习,大家能解决所有常见问题。(可以看我之前的帖子:https://bbs.deepin.org/post/256081)\n4、不能保证程序没有故障,各位需要为自己系统的安全负责" # This should be written as json format +MAINTAINER="wcbing" +HOMEPAGE="https://github.com/wcbing/frp-debs" + +STORE_APP_PATH="${REPO_PATH}/${ARCH_STORE_PATH}/${CATAGORY}/${PKG_NAME}/" +################################# Fill the variables below only if you use write_control function + +SECTION="" +PRIORITY="" +DEPENDS="" +DESCRIPTION_SHORT="" +DESCRIPTION_LONG="" +PROVIDES="" +REPLACES="" +RECOMMENDS="" + + + + +function prepare(){ + aptss_get_update + ABL_VERSION="9" + PKG_VER_APTSS=`get_version_from_source_list_file ${PKG_NAME}:${ARCH} /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore${ARCH_ANOTHERWAY}.list` + LINK=$(curl -s https://packages.debian.org/sid/${ARCH}/libc-bin/download | grep -o "http://ftp.cn.debian.org/debian/pool/main/g/glibc/libc-bin_.*_${ARCH}.deb") + LINK_BASENAME=$(basename ${LINK}) + version="${LINK_BASENAME##*_}" + PKG_VER_UPSTREAM="${version%%_*}-${ABL_VERSION}" + + # Compare version will also give the value to $VERSION + # Now we should have the $VERSION + if [ -e $VERSION ];then + log.error "VERSION is empty. This should not happen! exit." + fi +} + + + + +function build(){ + + + +pushd $WORKDIR + +LIBC6_DOWNLOAD_URL=$(curl -s https://packages.debian.org/sid/${ARCH}/libc6/download | grep -o "http://ftp.cn.debian.org/debian/pool/main/g/glibc/libc6_.*_${ARCH}.deb") +LIBC_BIN_DOWNLOAD_URL=$(curl -s https://packages.debian.org/sid/${ARCH}/libc-bin/download | grep -o "http://ftp.cn.debian.org/debian/pool/main/g/glibc/libc-bin_.*_${ARCH}.deb") +LIBSTDCxx6_DOWNLOAD_URL=curl -s https://packages.debian.org/sid/${ARCH}/libstdc++6/download | grep -o "http://ftp.cn.debian.org/debian/.*_${ARCH}.deb" + +ABL_VERSION=9 + +check(){ + if [ "$1" != 0 ] + then + echo "Error" + exit + fi +} + + +echo "download packages:" +mkdir ./downloads +echo "download libc6..." +wget "$LIBC6_DOWNLOAD_URL" -c -O ./downloads/libc6.deb +check $? +echo "download libc-bin..." +wget "$LIBC_BIN_DOWNLOAD_URL" -c -O ./downloads/libc-bin.deb +check $? +echo "download libstdc++6..." +wget "$LIBSTDCxx6_DOWNLOAD_URL" -c -O ./downloads/libstdc++6.deb +check $? + +echo +echo "extract packages:" +echo "extract libc6..." +dpkg -x ./downloads/libc6.deb ./downloads/libc6 +check $? +dpkg -e ./downloads/libc6.deb ./downloads/libc6/DEBIAN +check $? +echo "extract libc-bin..." +dpkg -x ./downloads/libc-bin.deb ./downloads/libc-bin +check $? +dpkg -e ./downloads/libc-bin.deb ./downloads/libc-bin/DEBIAN +check $? +echo "extract libstdc++6..." +dpkg -x ./downloads/libstdc++6.deb ./downloads/libstdc++6 +check $? +dpkg -e ./downloads/libstdc++6.deb ./downloads/libstdc++6/DEBIAN +check $? + +echo +echo "check packages:" +echo "check version libc6==libc-bin" +LIBC6_VERSION=`cat ./downloads/libc6/DEBIAN/control | grep "^Version: .*"` +check $? +LIBC6_VERSION=${LIBC6_VERSION:9} +LIBC_BIN_VERSION=`cat ./downloads/libc-bin/DEBIAN/control | grep "^Version: .*"` +check $? +LIBC_BIN_VERSION=${LIBC_BIN_VERSION:9} +LIBSTDCxx6_VERSION=`cat ./downloads/libstdc++6/DEBIAN/control | grep "^Version: .*"` +check $? +LIBSTDCxx6_VERSION=${LIBSTDCxx6_VERSION:9} + +echo "$LIBC6_VERSION==$LIBC_BIN_VERSION" +[ "$LIBC6_VERSION" = "$LIBC_BIN_VERSION" ] +check $? + +echo "check arch libc6==libc-bin" +LIBC6_ARCH=`cat ./downloads/libc6/DEBIAN/control | grep "^Architecture: .*"` +check $? +LIBC6_ARCH=${LIBC6_ARCH:14} +LIBC_BIN_ARCH=`cat ./downloads/libc-bin/DEBIAN/control | grep "^Architecture: .*"` +check $? +LIBC_BIN_ARCH=${LIBC_BIN_ARCH:14} + +echo "$LIBC6_ARCH==$LIBC_BIN_ARCH" +[ "$LIBC6_ARCH" = "$LIBC_BIN_ARCH" ] +check $? + +echo "check arch libc6==libstdc++6" +LIBSTDCxx6_ARCH=`cat ./downloads/libstdc++6/DEBIAN/control | grep "^Architecture: .*"` +check $? +LIBSTDCxx6_ARCH=${LIBSTDCxx6_ARCH:14} + +echo "$LIBC6_ARCH==$LIBSTDCxx6_ARCH" +[ "$LIBC6_ARCH" = "$LIBSTDCxx6_ARCH" ] +check $? + +echo +echo "collect information:" +echo "glibc version:" +GLIBC_VERSION=$LIBC6_VERSION +echo "$GLIBC_VERSION" + +echo "deb package architecture:" +DEBIAN_DEB_ARCH=$LIBC6_ARCH +echo "$DEBIAN_DEB_ARCH" + +echo "debian multiarch directory name:" +DEBIAN_MULTIARCH=`dpkg-architecture -A "$DEBIAN_DEB_ARCH" | grep "^DEB_TARGET_MULTIARCH=.*"` +check $? +DEBIAN_MULTIARCH=${DEBIAN_MULTIARCH:21} +echo "$DEBIAN_MULTIARCH" + +echo "check usrmerge status:": +if [ -d "./downloads/libc6/lib" ] +then + LIBC_LIB_DIR="" + echo "not usrmerge" +else + LIBC_LIB_DIR="usr/" + echo "usrmerge" +fi + +echo "ld.so location:" +LD_SO_LOCATION=`patchelf --print-interpreter "./downloads/libc6/${LIBC_LIB_DIR}lib/${DEBIAN_MULTIARCH}/libc.so.6"` +check $? +echo "$LD_SO_LOCATION" + +echo +echo "build package directories..." +mkdir ./deb-contents +mkdir ./deb-contents/DEBIAN +mkdir ./deb-contents/usr +mkdir ./deb-contents/usr/bin +mkdir ./deb-contents/usr/lib +mkdir "./deb-contents/usr/lib/$DEBIAN_MULTIARCH" + +echo +echo "gather files:" + +echo "generate ablrun script..." +echo "#!/bin/bash" > ./deb-contents/usr/bin/ablrun +echo "ABL_TARGET_LD_SO_PATH=$LD_SO_LOCATION" >> ./deb-contents/usr/bin/ablrun +echo "ABL_DIR_PREFIX=lib/$DEBIAN_MULTIARCH" >> ./deb-contents/usr/bin/ablrun +cat ./scripts/ablrun_part >> ./deb-contents/usr/bin/ablrun +check $? + +echo "chmod..." +chmod a+x ./deb-contents/usr/bin/* +check $? + +rooted_readlink(){ + rrl_result=$1 + rrl_root=$2 + while [ -h "$rrl_result" ] + do + rrl_result=`readlink "$rrl_result"` + if [ "${rrl_result:0:1}" == "/" ] + then + rrl_result="$rrl_root/$rrl_result" + else + rrl_result=`dirname "$1"`"/$rrl_result" + fi + done + echo -n "$rrl_result" +} + +echo "copy many libc6 components..." +cp -r "./downloads/libc6/${LIBC_LIB_DIR}lib/${DEBIAN_MULTIARCH}/" "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib" +check $? + +echo "copy ld.so..." +mkdir --parents "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib/$LD_SO_LOCATION" +rm -d "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib/$LD_SO_LOCATION" +cp `rooted_readlink "./downloads/libc6/${LIBC_LIB_DIR}${LD_SO_LOCATION}" "./downloads/libc6"` "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib/$LD_SO_LOCATION" +check $? + +echo "copy ldd script..." +cp "./downloads/libc-bin/usr/bin/ldd" "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib/ldd" +check $? + +echo "copy libstdc++..." +cp `rooted_readlink ./downloads/libstdc++6/usr/lib/${DEBIAN_MULTIARCH}/libstdc++.so.6 ./downloads/libstdc++6/` "./deb-contents/usr/lib/${DEBIAN_MULTIARCH}/additional-base-lib/libstdc++.so.6" +check $? + +echo "calculate file size..." +DEB_INSTALL_SIZE=(`du -s ./deb-contents/`) + +echo +echo "create control file..." +echo "Package: additional-base-lib" >> ./deb-contents/DEBIAN/control +echo "Version: $GLIBC_VERSION-$ABL_VERSION" >> ./deb-contents/DEBIAN/control +echo "Section: utils" >> ./deb-contents/DEBIAN/control +echo "Priority: optional" >> ./deb-contents/DEBIAN/control +echo "Installed-Size: ${DEB_INSTALL_SIZE[@]:0:1}" >> ./deb-contents/DEBIAN/control +echo "Architecture: $DEBIAN_DEB_ARCH" >> ./deb-contents/DEBIAN/control +echo "Maintainer: CongTianKong" >> ./deb-contents/DEBIAN/control +echo "Depends: bubblewrap, bash, coreutils" >> ./deb-contents/DEBIAN/control +echo "Suggests: shared-mime-info, xdg-utils" >> ./deb-contents/DEBIAN/control +echo "Homepage: https://gitee.com/deepin-community-store/additional-base-lib" >> ./deb-contents/DEBIAN/control +echo "Description: A script to run programs with newer libc." >> ./deb-contents/DEBIAN/control +echo " package built with make-deb.sh from additional-base-lib project." >> ./deb-contents/DEBIAN/control +echo " libc6 download URL: $LIBC6_DOWNLOAD_URL" >> ./deb-contents/DEBIAN/control +echo " libc-bin download URL: $LIBC_BIN_DOWNLOAD_URL" >> ./deb-contents/DEBIAN/control +echo " libstdc++6 download URL: $LIBSTDCxx6_DOWNLOAD_URL" >> ./deb-contents/DEBIAN/control + +echo >> ./deb-contents/DEBIAN/control +check $? + +echo +echo "build deb package:" +dpkg-deb -Z xz -b ./deb-contents "./additional-base-lib_${GLIBC_VERSION}-${ABL_VERSION}_${DEBIAN_DEB_ARCH}.deb" +# use gzip to compress for compatibility +check $? + +echo +echo "complete with no error!" + + + +mv -v ./additional-base-lib_${GLIBC_VERSION}-${ABL_VERSION}_${DEBIAN_DEB_ARCH}.deb ${STORE_APP_PATH} +popd + +} + + +prepare +build +write_json $STORE_APP_PATH + +rm -rf $WORKDIR diff --git a/arm64/additional-base-lib b/arm64/additional-base-lib new file mode 120000 index 0000000..a7d4c68 --- /dev/null +++ b/arm64/additional-base-lib @@ -0,0 +1 @@ +../amd64/additional-base-lib/ \ No newline at end of file