123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- #!/bin/bash
- #创建Deb包的脚本,需要先设置好变量位置,传入的第一个参数是可执行程序的名称
- #帮助字符串
- helpStr="
- deb打包脚本
- 第一个参数是动作类型
- 第二个参数是可执行程序的名称
- 此脚本支持的动作类型有:\n
- -b|build:构建deb包\n
- -c|clean:清理\n
- -cd:拷贝依赖库\n
- -d|dir:创建目录\n
- -db|dirbuild:创建目录并构建deb包\n
- -h|help:帮助 "
- #检查参数是否正确
- case $1 in
- -b|build)
- #检查是否提供了可执行程序的名称
- if [ -z $2 ]; then
- echo "未提供可执行程序的名称"
- exit 1
- fi
- ;;
- -c|clean)
- echo "清理文件夹"
- ;;
- -cd)
- echo "拷贝依赖库"
- ;;
- -d|dir)
- #检查是否提供了可执行程序的名称
- if [ -z $2 ]; then
- echo "未提供可执行程序的名称"
- exit 1
- fi
- ;;
- -db|dirbuild)
- #检查是否提供了可执行程序的名称
- # if [ -z $2 ]; then
- # echo "未提供可执行程序的名称"
- # exit 1
- # fi
- ;;
- -h|-help)
- echo "$helpStr"
- exit 0
- ;;
- *)
- echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
- exit 1
- ;;
- esac
- #=========================================================================
- # ************************ 自定义的一些变量 *************************
- #=========================================================================
- #可执行程序的名称
- AppName=$2
- #安装包名,转换成全小写
- PackageName=$(echo $AppName | awk '{print tolower($0)}')
- #版本信息
- Version=1.0.1.1
- #安装路径,绝对路径
- installPath=/opt/$AppName
- #软件描述
- AppComment="This is $AppName Application"
- #安装包大小
- InstalledSize=158900
- #作者信息
- Maintainer=HZLH
- #安装包的描述
- Description="ESM8C Upper Computer Program for ESM8C. ESM8C is a software for the upper computer of ESM8C."
- #设置临时环境变量,后面拷贝可执行程序依赖库的时候需要这些临时变量,就是Qt的安装位置
- PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/bin:$PATH
- LD_LIBRARY_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/lib:$LD_LIBRARY_PATH
- QT_PLUGIN_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/plugins:$QT_PLUGIN_PATH
- QML2_IMPORT_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/qml:$QML2_IMPORT_PATH
- #添加自定义的库位置,这个是自己编译的第三方库
- #注意,因为是库文件,要设置成这个变量才行
- LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3/lib:$LD_LIBRARY_PATH
- LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/sm_dll/libs/linux/x64:$LD_LIBRARY_PATH
- #============================================================================
- #拷贝依赖库
- func_copyDepend()
- {
- #先获取sudo权限
- sudo echo "获取sudo权限"
- #检测是否安装了linuxdeployqt
- if command -v "$linuxdeployqt" > /dev/null 2>&1; then
- echo "未安装linuxdeployqt"
- exit 1
- fi
- #=========================================================================
- # ************************ 拷贝程序依赖库 *************************
- #=========================================================================
- echo "********** 开始拷贝Qt依赖库 **********"
- mkdir libs
- cd libs
- cp ../$AppName .
- #导出环境变量
- export PATH
- export LD_LIBRARY_PATH
- export QT_PLUGIN_PATH
- export QML2_IMPORT_PATH
- #查看qt版本
- echo "***** qmake Version:" $(qmake -v)
- echo "***** PATH:" $PATH
- echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
- echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
- echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
- #拷贝依赖库
- linuxdeployqt $AppName -appimage
- cd ..
- echo "********** 拷贝完成 **********"
- }
- #============================================================================
- #构建函数
- func_create()
- {
- #先获取sudo权限
- sudo echo "获取sudo权限"
- #检测可执行程序和图标是否存在
- if [ ! -e $AppName ]; then
- echo "可执行程序不存在"
- exit 1
- fi
- if [ ! -e $AppName.png ]; then
- echo "图标“$AppName.png”不存在"
- exit 1
- fi
- #检测是否安装了linuxdeployqt
- if command -v "$linuxdeployqt" > /dev/null 2>&1; then
- echo "未安装linuxdeployqt"
- exit 1
- fi
- echo "***** 开始创建相关目录 *****"
- echo "构建的程序名称:$AppName"
- echo "***** 创建目录 *****"
- mkdir -p output
- mkdir -p source/DEBIAN
- mkdir -p source$installPath
- #拷贝可执行文件,拷贝依赖库
- echo "***** 拷贝可执行文件 *****"
- cp $AppName source$installPath
- cp $AppName.png source$installPath
- #=========================================================================
- # ************************ 拷贝程序依赖库 *************************
- #=========================================================================
- echo "********** 开始拷贝Qt依赖库 **********"
- #导出环境变量
- export PATH
- export LD_LIBRARY_PATH
- export QT_PLUGIN_PATH
- export QML2_IMPORT_PATH
- #查看qt版本
- echo "***** qmake Version:" $(qmake -v)
- echo "***** PATH:" $PATH
- echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
- echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
- echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
- #拷贝依赖库,先保存现在的路径
- srcPath=$(pwd)
- cd source$installPath
- echo "***** cd $(pwd)"
- #检测是否提供默认的.desktop文件
- if [ ! -e $srcPath/$AppName.desktop ]; then
- #检测当前文件夹是否存在.desktop文件,如果有就删除
- if [ -e $AppName.desktop ]; then
- rm $AppName.desktop
- fi
- echo "***** 未提供默认的$AppName.desktop文件,使用默认生成的 *****"
- echo "[Desktop Entry]" >> $AppName.desktop
- echo "Type=Application" >> $AppName.desktop
- echo "Name=$AppName" >> $AppName.desktop
- echo "Exec=$installPath/$AppName" >> $AppName.desktop
- echo "Icon=$installPath/$AppName.png" >> $AppName.desktop
- echo "Comment=This is $AppName Application" >> $AppName.desktop
- echo "Terminal=false" >> $AppName.desktop
- fi
- #赋予可执行权限,不然就是个普通文件
- chmod +x $AppName.desktop
- #拷贝依赖库
- linuxdeployqt $AppName -appimage
- cd $srcPath
- echo "***** cd $(pwd)"
- echo "********** 拷贝完成 **********"
- #=========================================================================
- # ******************* 添加安装和卸载时运行的脚本 ********************
- #=========================================================================
- echo "***** 添加安装和卸载脚本 *****"
- cd source/DEBIAN
- echo "***** cd $(pwd)"
- #生成control文件,这个是Deb包的描述文件
- if [ ! -e $srcPath/control ]; then
- echo "***** 未提供默认的control文件,生成默认的 *****"
- #检查有没有默认生成的文件
- if [ -e control ]; then
- rm control
- fi
- cat > control << EOF
- Package: $PackageName
- Version: $Version
- Section: utils
- Priority: optional
- Architecture: amd64
- Depends:
- Installed-Size: $InstalledSize
- Maintainer: $Maintainer
- Description: $Description
- EOF
- else
- echo "***** 已提供control文件 *****"
- cp $srcPath/control .
- fi
- #添加preinst文件,这个是安装程序之前运行的脚本
- if [ ! -e $srcPath/preinst ]; then
- echo "***** 未提供默认的preinst文件,生成默认的 *****"
- #检查有没有默认生成的文件
- if [ -e preinst ]; then
- rm preinst
- fi
- cat > preinst << EOF
- #!/bin/bash
- echo "***** run preinst *****"
- echo "安装$AppName,先关闭 $AppName..."
- echo "当前用户是:\$whoami"
- echo "安装用户是:\$SUDO_USER"
- echo "***** end preinst *****"
- EOF
- else
- echo "***** 已提供preinst文件 *****"
- cp $srcPath/preinst .
- fi
- #添加postinst文件,这个是安装程序之后运行的脚本,主要是拷贝快捷方式
- if [ ! -e $srcPath/postinst ]; then
- echo "***** 未提供默认的postinst文件,生成默认的 *****"
- #检查有没有默认生成的文件
- if [ -e postinst ]; then
- rm postinst
- fi
- cat > postinst << EOF
- #!/bin/bash
- echo "***** run postinst *****"
- chmod 777 $installPath/$AppName.desktop
- #拷贝至菜单文件夹
- cp $installPath/$AppName.desktop /usr/share/applications/
- #添加桌面文件,只添加当前用户
- if [ -d /home/\$SUDO_USER/Desktop ]
- then
- #这一句用来添加桌面快捷方式,$SUDO_USER是执行sudo的用户,使用安装器安装的可能不会有桌面图标
- cp $installPath/$AppName.desktop /home/\$SUDO_USER/Desktop/
- fi
- echo "***** end postinst *****"
- EOF
- else
- echo "***** 已提供postinst文件 *****"
- cp $srcPath/postinst .
- fi
- #添加prerm文件,这个是卸载程序之前运行的脚本
- if [ ! -e $srcPath/prerm ]; then
- echo "***** 未提供默认的prerm文件,生成默认的 *****"
- #检查有没有默认生成的文件
- if [ -e prerm ]; then
- rm prerm
- fi
- cat > prerm << EOF
- #!/bin/bash
- echo "***** run prerm *****"
- echo "卸载$AppName,先关闭 $AppName..."
- #关闭前需要先判断有没有运行
- A=\$(ps -ef | grep $AppName | grep -v grep | awk '{print \$2}')
- echo "$AppName 的进程ID是:\$A"
- echo "删除$AppName,正在关闭 $AppName..."
- # kill -9 \$A
- echo "$AppName 已关闭"
- echo "***** end prerm *****"
- EOF
- else
- echo "***** 已提供prerm文件 *****"
- cp $srcPath/prerm .
- fi
- #添加postrm文件,这个是卸载程序之后运行的脚本
- if [ ! -e $srcPath/postrm ]; then
- echo "***** 未提供默认的postrm文件,生成默认的 *****"
- #检查有没有默认生成的文件
- if [ -e postrm ]; then
- rm postrm
- fi
- cat > postrm << EOF
- #!/bin/bash
- echo "***** run postrm *****"
- echo "正在删除 $AppName..."
- #检查文件是否存在
- echo "检查$AppName.desktop是否存在"
- if [ -f /usr/share/applications/$AppName.desktop ]; then
- echo "删除/usr/share/applications/$AppName.desktop"
- rm /usr/share/applications/$AppName.desktop
- else
- echo "/usr/share/applications/$AppName.desktop不存在"
- fi
- #删除桌面快捷方式
- echo "检查/home/*/Desktop/$AppName.desktop是否存在"
- for username in \`ls /home\`
- do
- #文件存在则删除
- if [ -e /home/\$username/Desktop/$AppName.desktop ]; then
- echo "删除/home/\$username/Desktop/$AppName.desktop"
- rm /home/\$username/Desktop/$AppName.desktop
- else
- echo "/home/$username/Desktop/$AppName.desktop 不存在"
- fi
- done
- #删除$installPath
- echo "检查$installPath 是否存在"
- if [ -d $installPath ]; then
- echo "删除$installPath"
- rm -rf $installPath
- else
- echo "$installPath 不存在"
- fi
- echo "$AppName 已删除"
- echo "***** end postrm *****"
- EOF
- else
- echo "***** 已提供postrm文件 *****"
- cp $srcPath/postrm .
- fi
- #给四个问价赋予可执行权限
- chmod 775 preinst
- chmod 775 postinst
- chmod 775 prerm
- chmod 775 postrm
- cd $srcPath
- echo "***** cd $(pwd)"
- echo "***** 目录和文件创建完成,输入 ./createDeb.h -b 构建Deb包 *****"
- }
- #end func_create
- #=========================================================================
- # ************************** 打包成Deb包 ***************************
- #=========================================================================
- func_build()
- {
- #检查文件夹目录是否正确
- if [ ! -d source ]; then
- echo "source文件夹不存在"
- exit 1
- fi
- if [ ! -d output ]; then
- echo "output文件夹不存在"
- exit 1
- fi
- #检查可执行程序是否存在
- if [ ! -e source$installPath/$AppName ]; then
- echo "可执行程序不存在"
- exit 1
- fi
- echo "***** 开始生成Deb包 *****"
- debName="$AppName"_amd64_"$Version".deb
- #检查有没有生成的Deb包
- if [ -e output/$debName ]; then
- rm output/$debName
- fi
- #打包
- sudo dpkg -b source output/$debName
- echo "***** Deb包生成完成:output/$debName *****"
- }
- #end func_build
- #=========================================================================
- # *************************** 清理函数 ****************************
- #=========================================================================
- func_clean()
- {
- echo "***** 开始清理 *****"
- rm -rf source
- rm -rf output/*
- echo "***** 清理完成 *****"
- }
- #=========================================================================
- # *************************** 执行函数 ****************************
- #=========================================================================
- case $1 in
- -b|build)
- # func_create
- func_build
- ;;
- -c|clean)
- func_clean
- ;;
- -cd)
- func_copyDepend
- ;;
- -d|dir)
- func_create
- ;;
- -db|dirbuild)
- func_create
- func_build
- ;;
- -h|-help)
- echo "$helpStr"
- ;;
- *)
- echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
- ;;
- esac
|