| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- cmake_minimum_required(VERSION 3.0.0)
- # function(add_deb_package PACKAGE_NAME PACKAGE_VERSION PACKAGE_MAINTAINER PACKAGE_EMAIL PACKAGE_SHORT_DESCRIPTION PACKAGE_LONG_DESCRIPTION)
-
- # endfunction(add_deb_package PACKAGE_NAME PACKAGE_VERSION PACKAGE_MAINTAINER PACKAGE_EMAIL PACKAGE_SHORT_DESCRIPTION PACKAGE_LONG_DESCRIPTION)
- # if(add_deb_package VALUE) set(Package ${VALUE} PARENT_SCOPE) endif(add_deb_package VALUE)
- # if(add_deb_version VALUE) set(Version ${VALUE} PARENT_SCOPE) endif(add_deb_version VALUE)
- # if(add_deb_maintainer VALUE) set(Maintainer ${VALUE} PARENT_SCOPE) endif(add_deb_maintainer VALUE)
- # if(add_deb_email VALUE) set(Email ${VALUE} PARENT_SCOPE) endif(add_deb_email VALUE)
- # if(add_deb_descrition VALUE) set(Descrition ${VALUE} PARENT_SCOPE) endif(add_deb_descrition VALUE)
- # if(add_deb_detail VALUE) set(Detail ${VALUE} PARENT_SCOPE) endif(add_deb_detail VALUE)
- # set(Package "")
- # set(Version "")
- # set(Architecture "")
- # set(Maintainer "")
- # set(Email "")
- # set(Descrition "")
- function(find_str _IN _SEP _OUT)
- string(FIND "${_IN}" "${_SEP}" _TMP)
- set(${_OUT} ${_TMP} PARENT_SCOPE)
- endfunction(find_str _IN _SEP _OUT)
- function(find_next _IN _OUT)
- find_str("${_IN}" "\n" _TMP)
- set(${_OUT} ${_TMP} PARENT_SCOPE)
- endfunction(find_next _IN _OUT)
- function(sub_next _IN _INDEX _OUT __OUT)
- find_next(${_IN} _NEXTINDEX)
- string(SUBSTRING "${_IN}" ${_INDEX} ${_NEXTINDEX} _TMP)
- math(EXPR _NEXTINDEX ${_NEXTINDEX}+1)
- string(SUBSTRING "${_IN}" ${_NEXTINDEX} -1 __TMP)
- set(${_OUT} ${_TMP} PARENT_SCOPE)
- set(${__OUT} ${__TMP} PARENT_SCOPE)
- endfunction(sub_next _IN _INDEX _OUT)
- function(trim_str _IN _OUT)
- string(STRIP "${_IN}" _TMP)
- set(${_OUT} ${_TMP} PARENT_SCOPE)
- endfunction(trim_str _IN _OUT)
- function(split_str _IN _SEP _OUT)
- string(FIND "${_IN}" "${_SEP}" _TMP_INDEX)
- if(NOT _TMP_INDEX EQUAL -1)
- string(SUBSTRING "${_IN}" 0 ${_TMP_INDEX} _TMP)
- math(EXPR _TMP_INDEX ${_TMP_INDEX}+1)
- string(SUBSTRING "${_IN}" ${_TMP_INDEX} -1 __TMP)
- set(${_OUT} "${_TMP};${__TMP}" PARENT_SCOPE)
- else()
- set(${_OUT} ${_IN} PARENT_SCOPE)
- endif(NOT _TMP_INDEX EQUAL -1)
- endfunction(split_str _IN _SEP _OUT)
- function(split_str_p _IN _SEP _OUT __OUT)
- split_str("${_IN}" "${_SEP}" _TMP)
- list(GET _TMP 0 __TMP)
- list(GET _TMP 1 ___TMP)
- set(${_OUT} ${__TMP} PARENT_SCOPE)
- set(${__OUT} ${___TMP} PARENT_SCOPE)
- endfunction(split_str_p _IN _SEP _OUT __OUT)
- function(split_str_n _IN _SEP _OUT _N)
- if(_N GREATER 1)
- set(_C ${_N})
- set(_RET "")
- set(_NEXT ${_IN})
- while(NOT _C EQUAL 0)
- split_str("${_NEXT}" "${_SEP}" _TMP)
- list(LENGTH _TMP _TMP_LEN)
- if(_TMP_LEN EQUAL 2)
- list(GET _TMP 0 __TMP)
- list(GET _TMP 1 _NEXT)
- list(APPEND _RET ${__TMP})
- else()
- break()
- endif(_TMP_LEN EQUAL 2)
- math(EXPR _C "${_C}-1")
- endwhile(NOT _C EQUAL 0)
- list(APPEND _RET ${_NEXT})
- set(${_OUT} ${_RET} PARENT_SCOPE)
- else()
- split_str("${_IN}" "${_SEP}" _TMP)
- set(${_OUT} ${_TMP} PARENT_SCOPE)
- endif(_N GREATER 1)
- endfunction(split_str_n _IN _SEP _OUT _N)
- function(set_package_vars _IN_KEY _IN_VAL)
- # trim_str("${_IN_KEY}" _IN_KEY)
- find_str("${_IN_KEY}" "Type" _Type)
- if(_Type EQUAL "0")
- string(TOUPPER "${_IN_VAL}" _IN_VAL_UPPER)
- string(TOLOWER "${_IN_VAL}" _IN_VAL_LOWER)
- set(CPACK_GENERATOR "${_IN_VAL_UPPER}" PARENT_SCOPE)
- message("--> 软件包类型: ${_IN_VAL_LOWER}")
- endif(_Type EQUAL "0")
- find_str("${_IN_KEY}" "Package" _Package)
- if(_Package EQUAL "0")
- if(_IN_VAL STREQUAL "auto")
- set(CPACK_DEBIAN_PACKAGE_NAME "${PROJECT_NAME}" PARENT_SCOPE)
- else()
- set(CPACK_DEBIAN_PACKAGE_NAME "${_IN_VAL}" PARENT_SCOPE)
- endif(_IN_VAL STREQUAL "auto")
- message("--> 软件包名: ${_IN_VAL}")
- endif(_Package EQUAL "0")
- find_str("${_IN_KEY}" "Version" _Version)
- if(_Version EQUAL "0")
- if(_IN_VAL STREQUAL "auto")
- set(CPACK_DEBIAN_PACKAGE_VERSION "${PROJECT_VERSION}" PARENT_SCOPE)
- else()
- set(CPACK_DEBIAN_PACKAGE_VERSION "${_IN_VAL}" PARENT_SCOPE)
- endif(_IN_VAL STREQUAL "auto")
-
- message("--> 软件版本: ${_IN_VAL}")
- endif(_Version EQUAL "0")
- find_str("${_IN_KEY}" "CalVer" _CalVer)
- if(_CalVer EQUAL "0")
- set(CalVer "${_IN_VAL}" PARENT_SCOPE)
- message("--> 日历化版本: ${_IN_VAL}")
- endif(_CalVer EQUAL "0")
- find_str("${_IN_KEY}" "OSD" _OSDVer)
- if(_OSDVer EQUAL "0")
- set(OSDVer "${_IN_VAL}" PARENT_SCOPE)
- message("--> 声明发行版号: ${_IN_VAL}")
- endif(_OSDVer EQUAL "0")
- find_str("${_IN_KEY}" "Architecture" _Architecture)
- if(_Architecture EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${_IN_VAL}" PARENT_SCOPE)
- if(_IN_VAL STREQUAL "auto")
- execute_process(
- COMMAND dpkg --print-architecture
- OUTPUT_VARIABLE _RETV
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
- set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${_RETV}" PARENT_SCOPE)
- endif(_IN_VAL STREQUAL "auto")
- message("--> 软件架构: ${_IN_VAL}")
- endif(_Architecture EQUAL "0")
-
- find_str("${_IN_KEY}" "Priority" _Priority)
- if(_Priority EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_PRIORITY "${_IN_VAL}" PARENT_SCOPE)
- message("--> 优先级: ${_IN_VAL}")
- endif(_Priority EQUAL "0")
- find_str("${_IN_KEY}" "Depends" _Depends)
- if(_Depends EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_DEPENDS "${_IN_VAL}" PARENT_SCOPE)
- message("--> 软件依赖: ${_IN_VAL}")
- endif(_Depends EQUAL "0")
- find_str("${_IN_KEY}" "Maintainer" _Maintainer)
- if(_Maintainer EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${_IN_VAL}" PARENT_SCOPE)
- message("--> 软件维护者: ${_IN_VAL}")
- endif(_Maintainer EQUAL "0")
- find_str("${_IN_KEY}" "Homepage" _Homepage)
- if(_Homepage EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${_IN_VAL}" PARENT_SCOPE)
- message("--> 软件主页: ${_IN_VAL}")
- endif(_Homepage EQUAL "0")
- find_str("${_IN_KEY}" "Recommends" _Recommends)
- if(_Recommends EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "${_IN_VAL}" PARENT_SCOPE)
- message("--> 软件建议: ${_IN_VAL}")
- endif(_Recommends EQUAL "0")
- find_str("${_IN_KEY}" "Conflicts" _Conflicts)
- if(_Conflicts EQUAL "0")
- set(CPACK_DEBIAN_PACKAGE_CONFLICTS "${_IN_VAL}" PARENT_SCOPE)
- message("--> 软件冲突: ${_IN_VAL}")
- endif(_Conflicts EQUAL "0")
-
- endfunction(set_package_vars _IN_KEY _IN_VAL)
- # 定义一个自定义(add_package_descript)函数
- # 用于按特定配置约定自动化构建软件包配置
- function(add_package_descript IN_DES)
- set(PACKAGE_DES_PATH "${IN_DES}")
- if(EXISTS ${IN_DES})
- elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
- set(PACKAGE_DES_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${IN_DES}")
- else()
- message(FATAL_ERROR "!! Not Found Path: ${PACKAGE_DES_PATH}")
- return()
- endif(EXISTS ${IN_DES})
-
- file(READ ${PACKAGE_DES_PATH} DES_CONTENT)
- trim_str("${DES_CONTENT}" DES_CONTENT)
- ################## 解析 ##################
- sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
- set(PREV_DES "")
- while(NOT DES_LINE STREQUAL "${PREV_DES}")
- # 检查该描述行是否是 # 注释开头,是的话将跳过该行
- find_str("${DES_LINE}" "#" _COMMENT)
- if(_COMMENT EQUAL "0")
- message("--> !!!!!!! ${DES_LINE}")
- sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
- continue()
- endif(_COMMENT EQUAL "0")
- # 检查该描述行是否是 Descrition 开头,是的话说明描述结尾了
- find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
- if(_DESCRIPTION EQUAL "0")
- break()
- endif(_DESCRIPTION EQUAL "0")
- split_str_n("${DES_LINE}" ":" _TMP 1)
- list(LENGTH _TMP _TMP_LEN)
- if(_TMP_LEN EQUAL 2)
- split_str_p("${DES_LINE}" ":" _TMP __TMP)
- trim_str("${__TMP}" __TMP)
- string(LENGTH "${__TMP}" __TMP_LENGTH)
- if(NOT __TMP_LENGTH EQUAL "0")
- set_package_vars("${_TMP}" "${__TMP}")
- endif(NOT __TMP_LENGTH EQUAL "0")
- endif(_TMP_LEN EQUAL 2)
- # 记录当前行,获取下一行,可能是已经结尾了(将保持重复行)
- set(PREV_DES "${DES_LINE}")
- sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
- endwhile(NOT DES_LINE STREQUAL "${PREV_DES}")
- # 再一次检查该描述行是否是 Descrition 开头,是的话将进行分析描述行
- find_str("${DES_LINE}" "Descrition" _DESCRIPTION)
- if(_DESCRIPTION EQUAL "0")
- split_str_p("${DES_LINE}" ":" _TMP __TMP)
- trim_str("${__TMP}" __TMP)
- set(Descrition ${__TMP})
- set(PREV_DES_LINE "")
- while(NOT PREV_DES_LINE STREQUAL DES_LINE)
- if(NOT PREV_DES_LINE STREQUAL "")
- if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
- set(Descrition "${Descrition}\n${DES_LINE}")
- else()
- string(STRIP "${DES_LINE}" STRIP_DES_LINE)
- set(Descrition "${Descrition}\n${STRIP_DES_LINE}")
- endif("${CMAKE_VERSION}" VERSION_LESS "3.15")
- endif(NOT PREV_DES_LINE STREQUAL "")
- set(PREV_DES_LINE "${DES_LINE}")
- sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT)
- endwhile(NOT PREV_DES_LINE STREQUAL DES_LINE)
- # set(Descrition "${Descrition}")
- message("--> 软件说明: ${Descrition}")
- set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition})
- endif(_DESCRIPTION EQUAL "0")
- ##################### deb #####################
- # ARCHITECTURE
- if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
- set(ARCHITECTURE "amd64")
- elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
- set(ARCHITECTURE "arm64")
- endif()
- #################### Calendar Version ###################
- if("${CalVer}" STREQUAL "true")
- string(TIMESTAMP BUILD_TIME "%Y%m%d")
- set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_DEBIAN_PACKAGE_VERSION}-${BUILD_TIME}")
- endif("${CalVer}" STREQUAL "true")
- ####################### OS Release ######################
- if("${OSDVer}" STREQUAL "true")
- exec_program(lsb_release ARGS -si
- OUTPUT_VARIABLE _OSI
- )
- exec_program(lsb_release ARGS -sr
- OUTPUT_VARIABLE _OSR
- )
- if(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
- set(PACKAGE_SUFFIX "${PACKAGE_SUFFIX}_${_OSI}${_OSR}")
- endif(NOT "${_OSI}" STREQUAL "" AND NOT "${_OSR}" STREQUAL "")
- endif("${OSDVer}" STREQUAL "true")
-
- ##################### deb file name #####################
- set(_Package "${CPACK_DEBIAN_PACKAGE_NAME}")
- set(_Version "${CPACK_DEBIAN_PACKAGE_VERSION}")
- set(_Architecture "${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
- set(_DebFileName
- "${_Package}_${_Version}_${_Architecture}${PACKAGE_SUFFIX}.deb"
- )
- set(CPACK_DEBIAN_FILE_NAME ${_DebFileName})
- # 标识: spark-deb-package
- if(NOT "${PACKAGE_SUFFIX}" STREQUAL "")
- # eg: remove '_' of '_Debian'
- string(SUBSTRING "${PACKAGE_SUFFIX}" 1 -1 DISTRIBUTION)
- if ("${CMAKE_VERSION}" VERSION_LESS "3.15")
- set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}\n .\n Build for ${DISTRIBUTION} through spark-deb-build.")
- else()
- set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition} "\n.\nBuild for ${DISTRIBUTION} through spark-deb-build.")
- endif("${CMAKE_VERSION}" VERSION_LESS "3.15")
-
- endif(NOT "${PACKAGE_SUFFIX}" STREQUAL "")
- # set(CPACK_DEBIAN_PACKAGE_NAME "${Package}")
- # set(CPACK_DEBIAN_PACKAGE_VERSION "${Version}")
- # set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${Architecture}")
- # set(CPACK_DEBIAN_PACKAGE_DEPENDS "${Depends}")
- # set(CPACK_DEBIAN_PACKAGE_PRIORITY "${Priority}")
- # set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${Maintainer}")
- # set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}")
- # 设置即将使用的标准脚本
- # set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
- # "${CMAKE_SOURCE_DIR}/config/DEBIAN/preinst"
- # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postinst"
- # "${CMAKE_SOURCE_DIR}/config/DEBIAN/prerm"
- # "${CMAKE_SOURCE_DIR}/config/DEBIAN/postrm"
- # )
- # 设置为ON,以便使用 dpkg-shlibdeps 生成更好的包依赖列表。
- # set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
- # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON)
- # set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")
- include(CPack)
- endfunction(add_package_descript IN_DES)
- # TODO:
- # CPACK_GENERATOR
- # CPACK_DEBIAN_FILE_NAME - n
- # CPACK_DEBIAN_PACKAGE_NAME - y
- # CPACK_DEBIAN_PACKAGE_VERSION - y
- # CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto) -> dpkg --print-architecture
- # CPACK_DEBIAN_PACKAGE_DEPENDS - y
- # CPACK_DEBIAN_PACKAGE_PRIORITY - y
- # CPACK_DEBIAN_PACKAGE_MAINTAINER - y
- # CPACK_DEBIAN_PACKAGE_DESCRIPTION - y
- # ARCHITECTURE
- # if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
- # set(ARCHITECTURE "amd64")
- # elseif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
- # set(ARCHITECTURE "arm64")
- # endif()
- # string(TIMESTAMP BUILD_TIME "%Y%m%d")
|