DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
4.9KB

  1. # DISTRHO Plugin Framework (DPF)
  2. # Copyright (C) 2019-2020 Benjamin Heisch <benjaminheisch@yahoo.de>
  3. #
  4. # Permission to use, copy, modify, and/or distribute this software for any purpose with
  5. # or without fee is hereby granted, provided that the above copyright notice and this
  6. # permission notice appear in all copies.
  7. #
  8. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  9. # TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  10. # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  11. # DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  12. # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. # This cmake-Module contains functions arround versioning.
  15. # set_version(MAJOR,MINOR,PATCH,BUILD) -> Sets the Version, if BUILD is not given, this
  16. # Module tries to detect the Build version with git or svn.
  17. #
  18. #
  19. #
  20. # SET_VERSION(1 0 1) or SET_VERSION(1 0 1 10204)
  21. # If the 4th Component not given, it will be detected with git or svn
  22. # (if git and svn are present(whatever this happened) git is preferred
  23. # this function use the current projectname.
  24. function(set_version major minor patch)
  25. set(TEMP_PROJECT_NAME ${PROJECT_NAME})
  26. #setze default_value
  27. if(NOT ARGV3)
  28. set(TEMP_CURRENT_REVISON 0)
  29. set_subversion_revision(TEMP_CURRENT_REVISON)
  30. set_git_revision(TEMP_CURRENT_REVISON)
  31. else(NOT ARGV3)
  32. set(TEMP_CURRENT_REVISON ${ARGV3})
  33. endif(NOT ARGV3)
  34. if(POLICY CMP0048)
  35. cmake_policy(SET CMP0048 NEW)
  36. endif(POLICY CMP0048)
  37. set(${TEMP_PROJECT_NAME}_VERSION "${major}.${minor}.${patch}.${TEMP_CURRENT_REVISON}" PARENT_SCOPE)
  38. set(${TEMP_PROJECT_NAME}_VERSION_MAJOR ${major} PARENT_SCOPE)
  39. set(${TEMP_PROJECT_NAME}_VERSION_MINOR ${minor} PARENT_SCOPE)
  40. set(${TEMP_PROJECT_NAME}_VERSION_PATCH ${patch} PARENT_SCOPE)
  41. set(${TEMP_PROJECT_NAME}_VERSION_TWEAK ${TEMP_CURRENT_REVISON} PARENT_SCOPE)
  42. message(STATUS "Set Version to: ${major}.${minor}.${patch}.${TEMP_CURRENT_REVISON}")
  43. endfunction(set_version)
  44. set(__DIR_OF_GENERATE_CMAKE ${CMAKE_CURRENT_LIST_DIR})
  45. # Can be called with OUTDIR and TARGET, if not provided OUTDIR is BIN_DIR/generated and TARGET is
  46. # the current PROJECT_NAME use itlike CREATE_VERSION_HEADER(TARGET Blub OUTDIR Bla)
  47. # the versionheader is included to the given target.
  48. function(CREATE_VERSION_HEADER)
  49. set(oneValueArgs OUTDIR TARGET)
  50. cmake_parse_arguments(CREATE_VERSION_HEADER "" "${oneValueArgs}" "" ${ARGN} )
  51. if(NOT CREATE_VERSION_HEADER_OUTDIR)
  52. set(CREATE_VERSION_HEADER_OUTDIR ${PROJECT_BINARY_DIR}/generated/)
  53. endif(NOT CREATE_VERSION_HEADER_OUTDIR)
  54. if(NOT CREATE_VERSION_HEADER_TARGET)
  55. set(CREATE_VERSION_HEADER_TARGET ${PROJECT_NAME})
  56. endif(NOT CREATE_VERSION_HEADER_TARGET)
  57. configure_file (
  58. ${__DIR_OF_GENERATE_CMAKE}/version.h.in
  59. "${CREATE_VERSION_HEADER_OUTDIR}/${CREATE_VERSION_HEADER_TARGET}_version.h"
  60. )
  61. target_include_directories(${CREATE_VERSION_HEADER_TARGET} PUBLIC ${CREATE_VERSION_HEADER_OUTDIR})
  62. endfunction(CREATE_VERSION_HEADER)
  63. #########################Helperfunctions#########################
  64. macro(set_git_revision internal_revision_var)
  65. find_package(Git)
  66. if(GIT_FOUND)
  67. set(possible_working_copies ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
  68. foreach(working_copy_path ${possible_working_copies})
  69. if(EXISTS "${working_copy_path}/.git")
  70. # Get the latest abbreviated commit hash of the working branch
  71. execute_process(
  72. COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
  73. WORKING_DIRECTORY ${working_copy_path}
  74. OUTPUT_VARIABLE GIT_COMMIT_HASH
  75. OUTPUT_STRIP_TRAILING_WHITESPACE
  76. )
  77. set(${internal_revision_var} "0x${GIT_COMMIT_HASH}")
  78. message(STATUS "Use current git-hash ${GIT_COMMIT_HASH} as tweak-version")
  79. break()
  80. endif(EXISTS "${working_copy_path}/.git")
  81. endforeach(working_copy_path)
  82. endif(GIT_FOUND)
  83. endmacro(set_git_revision)
  84. macro(set_subversion_revision internal_revision_var)
  85. find_package(Subversion)
  86. if(SUBVERSION_FOUND)
  87. set(possible_working_copies ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
  88. foreach(working_copy_path ${possible_working_copies})
  89. if(EXISTS "${working_copy_path}/.svn")
  90. Subversion_WC_INFO(${working_copy_path} TEMP_SVN_INFO_LOG)
  91. #Subversion_WC_LOG(${working_copy_path} TEMP_SVN_INFO_LOG)
  92. if(${TEMP_SVN_INFO_LOG_WC_REVISION})
  93. set(${internal_revision_var} ${TEMP_SVN_INFO_LOG_WC_REVISION})
  94. message(STATUS "Use current Subversion-Revision ${TEMP_SVN_INFO_LOG_WC_REVISION} as tweak-version")
  95. break()
  96. endif(${TEMP_SVN_INFO_LOG_WC_REVISION})
  97. endif(EXISTS "${working_copy_path}/.svn")
  98. endforeach(working_copy_path)
  99. endif(SUBVERSION_FOUND)
  100. endmacro(set_subversion_revision)