createDeb.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. #!/bin/bash
  2. #创建Deb包的脚本,需要先设置好变量位置,传入的第一个参数是可执行程序的名称
  3. #帮助字符串
  4. helpStr="
  5. deb打包脚本
  6. 第一个参数是动作类型
  7. 第二个参数是可执行程序的名称
  8. 此脚本支持的动作类型有:\n
  9. -b|build:构建deb包\n
  10. -c|clean:清理\n
  11. -cd:拷贝依赖库\n
  12. -d|dir:创建目录\n
  13. -db|dirbuild:创建目录并构建deb包\n
  14. -h|help:帮助 "
  15. #检查参数是否正确
  16. case $1 in
  17. -b|build)
  18. #检查是否提供了可执行程序的名称
  19. if [ -z $2 ]; then
  20. echo "未提供可执行程序的名称"
  21. exit 1
  22. fi
  23. ;;
  24. -c|clean)
  25. echo "清理文件夹"
  26. ;;
  27. -cd)
  28. echo "拷贝依赖库"
  29. ;;
  30. -d|dir)
  31. #检查是否提供了可执行程序的名称
  32. if [ -z $2 ]; then
  33. echo "未提供可执行程序的名称"
  34. exit 1
  35. fi
  36. ;;
  37. -db|dirbuild)
  38. #检查是否提供了可执行程序的名称
  39. # if [ -z $2 ]; then
  40. # echo "未提供可执行程序的名称"
  41. # exit 1
  42. # fi
  43. ;;
  44. -h|-help)
  45. echo "$helpStr"
  46. exit 0
  47. ;;
  48. *)
  49. echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
  50. exit 1
  51. ;;
  52. esac
  53. #=========================================================================
  54. # ************************ 自定义的一些变量 *************************
  55. #=========================================================================
  56. #可执行程序的名称
  57. AppName=$2
  58. #安装包名,转换成全小写
  59. PackageName=$(echo $AppName | awk '{print tolower($0)}')
  60. #版本信息
  61. Version=1.0.1.1
  62. #安装路径,绝对路径
  63. installPath=/opt/$AppName
  64. #软件描述
  65. AppComment="This is $AppName Application"
  66. #安装包大小
  67. InstalledSize=158900
  68. #作者信息
  69. Maintainer=HZLH
  70. #安装包的描述
  71. Description="ESM8C Upper Computer Program for ESM8C. ESM8C is a software for the upper computer of ESM8C."
  72. #设置临时环境变量,后面拷贝可执行程序依赖库的时候需要这些临时变量,就是Qt的安装位置
  73. PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/bin:$PATH
  74. LD_LIBRARY_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/lib:$LD_LIBRARY_PATH
  75. QT_PLUGIN_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/plugins:$QT_PLUGIN_PATH
  76. QML2_IMPORT_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/qml:$QML2_IMPORT_PATH
  77. #添加自定义的库位置,这个是自己编译的第三方库
  78. #注意,因为是库文件,要设置成这个变量才行
  79. LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3/lib:$LD_LIBRARY_PATH
  80. LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/sm_dll/libs/linux/x64:$LD_LIBRARY_PATH
  81. #============================================================================
  82. #拷贝依赖库
  83. func_copyDepend()
  84. {
  85. #先获取sudo权限
  86. sudo echo "获取sudo权限"
  87. #检测是否安装了linuxdeployqt
  88. if command -v "$linuxdeployqt" > /dev/null 2>&1; then
  89. echo "未安装linuxdeployqt"
  90. exit 1
  91. fi
  92. #=========================================================================
  93. # ************************ 拷贝程序依赖库 *************************
  94. #=========================================================================
  95. echo "********** 开始拷贝Qt依赖库 **********"
  96. mkdir libs
  97. cd libs
  98. cp ../$AppName .
  99. #导出环境变量
  100. export PATH
  101. export LD_LIBRARY_PATH
  102. export QT_PLUGIN_PATH
  103. export QML2_IMPORT_PATH
  104. #查看qt版本
  105. echo "***** qmake Version:" $(qmake -v)
  106. echo "***** PATH:" $PATH
  107. echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
  108. echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
  109. echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
  110. #拷贝依赖库
  111. linuxdeployqt $AppName -appimage
  112. cd ..
  113. echo "********** 拷贝完成 **********"
  114. }
  115. #============================================================================
  116. #构建函数
  117. func_create()
  118. {
  119. #先获取sudo权限
  120. sudo echo "获取sudo权限"
  121. #检测可执行程序和图标是否存在
  122. if [ ! -e $AppName ]; then
  123. echo "可执行程序不存在"
  124. exit 1
  125. fi
  126. if [ ! -e $AppName.png ]; then
  127. echo "图标“$AppName.png”不存在"
  128. exit 1
  129. fi
  130. #检测是否安装了linuxdeployqt
  131. if command -v "$linuxdeployqt" > /dev/null 2>&1; then
  132. echo "未安装linuxdeployqt"
  133. exit 1
  134. fi
  135. echo "***** 开始创建相关目录 *****"
  136. echo "构建的程序名称:$AppName"
  137. echo "***** 创建目录 *****"
  138. mkdir -p output
  139. mkdir -p source/DEBIAN
  140. mkdir -p source$installPath
  141. #拷贝可执行文件,拷贝依赖库
  142. echo "***** 拷贝可执行文件 *****"
  143. cp $AppName source$installPath
  144. cp $AppName.png source$installPath
  145. #=========================================================================
  146. # ************************ 拷贝程序依赖库 *************************
  147. #=========================================================================
  148. echo "********** 开始拷贝Qt依赖库 **********"
  149. #导出环境变量
  150. export PATH
  151. export LD_LIBRARY_PATH
  152. export QT_PLUGIN_PATH
  153. export QML2_IMPORT_PATH
  154. #查看qt版本
  155. echo "***** qmake Version:" $(qmake -v)
  156. echo "***** PATH:" $PATH
  157. echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
  158. echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
  159. echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
  160. #拷贝依赖库,先保存现在的路径
  161. srcPath=$(pwd)
  162. cd source$installPath
  163. echo "***** cd $(pwd)"
  164. #检测是否提供默认的.desktop文件
  165. if [ ! -e $srcPath/$AppName.desktop ]; then
  166. #检测当前文件夹是否存在.desktop文件,如果有就删除
  167. if [ -e $AppName.desktop ]; then
  168. rm $AppName.desktop
  169. fi
  170. echo "***** 未提供默认的$AppName.desktop文件,使用默认生成的 *****"
  171. echo "[Desktop Entry]" >> $AppName.desktop
  172. echo "Type=Application" >> $AppName.desktop
  173. echo "Name=$AppName" >> $AppName.desktop
  174. echo "Exec=$installPath/$AppName" >> $AppName.desktop
  175. echo "Icon=$installPath/$AppName.png" >> $AppName.desktop
  176. echo "Comment=This is $AppName Application" >> $AppName.desktop
  177. echo "Terminal=false" >> $AppName.desktop
  178. fi
  179. #赋予可执行权限,不然就是个普通文件
  180. chmod +x $AppName.desktop
  181. #拷贝依赖库
  182. linuxdeployqt $AppName -appimage
  183. cd $srcPath
  184. echo "***** cd $(pwd)"
  185. echo "********** 拷贝完成 **********"
  186. #=========================================================================
  187. # ******************* 添加安装和卸载时运行的脚本 ********************
  188. #=========================================================================
  189. echo "***** 添加安装和卸载脚本 *****"
  190. cd source/DEBIAN
  191. echo "***** cd $(pwd)"
  192. #生成control文件,这个是Deb包的描述文件
  193. if [ ! -e $srcPath/control ]; then
  194. echo "***** 未提供默认的control文件,生成默认的 *****"
  195. #检查有没有默认生成的文件
  196. if [ -e control ]; then
  197. rm control
  198. fi
  199. cat > control << EOF
  200. Package: $PackageName
  201. Version: $Version
  202. Section: utils
  203. Priority: optional
  204. Architecture: amd64
  205. Depends:
  206. Installed-Size: $InstalledSize
  207. Maintainer: $Maintainer
  208. Description: $Description
  209. EOF
  210. else
  211. echo "***** 已提供control文件 *****"
  212. cp $srcPath/control .
  213. fi
  214. #添加preinst文件,这个是安装程序之前运行的脚本
  215. if [ ! -e $srcPath/preinst ]; then
  216. echo "***** 未提供默认的preinst文件,生成默认的 *****"
  217. #检查有没有默认生成的文件
  218. if [ -e preinst ]; then
  219. rm preinst
  220. fi
  221. cat > preinst << EOF
  222. #!/bin/bash
  223. echo "***** run preinst *****"
  224. echo "安装$AppName,先关闭 $AppName..."
  225. echo "当前用户是:\$whoami"
  226. echo "安装用户是:\$SUDO_USER"
  227. echo "***** end preinst *****"
  228. EOF
  229. else
  230. echo "***** 已提供preinst文件 *****"
  231. cp $srcPath/preinst .
  232. fi
  233. #添加postinst文件,这个是安装程序之后运行的脚本,主要是拷贝快捷方式
  234. if [ ! -e $srcPath/postinst ]; then
  235. echo "***** 未提供默认的postinst文件,生成默认的 *****"
  236. #检查有没有默认生成的文件
  237. if [ -e postinst ]; then
  238. rm postinst
  239. fi
  240. cat > postinst << EOF
  241. #!/bin/bash
  242. echo "***** run postinst *****"
  243. chmod 777 $installPath/$AppName.desktop
  244. #拷贝至菜单文件夹
  245. cp $installPath/$AppName.desktop /usr/share/applications/
  246. #添加桌面文件,只添加当前用户
  247. if [ -d /home/\$SUDO_USER/Desktop ]
  248. then
  249. #这一句用来添加桌面快捷方式,$SUDO_USER是执行sudo的用户,使用安装器安装的可能不会有桌面图标
  250. cp $installPath/$AppName.desktop /home/\$SUDO_USER/Desktop/
  251. fi
  252. echo "***** end postinst *****"
  253. EOF
  254. else
  255. echo "***** 已提供postinst文件 *****"
  256. cp $srcPath/postinst .
  257. fi
  258. #添加prerm文件,这个是卸载程序之前运行的脚本
  259. if [ ! -e $srcPath/prerm ]; then
  260. echo "***** 未提供默认的prerm文件,生成默认的 *****"
  261. #检查有没有默认生成的文件
  262. if [ -e prerm ]; then
  263. rm prerm
  264. fi
  265. cat > prerm << EOF
  266. #!/bin/bash
  267. echo "***** run prerm *****"
  268. echo "卸载$AppName,先关闭 $AppName..."
  269. #关闭前需要先判断有没有运行
  270. A=\$(ps -ef | grep $AppName | grep -v grep | awk '{print \$2}')
  271. echo "$AppName 的进程ID是:\$A"
  272. echo "删除$AppName,正在关闭 $AppName..."
  273. # kill -9 \$A
  274. echo "$AppName 已关闭"
  275. echo "***** end prerm *****"
  276. EOF
  277. else
  278. echo "***** 已提供prerm文件 *****"
  279. cp $srcPath/prerm .
  280. fi
  281. #添加postrm文件,这个是卸载程序之后运行的脚本
  282. if [ ! -e $srcPath/postrm ]; then
  283. echo "***** 未提供默认的postrm文件,生成默认的 *****"
  284. #检查有没有默认生成的文件
  285. if [ -e postrm ]; then
  286. rm postrm
  287. fi
  288. cat > postrm << EOF
  289. #!/bin/bash
  290. echo "***** run postrm *****"
  291. echo "正在删除 $AppName..."
  292. #检查文件是否存在
  293. echo "检查$AppName.desktop是否存在"
  294. if [ -f /usr/share/applications/$AppName.desktop ]; then
  295. echo "删除/usr/share/applications/$AppName.desktop"
  296. rm /usr/share/applications/$AppName.desktop
  297. else
  298. echo "/usr/share/applications/$AppName.desktop不存在"
  299. fi
  300. #删除桌面快捷方式
  301. echo "检查/home/*/Desktop/$AppName.desktop是否存在"
  302. for username in \`ls /home\`
  303. do
  304. #文件存在则删除
  305. if [ -e /home/\$username/Desktop/$AppName.desktop ]; then
  306. echo "删除/home/\$username/Desktop/$AppName.desktop"
  307. rm /home/\$username/Desktop/$AppName.desktop
  308. else
  309. echo "/home/$username/Desktop/$AppName.desktop 不存在"
  310. fi
  311. done
  312. #删除$installPath
  313. echo "检查$installPath 是否存在"
  314. if [ -d $installPath ]; then
  315. echo "删除$installPath"
  316. rm -rf $installPath
  317. else
  318. echo "$installPath 不存在"
  319. fi
  320. echo "$AppName 已删除"
  321. echo "***** end postrm *****"
  322. EOF
  323. else
  324. echo "***** 已提供postrm文件 *****"
  325. cp $srcPath/postrm .
  326. fi
  327. #给四个问价赋予可执行权限
  328. chmod 775 preinst
  329. chmod 775 postinst
  330. chmod 775 prerm
  331. chmod 775 postrm
  332. cd $srcPath
  333. echo "***** cd $(pwd)"
  334. echo "***** 目录和文件创建完成,输入 ./createDeb.h -b 构建Deb包 *****"
  335. }
  336. #end func_create
  337. #=========================================================================
  338. # ************************** 打包成Deb包 ***************************
  339. #=========================================================================
  340. func_build()
  341. {
  342. #检查文件夹目录是否正确
  343. if [ ! -d source ]; then
  344. echo "source文件夹不存在"
  345. exit 1
  346. fi
  347. if [ ! -d output ]; then
  348. echo "output文件夹不存在"
  349. exit 1
  350. fi
  351. #检查可执行程序是否存在
  352. if [ ! -e source$installPath/$AppName ]; then
  353. echo "可执行程序不存在"
  354. exit 1
  355. fi
  356. echo "***** 开始生成Deb包 *****"
  357. debName="$AppName"_amd64_"$Version".deb
  358. #检查有没有生成的Deb包
  359. if [ -e output/$debName ]; then
  360. rm output/$debName
  361. fi
  362. #打包
  363. sudo dpkg -b source output/$debName
  364. echo "***** Deb包生成完成:output/$debName *****"
  365. }
  366. #end func_build
  367. #=========================================================================
  368. # *************************** 清理函数 ****************************
  369. #=========================================================================
  370. func_clean()
  371. {
  372. echo "***** 开始清理 *****"
  373. rm -rf source
  374. rm -rf output/*
  375. echo "***** 清理完成 *****"
  376. }
  377. #=========================================================================
  378. # *************************** 执行函数 ****************************
  379. #=========================================================================
  380. case $1 in
  381. -b|build)
  382. # func_create
  383. func_build
  384. ;;
  385. -c|clean)
  386. func_clean
  387. ;;
  388. -cd)
  389. func_copyDepend
  390. ;;
  391. -d|dir)
  392. func_create
  393. ;;
  394. -db|dirbuild)
  395. func_create
  396. func_build
  397. ;;
  398. -h|-help)
  399. echo "$helpStr"
  400. ;;
  401. *)
  402. echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
  403. ;;
  404. esac