DebPackageConfig.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. cmake_minimum_required(VERSION 3.0.0)
  2. # function(add_deb_package PACKAGE_NAME PACKAGE_VERSION PACKAGE_MAINTAINER PACKAGE_EMAIL PACKAGE_SHORT_DESCRIPTION PACKAGE_LONG_DESCRIPTION)
  3. # endfunction(add_deb_package PACKAGE_NAME PACKAGE_VERSION PACKAGE_MAINTAINER PACKAGE_EMAIL PACKAGE_SHORT_DESCRIPTION PACKAGE_LONG_DESCRIPTION)
  4. # if(add_deb_package VALUE) set(Package ${VALUE} PARENT_SCOPE) endif(add_deb_package VALUE)
  5. # if(add_deb_version VALUE) set(Version ${VALUE} PARENT_SCOPE) endif(add_deb_version VALUE)
  6. # if(add_deb_maintainer VALUE) set(Maintainer ${VALUE} PARENT_SCOPE) endif(add_deb_maintainer VALUE)
  7. # if(add_deb_email VALUE) set(Email ${VALUE} PARENT_SCOPE) endif(add_deb_email VALUE)
  8. # if(add_deb_descrition VALUE) set(Descrition ${VALUE} PARENT_SCOPE) endif(add_deb_descrition VALUE)
  9. # if(add_deb_detail VALUE) set(Detail ${VALUE} PARENT_SCOPE) endif(add_deb_detail VALUE)
  10. # set(Package "")
  11. # set(Version "")
  12. # set(Architecture "")
  13. # set(Maintainer "")
  14. # set(Email "")
  15. # set(Descrition "")
  16. function(find_str _IN _SEP _OUT)
  17. string(FIND "${_IN}" "${_SEP}" _TMP)
  18. set(${_OUT} ${_TMP} PARENT_SCOPE)
  19. endfunction(find_str _IN _SEP _OUT)
  20. function(find_next _IN _OUT)
  21. find_str("${_IN}" "\n" _TMP)
  22. set(${_OUT} ${_TMP} PARENT_SCOPE)
  23. endfunction(find_next _IN _OUT)
  24. function(sub_next _IN _INDEX _OUT __OUT)
  25. find_next(${_IN} _NEXTINDEX)
  26. string(SUBSTRING "${_IN}" ${_INDEX} ${_NEXTINDEX} _TMP)
  27. math(EXPR _NEXTINDEX ${_NEXTINDEX}+1)
  28. string(SUBSTRING "${_IN}" ${_NEXTINDEX} -1 __TMP)
  29. set(${_OUT} ${_TMP} PARENT_SCOPE)
  30. set(${__OUT} ${__TMP} PARENT_SCOPE)
  31. endfunction(sub_next _IN _INDEX _OUT)
  32. function(trim_str _IN _OUT)
  33. string(STRIP "${_IN}" _TMP)
  34. set(${_OUT} ${_TMP} PARENT_SCOPE)
  35. endfunction(trim_str _IN _OUT)
  36. function(split_str _IN _SEP _OUT)
  37. string(FIND "${_IN}" "${_SEP}" _TMP_INDEX)
  38. if(NOT _TMP_INDEX EQUAL -1)
  39. string(SUBSTRING "${_IN}" 0 ${_TMP_INDEX} _TMP)
  40. math(EXPR _TMP_INDEX ${_TMP_INDEX}+1)
  41. string(SUBSTRING "${_IN}" ${_TMP_INDEX} -1 __TMP)
  42. set(${_OUT} "${_TMP};${__TMP}" PARENT_SCOPE)
  43. else()
  44. set(${_OUT} ${_IN} PARENT_SCOPE)
  45. endif(NOT _TMP_INDEX EQUAL -1)
  46. endfunction(split_str _IN _SEP _OUT)
  47. function(split_str_p _IN _SEP _OUT __OUT)
  48. split_str("${_IN}" "${_SEP}" _TMP)
  49. list(GET _TMP 0 __TMP)
  50. list(GET _TMP 1 ___TMP)
  51. set(${_OUT} ${__TMP} PARENT_SCOPE)
  52. set(${__OUT} ${___TMP} PARENT_SCOPE)
  53. endfunction(split_str_p _IN _SEP _OUT __OUT)
  54. function(split_str_n _IN _SEP _OUT _N)
  55. if(_N GREATER 1)
  56. set(_C ${_N})
  57. set(_RET "")
  58. set(_NEXT ${_IN})
  59. while(NOT _C EQUAL 0)
  60. split_str("${_NEXT}" "${_SEP}" _TMP)
  61. list(LENGTH _TMP _TMP_LEN)
  62. if(_TMP_LEN EQUAL 2)
  63. list(GET _TMP 0 __TMP)
  64. list(GET _TMP 1 _NEXT)
  65. list(APPEND _RET ${__TMP})
  66. else()
  67. break()
  68. endif(_TMP_LEN EQUAL 2)
  69. math(EXPR _C "${_C}-1")
  70. endwhile(NOT _C EQUAL 0)
  71. list(APPEND _RET ${_NEXT})
  72. set(${_OUT} ${_RET} PARENT_SCOPE)
  73. else()
  74. split_str("${_IN}" "${_SEP}" _TMP)
  75. set(${_OUT} ${_TMP} PARENT_SCOPE)
  76. endif(_N GREATER 1)
  77. endfunction(split_str_n _IN _SEP _OUT _N)
  78. function(set_package_vars _IN_KEY _IN_VAL)
  79. # trim_str("${_IN_KEY}" _IN_KEY)
  80. find_str("${_IN_KEY}" "Type" _Type)
  81. if(_Type EQUAL "0")
  82. string(TOUPPER "${_IN_VAL}" _IN_VAL_UPPER)
  83. string(TOLOWER "${_IN_VAL}" _IN_VAL_LOWER)
  84. set(CPACK_GENERATOR "${_IN_VAL_UPPER}" PARENT_SCOPE)
  85. message("--> 软件包类型: ${_IN_VAL_LOWER}")
  86. endif(_Type EQUAL "0")
  87. find_str("${_IN_KEY}" "Package" _Package)
  88. if(_Package EQUAL "0")
  89. if(_IN_VAL STREQUAL "auto")
  90. set(CPACK_DEBIAN_PACKAGE_NAME "${PROJECT_NAME}" PARENT_SCOPE)
  91. else()
  92. set(CPACK_DEBIAN_PACKAGE_NAME "${_IN_VAL}" PARENT_SCOPE)
  93. endif(_IN_VAL STREQUAL "auto")
  94. message("--> 软件包名: ${_IN_VAL}")
  95. endif(_Package EQUAL "0")
  96. find_str("${_IN_KEY}" "Version" _Version)
  97. if(_Version EQUAL "0")
  98. if(_IN_VAL STREQUAL "auto")
  99. set(CPACK_DEBIAN_PACKAGE_VERSION "${PROJECT_VERSION}" PARENT_SCOPE)
  100. else()
  101. set(CPACK_DEBIAN_PACKAGE_VERSION "${_IN_VAL}" PARENT_SCOPE)
  102. endif(_IN_VAL STREQUAL "auto")
  103. message("--> 软件版本: ${_IN_VAL}")
  104. endif(_Version EQUAL "0")
  105. find_str("${_IN_KEY}" "CalVer" _CalVer)
  106. if(_CalVer EQUAL "0")
  107. set(CalVer "${_IN_VAL}" PARENT_SCOPE)
  108. message("--> 日历化版本: ${_IN_VAL}")
  109. endif(_CalVer EQUAL "0")
  110. find_str("${_IN_KEY}" "OSD" _OSDVer)
  111. if(_OSDVer EQUAL "0")
  112. set(OSDVer "${_IN_VAL}" PARENT_SCOPE)
  113. message("--> 声明发行版号: ${_IN_VAL}")
  114. endif(_OSDVer EQUAL "0")
  115. find_str("${_IN_KEY}" "Architecture" _Architecture)
  116. if(_Architecture EQUAL "0")
  117. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${_IN_VAL}" PARENT_SCOPE)
  118. if(_IN_VAL STREQUAL "auto")
  119. execute_process(
  120. COMMAND dpkg --print-architecture
  121. OUTPUT_VARIABLE _RETV
  122. OUTPUT_STRIP_TRAILING_WHITESPACE
  123. )
  124. set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${_RETV}" PARENT_SCOPE)
  125. endif(_IN_VAL STREQUAL "auto")
  126. message("--> 软件架构: ${_IN_VAL}")
  127. endif(_Architecture EQUAL "0")
  128. find_str("${_IN_KEY}" "Priority" _Priority)
  129. if(_Priority EQUAL "0")
  130. set(CPACK_DEBIAN_PACKAGE_PRIORITY "${_IN_VAL}" PARENT_SCOPE)
  131. message("--> 优先级: ${_IN_VAL}")
  132. endif(_Priority EQUAL "0")
  133. find_str("${_IN_KEY}" "Depends" _Depends)
  134. if(_Depends EQUAL "0")
  135. set(CPACK_DEBIAN_PACKAGE_DEPENDS "${_IN_VAL}" PARENT_SCOPE)
  136. message("--> 软件依赖: ${_IN_VAL}")
  137. endif(_Depends EQUAL "0")
  138. find_str("${_IN_KEY}" "Maintainer" _Maintainer)
  139. if(_Maintainer EQUAL "0")
  140. set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${_IN_VAL}" PARENT_SCOPE)
  141. message("--> 软件维护者: ${_IN_VAL}")
  142. endif(_Maintainer EQUAL "0")
  143. find_str("${_IN_KEY}" "Homepage" _Homepage)
  144. if(_Homepage EQUAL "0")
  145. set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${_IN_VAL}" PARENT_SCOPE)
  146. message("--> 软件主页: ${_IN_VAL}")
  147. endif(_Homepage EQUAL "0")
  148. find_str("${_IN_KEY}" "Recommends" _Recommends)
  149. if(_Recommends EQUAL "0")
  150. set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "${_IN_VAL}" PARENT_SCOPE)
  151. message("--> 软件建议: ${_IN_VAL}")
  152. endif(_Recommends EQUAL "0")
  153. endfunction(set_package_vars _IN_KEY _IN_VAL)
  154. # 定义一个自定义(add_package_descript)函数
  155. # 用于按特定配置约定自动化构建软件包配置
  156. function(add_package_descript IN_DES)
  157. set(PACKAGE_DES_PATH "${IN_DES}")
  158. if(EXISTS ${IN_DES})
  159. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
  160. set(PACKAGE_DES_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
  161. else()
  162. message(FATAL_ERROR "!! Not Found Path: ${PACKAGE_DES_PATH}")
  163. return()
  164. endif(EXISTS ${IN_DES})
  165. file(READ ${PACKAGE_DES_PATH} DES_CONTENT)
  166. trim_str("${DES_CONTENT}" DES_CONTENT)
  167. ################## 解析 ##################
  168. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  169. set(PREV_DES "")
  170. while(NOT DES_LINE STREQUAL "${PREV_DES}")
  171. # 检查该描述行是否是 # 注释开头,是的话将跳过该行
  172. find_str("${DES_LINE}" "#" _COMMENT)
  173. if(_COMMENT EQUAL "0")
  174. message("--> !!!!!!! ${DES_LINE}")
  175. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  176. continue()
  177. endif(_COMMENT EQUAL "0")
  178. # 检查该描述行是否是 Descrition 开头,是的话说明描述结尾了
  179. find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
  180. if(_DESCRIPTION EQUAL "0")
  181. break()
  182. endif(_DESCRIPTION EQUAL "0")
  183. split_str_n("${DES_LINE}" ":" _TMP 1)
  184. list(LENGTH _TMP _TMP_LEN)
  185. if(_TMP_LEN EQUAL 2)
  186. split_str_p("${DES_LINE}" ":" _TMP __TMP)
  187. trim_str("${__TMP}" __TMP)
  188. string(LENGTH "${__TMP}" __TMP_LENGTH)
  189. if(NOT __TMP_LENGTH EQUAL "0")
  190. set_package_vars("${_TMP}" "${__TMP}")
  191. endif(NOT __TMP_LENGTH EQUAL "0")
  192. endif(_TMP_LEN EQUAL 2)
  193. # 记录当前行,获取下一行,可能是已经结尾了(将保持重复行)
  194. set(PREV_DES "${DES_LINE}")
  195. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  196. endwhile(NOT DES_LINE STREQUAL "${PREV_DES}")
  197. # 再一次检查该描述行是否是 Descrition 开头,是的话将进行分析描述行
  198. find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
  199. if(_DESCRIPTION EQUAL "0")
  200. split_str_p("${DES_LINE}" ":" _TMP __TMP)
  201. trim_str("${__TMP}" __TMP)
  202. set(Descrition ${__TMP})
  203. set(PREV_DES_LINE "")
  204. while(NOT PREV_DES_LINE STREQUAL DES_LINE)
  205. if(NOT PREV_DES_LINE STREQUAL "")
  206. set(Descrition "${Descrition}\n${DES_LINE}")
  207. endif(NOT PREV_DES_LINE STREQUAL "")
  208. set(PREV_DES_LINE "${DES_LINE}")
  209. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  210. endwhile(NOT PREV_DES_LINE STREQUAL DES_LINE)
  211. # set(Descrition "${Descrition}")
  212. message("--> 软件说明: ${Descrition}")
  213. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition})
  214. endif(_DESCRIPTION EQUAL "0")
  215. ##################### deb #####################
  216. # ARCHITECTURE
  217. if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  218. set(ARCHITECTURE "amd64")
  219. elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  220. set(ARCHITECTURE "arm64")
  221. endif()
  222. #################### Calendar Version ###################
  223. if("${CalVer}" STREQUAL "true")
  224. string(TIMESTAMP BUILD_TIME "%Y%m%d")
  225. set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_DEBIAN_PACKAGE_VERSION}-${BUILD_TIME}")
  226. endif("${CalVer}" STREQUAL "true")
  227. ####################### OS Release ######################
  228. if("${OSDVer}" STREQUAL "true")
  229. exec_program(lsb_release ARGS -si
  230. OUTPUT_VARIABLE _OSI
  231. )
  232. exec_program(lsb_release ARGS -sr
  233. OUTPUT_VARIABLE _OSR
  234. )
  235. if(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
  236. set(PACKAGE_SUFFIX "${PACKAGE_SUFFIX}_${_OSI}${_OSR}")
  237. endif(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
  238. endif("${OSDVer}" STREQUAL "true")
  239. ##################### deb file name #####################
  240. set(_Package "${CPACK_DEBIAN_PACKAGE_NAME}")
  241. set(_Version "${CPACK_DEBIAN_PACKAGE_VERSION}")
  242. set(_Architecture "${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
  243. set(_DebFileName
  244. "${_Package}_${_Version}_${_Architecture}${PACKAGE_SUFFIX}.deb"
  245. )
  246. set(CPACK_DEBIAN_FILE_NAME ${_DebFileName})
  247. # set(CPACK_DEBIAN_PACKAGE_NAME "${Package}")
  248. # set(CPACK_DEBIAN_PACKAGE_VERSION "${Version}")
  249. # set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${Architecture}")
  250. # set(CPACK_DEBIAN_PACKAGE_DEPENDS "${Depends}")
  251. # set(CPACK_DEBIAN_PACKAGE_PRIORITY "${Priority}")
  252. # set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${Maintainer}")
  253. # set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}")
  254. # 设置即将使用的标准脚本
  255. # set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  256. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/preinst"
  257. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postinst"
  258. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/prerm"
  259. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postrm"
  260. # )
  261. # 设置为ON,以便使用 dpkg-shlibdeps 生成更好的包依赖列表。
  262. # set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
  263. # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON)
  264. # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")
  265. include(CPack)
  266. endfunction(add_package_descript IN_DES)
  267. # TODO:
  268. # CPACK_GENERATOR
  269. # CPACK_DEBIAN_FILE_NAME - n
  270. # CPACK_DEBIAN_PACKAGE_NAME - y
  271. # CPACK_DEBIAN_PACKAGE_VERSION - y
  272. # CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto)
  273. # CPACK_DEBIAN_PACKAGE_DEPENDS - y
  274. # CPACK_DEBIAN_PACKAGE_PRIORITY - y
  275. # CPACK_DEBIAN_PACKAGE_MAINTAINER - y
  276. # CPACK_DEBIAN_PACKAGE_DESCRIPTION - y
  277. # ARCHITECTURE
  278. # if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  279. # set(ARCHITECTURE "amd64")
  280. # elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  281. # set(ARCHITECTURE "arm64")
  282. # endif()
  283. # string(TIMESTAMP BUILD_TIME "%Y%m%d")