SparkDebPackageConfig.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. find_str("${_IN_KEY}" "Conflicts" _Conflicts)
  154. if(_Conflicts EQUAL "0")
  155. set(CPACK_DEBIAN_PACKAGE_CONFLICTS "${_IN_VAL}" PARENT_SCOPE)
  156. message("--> 软件冲突: ${_IN_VAL}")
  157. endif(_Conflicts EQUAL "0")
  158. endfunction(set_package_vars _IN_KEY _IN_VAL)
  159. # 定义一个自定义(add_package_descript)函数
  160. # 用于按特定配置约定自动化构建软件包配置
  161. function(add_package_descript IN_DES)
  162. set(PACKAGE_DES_PATH "${IN_DES}")
  163. if(EXISTS ${IN_DES})
  164. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
  165. set(PACKAGE_DES_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
  166. else()
  167. message(FATAL_ERROR "!! Not Found Path: ${PACKAGE_DES_PATH}")
  168. return()
  169. endif(EXISTS ${IN_DES})
  170. file(READ ${PACKAGE_DES_PATH} DES_CONTENT)
  171. trim_str("${DES_CONTENT}" DES_CONTENT)
  172. ################## 解析 ##################
  173. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  174. set(PREV_DES "")
  175. while(NOT DES_LINE STREQUAL "${PREV_DES}")
  176. # 检查该描述行是否是 # 注释开头,是的话将跳过该行
  177. find_str("${DES_LINE}" "#" _COMMENT)
  178. if(_COMMENT EQUAL "0")
  179. message("--> !!!!!!! ${DES_LINE}")
  180. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  181. continue()
  182. endif(_COMMENT EQUAL "0")
  183. # 检查该描述行是否是 Descrition 开头,是的话说明描述结尾了
  184. find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
  185. if(_DESCRIPTION EQUAL "0")
  186. break()
  187. endif(_DESCRIPTION EQUAL "0")
  188. split_str_n("${DES_LINE}" ":" _TMP 1)
  189. list(LENGTH _TMP _TMP_LEN)
  190. if(_TMP_LEN EQUAL 2)
  191. split_str_p("${DES_LINE}" ":" _TMP __TMP)
  192. trim_str("${__TMP}" __TMP)
  193. string(LENGTH "${__TMP}" __TMP_LENGTH)
  194. if(NOT __TMP_LENGTH EQUAL "0")
  195. set_package_vars("${_TMP}" "${__TMP}")
  196. endif(NOT __TMP_LENGTH EQUAL "0")
  197. endif(_TMP_LEN EQUAL 2)
  198. # 记录当前行,获取下一行,可能是已经结尾了(将保持重复行)
  199. set(PREV_DES "${DES_LINE}")
  200. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  201. endwhile(NOT DES_LINE STREQUAL "${PREV_DES}")
  202. # 再一次检查该描述行是否是 Descrition 开头,是的话将进行分析描述行
  203. find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
  204. if(_DESCRIPTION EQUAL "0")
  205. split_str_p("${DES_LINE}" ":" _TMP __TMP)
  206. trim_str("${__TMP}" __TMP)
  207. set(Descrition ${__TMP})
  208. set(PREV_DES_LINE "")
  209. while(NOT PREV_DES_LINE STREQUAL DES_LINE)
  210. if(NOT PREV_DES_LINE STREQUAL "")
  211. if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
  212. set(Descrition "${Descrition}\n${DES_LINE}")
  213. else()
  214. string(STRIP "${DES_LINE}" STRIP_DES_LINE)
  215. set(Descrition "${Descrition}\n${STRIP_DES_LINE}")
  216. endif("${CMAKE_VERSION}" VERSION_LESS "3.15")
  217. endif(NOT PREV_DES_LINE STREQUAL "")
  218. set(PREV_DES_LINE "${DES_LINE}")
  219. sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
  220. endwhile(NOT PREV_DES_LINE STREQUAL DES_LINE)
  221. # set(Descrition "${Descrition}")
  222. message("--> 软件说明: ${Descrition}")
  223. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition})
  224. endif(_DESCRIPTION EQUAL "0")
  225. ##################### deb #####################
  226. # ARCHITECTURE
  227. if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  228. set(ARCHITECTURE "amd64")
  229. elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  230. set(ARCHITECTURE "arm64")
  231. endif()
  232. #################### Calendar Version ###################
  233. if("${CalVer}" STREQUAL "true")
  234. string(TIMESTAMP BUILD_TIME "%Y%m%d")
  235. set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_DEBIAN_PACKAGE_VERSION}-${BUILD_TIME}")
  236. endif("${CalVer}" STREQUAL "true")
  237. ####################### OS Release ######################
  238. if("${OSDVer}" STREQUAL "true")
  239. exec_program(lsb_release ARGS -si
  240. OUTPUT_VARIABLE _OSI
  241. )
  242. exec_program(lsb_release ARGS -sr
  243. OUTPUT_VARIABLE _OSR
  244. )
  245. if(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
  246. set(PACKAGE_SUFFIX "${PACKAGE_SUFFIX}_${_OSI}${_OSR}")
  247. endif(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
  248. endif("${OSDVer}" STREQUAL "true")
  249. ##################### deb file name #####################
  250. set(_Package "${CPACK_DEBIAN_PACKAGE_NAME}")
  251. set(_Version "${CPACK_DEBIAN_PACKAGE_VERSION}")
  252. set(_Architecture "${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
  253. set(_DebFileName
  254. "${_Package}_${_Version}_${_Architecture}${PACKAGE_SUFFIX}.deb"
  255. )
  256. set(CPACK_DEBIAN_FILE_NAME ${_DebFileName})
  257. # 标识: spark-deb-package
  258. if(NOT "${PACKAGE_SUFFIX}" STREQUAL "")
  259. # eg: remove '_' of '_Debian'
  260. string(SUBSTRING "${PACKAGE_SUFFIX}" 1 -1 DISTRIBUTION)
  261. if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
  262. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}\n .\n Build for ${DISTRIBUTION} through spark-deb-build.")
  263. else()
  264. set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition} "\n.\nBuild for ${DISTRIBUTION} through spark-deb-build.")
  265. endif("${CMAKE_VERSION}" VERSION_LESS "3.15")
  266. endif(NOT "${PACKAGE_SUFFIX}" STREQUAL "")
  267. # set(CPACK_DEBIAN_PACKAGE_NAME "${Package}")
  268. # set(CPACK_DEBIAN_PACKAGE_VERSION "${Version}")
  269. # set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${Architecture}")
  270. # set(CPACK_DEBIAN_PACKAGE_DEPENDS "${Depends}")
  271. # set(CPACK_DEBIAN_PACKAGE_PRIORITY "${Priority}")
  272. # set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${Maintainer}")
  273. # set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}")
  274. # 设置即将使用的标准脚本
  275. # set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  276. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/preinst"
  277. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postinst"
  278. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/prerm"
  279. # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postrm"
  280. # )
  281. # 设置为ON,以便使用 dpkg-shlibdeps 生成更好的包依赖列表。
  282. # set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
  283. # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON)
  284. # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")
  285. include(CPack)
  286. endfunction(add_package_descript IN_DES)
  287. # TODO:
  288. # CPACK_GENERATOR
  289. # CPACK_DEBIAN_FILE_NAME - n
  290. # CPACK_DEBIAN_PACKAGE_NAME - y
  291. # CPACK_DEBIAN_PACKAGE_VERSION - y
  292. # CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto) -> dpkg --print-architecture
  293. # CPACK_DEBIAN_PACKAGE_DEPENDS - y
  294. # CPACK_DEBIAN_PACKAGE_PRIORITY - y
  295. # CPACK_DEBIAN_PACKAGE_MAINTAINER - y
  296. # CPACK_DEBIAN_PACKAGE_DESCRIPTION - y
  297. # ARCHITECTURE
  298. # if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  299. # set(ARCHITECTURE "amd64")
  300. # elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  301. # set(ARCHITECTURE "arm64")
  302. # endif()
  303. # string(TIMESTAMP BUILD_TIME "%Y%m%d")