createDeb.sh 13 KB

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