#!/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