|
@@ -0,0 +1,507 @@
|
|
|
+#!/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
|
|
|
+
|