ObsHelpers.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir")
  2. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  3. set(_lib_suffix 64)
  4. else()
  5. set(_lib_suffix 32)
  6. endif()
  7. if(WIN32 OR APPLE)
  8. set(_struct_def FALSE)
  9. else()
  10. set(_struct_def TRUE)
  11. endif()
  12. option(INSTALLER_RUN "Build a multiarch installer, needs to run indenepdently after both archs have compiled" FALSE)
  13. option(UNIX_STRUCTURE "Build with standard unix filesystem structure" ${_struct_def})
  14. if(APPLE)
  15. option(BUILD_REDISTRIBUTABLE "Fix rpath of external libraries" FALSE)
  16. endif()
  17. if(INSTALLER_RUN AND NOT DEFINED ENV{obsInstallerTempDir})
  18. message(FATAL_ERROR "Environment variable obsInstallerTempDir is needed for multiarch installer generation")
  19. endif()
  20. if(DEFINED ENV{obsInstallerTempDir})
  21. file(TO_CMAKE_PATH "$ENV{obsInstallerTempDir}" ENV{obsInstallerTempDir})
  22. endif()
  23. if(DEFINED ENV{obsAdditionalInstallFiles})
  24. file(TO_CMAKE_PATH "$ENV{obsAdditionalInstallFiles}" ENV{obsAdditionalInstallFiles})
  25. endif()
  26. if(NOT UNIX_STRUCTURE)
  27. set(OBS_DATA_DESTINATION "data")
  28. if(APPLE)
  29. set(OBS_EXECUTABLE_DESTINATION "bin")
  30. set(OBS_EXECUTABLE32_DESTINATION "bin")
  31. set(OBS_EXECUTABLE64_DESTINATION "bin")
  32. set(OBS_LIBRARY_DESTINATION "bin")
  33. set(OBS_LIBRARY32_DESTINATION "bin")
  34. set(OBS_LIBRARY64_DESTINATION "bin")
  35. set(OBS_PLUGIN_DESTINATION "obs-plugins")
  36. set(OBS_PLUGIN32_DESTINATION "obs-plugins")
  37. set(OBS_PLUGIN64_DESTINATION "obs-plugins")
  38. add_definitions(-DOBS_DATA_PATH="../${OBS_DATA_DESTINATION}")
  39. else()
  40. set(OBS_EXECUTABLE_DESTINATION "bin/${_lib_suffix}bit")
  41. set(OBS_EXECUTABLE32_DESTINATION "bin/32bit")
  42. set(OBS_EXECUTABLE64_DESTINATION "bin/64bit")
  43. set(OBS_LIBRARY_DESTINATION "bin/${_lib_suffix}bit")
  44. set(OBS_LIBRARY32_DESTINATION "bin/32bit")
  45. set(OBS_LIBRARY64_DESTINATION "bin/64bit")
  46. set(OBS_PLUGIN_DESTINATION "obs-plugins/${_lib_suffix}bit")
  47. set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit")
  48. set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit")
  49. add_definitions(-DOBS_DATA_PATH="../../${OBS_DATA_DESTINATION}")
  50. endif()
  51. set(OBS_CMAKE_DESTINATION "cmake")
  52. set(OBS_INCLUDE_DESTINATION "include")
  53. else()
  54. set(OBS_EXECUTABLE_DESTINATION "bin")
  55. set(OBS_EXECUTABLE32_DESTINATION "bin32")
  56. set(OBS_EXECUTABLE64_DESTINATION "bin64")
  57. set(OBS_LIBRARY_DESTINATION "lib")
  58. set(OBS_LIBRARY32_DESTINATION "lib32")
  59. set(OBS_LIBRARY64_DESTINATION "lib64")
  60. set(OBS_PLUGIN_DESTINATION "lib/obs-plugins")
  61. set(OBS_PLUGIN32_DESTINATION "lib32/obs-plugins")
  62. set(OBS_PLUGIN64_DESTINATION "lib64/obs-plugins")
  63. set(OBS_DATA_DESTINATION "share/obs")
  64. set(OBS_CMAKE_DESTINATION "lib/cmake")
  65. set(OBS_INCLUDE_DESTINATION "include/obs")
  66. add_definitions(-DOBS_DATA_PATH="${OBS_DATA_DESTINATION}")
  67. add_definitions(-DOBS_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/")
  68. endif()
  69. function(obs_finish_bundle)
  70. if(NOT APPLE OR UNIX_STRUCTURE)
  71. return()
  72. endif()
  73. install(CODE
  74. "if(DEFINED ENV{FIXUP_BUNDLE})
  75. execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/cmake/osxbundle/fixup_bundle.sh\" . bin WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\")
  76. endif()")
  77. endfunction()
  78. function(obs_generate_multiarch_installer)
  79. install(DIRECTORY "$ENV{obsInstallerTempDir}/"
  80. DESTINATION "."
  81. USE_SOURCE_PERMISSIONS)
  82. endfunction()
  83. function(obs_install_additional)
  84. set(addfdir "${CMAKE_SOURCE_DIR}/additional_install_files")
  85. if(DEFINED ENV{obsAdditionalInstallFiles})
  86. set(addfdir "$ENV{obsAdditionalInstallFiles}")
  87. endif()
  88. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  89. set(_lib_suffix 64)
  90. else()
  91. set(_lib_suffix 32)
  92. endif()
  93. install(DIRECTORY "${addfdir}/misc/"
  94. DESTINATION "."
  95. USE_SOURCE_PERMISSIONS
  96. PATTERN ".gitignore" EXCLUDE)
  97. install(DIRECTORY "${addfdir}/data/"
  98. DESTINATION "${OBS_DATA_DESTINATION}"
  99. USE_SOURCE_PERMISSIONS
  100. PATTERN ".gitignore" EXCLUDE)
  101. if(INSTALLER_RUN)
  102. install(DIRECTORY "${addfdir}/libs32/"
  103. DESTINATION "${OBS_LIBRARY32_DESTINATION}"
  104. USE_SOURCE_PERMISSIONS
  105. PATTERN ".gitignore" EXCLUDE)
  106. install(DIRECTORY "${addfdir}/exec32/"
  107. DESTINATION "${OBS_EXECUTABLE32_DESTINATION}"
  108. USE_SOURCE_PERMISSIONS
  109. PATTERN ".gitignore" EXCLUDE)
  110. install(DIRECTORY "${addfdir}/libs64/"
  111. DESTINATION "${OBS_LIBRARY64_DESTINATION}"
  112. USE_SOURCE_PERMISSIONS
  113. PATTERN ".gitignore" EXCLUDE)
  114. install(DIRECTORY "${addfdir}/exec64/"
  115. DESTINATION "${OBS_EXECUTABLE64_DESTINATION}"
  116. USE_SOURCE_PERMISSIONS
  117. PATTERN ".gitignore" EXCLUDE)
  118. else()
  119. install(DIRECTORY "${addfdir}/libs${_lib_suffix}/"
  120. DESTINATION "${OBS_LIBRARY_DESTINATION}"
  121. USE_SOURCE_PERMISSIONS
  122. PATTERN ".gitignore" EXCLUDE)
  123. install(DIRECTORY "${addfdir}/exec${_lib_suffix}/"
  124. DESTINATION "${OBS_EXECUTABLE_DESTINATION}"
  125. USE_SOURCE_PERMISSIONS
  126. PATTERN ".gitignore" EXCLUDE)
  127. endif()
  128. endfunction()
  129. macro(export_obs_core target exportname)
  130. install(TARGETS ${target}
  131. EXPORT "${exportname}Target"
  132. LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}"
  133. ARCHIVE DESTINATION "${OBS_LIBRARY_DESTINATION}"
  134. RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}")
  135. export(TARGETS ${target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${exportname}Target.cmake")
  136. export(PACKAGE "${exportname}")
  137. set(CONF_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
  138. set(CONF_PLUGIN_DEST "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/${_lib_suffix}bit")
  139. set(CONF_PLUGIN_DEST32 "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/32bit")
  140. set(CONF_PLUGIN_DEST64 "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/64bit")
  141. configure_file("${exportname}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${exportname}Config.cmake" @ONLY)
  142. file(RELATIVE_PATH _pdir "${CMAKE_INSTALL_PREFIX}/${OBS_CMAKE_DESTINATION}/${exportname}" "${CMAKE_INSTALL_PREFIX}")
  143. set(CONF_INCLUDE_DIRS "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_INCLUDE_DESTINATION}")
  144. set(CONF_PLUGIN_DEST "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN_DESTINATION}")
  145. set(CONF_PLUGIN_DEST32 "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN32_DESTINATION}")
  146. set(CONF_PLUGIN_DEST64 "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN64_DESTINATION}")
  147. configure_file("${exportname}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${exportname}Config.cmake" @ONLY)
  148. set(_pdir)
  149. configure_file("${exportname}ConfigVersion.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${exportname}ConfigVersion.cmake" @ONLY)
  150. install(FILES
  151. "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${exportname}Config.cmake"
  152. "${CMAKE_CURRENT_BINARY_DIR}/${exportname}ConfigVersion.cmake"
  153. DESTINATION "${OBS_CMAKE_DESTINATION}/${exportname}")
  154. install(EXPORT "${exportname}Target"
  155. DESTINATION "${OBS_CMAKE_DESTINATION}/${exportname}")
  156. endmacro()
  157. macro(install_obs_headers)
  158. foreach(hdr ${ARGN})
  159. if(IS_ABSOLUTE "${hdr}")
  160. set(subdir)
  161. else()
  162. get_filename_component(subdir "${hdr}" DIRECTORY)
  163. if(subdir)
  164. set(subdir "/${subdir}")
  165. endif()
  166. endif()
  167. install(FILES "${hdr}" DESTINATION "${OBS_INCLUDE_DESTINATION}${subdir}")
  168. endforeach()
  169. endmacro()
  170. macro(install_obs_core target)
  171. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  172. set(_bit_suffix "64bit/")
  173. else()
  174. set(_bit_suffix "32bit/")
  175. endif()
  176. if(APPLE)
  177. set(_bit_suffix "")
  178. endif()
  179. if("${ARGV1}" STREQUAL "EXPORT")
  180. export_obs_core("${target}" "${ARGV2}")
  181. else()
  182. install(TARGETS ${target}
  183. LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}"
  184. RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}")
  185. endif()
  186. add_custom_command(TARGET ${target} POST_BUILD
  187. COMMAND "${CMAKE_COMMAND}" -E copy
  188. "$<TARGET_FILE:${target}>"
  189. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/bin/${_bit_suffix}$<TARGET_FILE_NAME:${target}>"
  190. VERBATIM)
  191. if(DEFINED ENV{obsInstallerTempDir})
  192. get_property(target_type TARGET ${target} PROPERTY TYPE)
  193. if("${target_type}" STREQUAL "EXECUTABLE")
  194. set(tmp_target_dir "${OBS_EXECUTABLE_DESTINATION}")
  195. else()
  196. set(tmp_target_dir "${OBS_LIBRARY_DESTINATION}")
  197. endif()
  198. add_custom_command(TARGET ${target} POST_BUILD
  199. COMMAND "${CMAKE_COMMAND}" -E copy
  200. "$<TARGET_FILE:${target}>" "$ENV{obsInstallerTempDir}/${tmp_target_dir}/$<TARGET_FILE_NAME:${target}>"
  201. VERBATIM)
  202. endif()
  203. endmacro()
  204. macro(install_obs_plugin target)
  205. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  206. set(_bit_suffix "64bit/")
  207. else()
  208. set(_bit_suffix "32bit/")
  209. endif()
  210. if(APPLE)
  211. set(_bit_suffix "")
  212. endif()
  213. install(TARGETS ${target}
  214. LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}"
  215. RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}")
  216. add_custom_command(TARGET ${target} POST_BUILD
  217. COMMAND "${CMAKE_COMMAND}" -E copy
  218. "$<TARGET_FILE:${target}>"
  219. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/obs-plugins/${_bit_suffix}$<TARGET_FILE_NAME:${target}>"
  220. VERBATIM)
  221. if(DEFINED ENV{obsInstallerTempDir})
  222. add_custom_command(TARGET ${target} POST_BUILD
  223. COMMAND "${CMAKE_COMMAND}" -E copy
  224. "$<TARGET_FILE:${target}>" "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/$<TARGET_FILE_NAME:${target}>"
  225. VERBATIM)
  226. endif()
  227. endmacro()
  228. macro(install_obs_data target datadir datadest)
  229. install(DIRECTORY ${datadir}/
  230. DESTINATION "${OBS_DATA_DESTINATION}/${datadest}"
  231. USE_SOURCE_PERMISSIONS)
  232. add_custom_command(TARGET ${target} POST_BUILD
  233. COMMAND "${CMAKE_COMMAND}" -E copy_directory
  234. "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/${datadest}"
  235. VERBATIM)
  236. if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir})
  237. add_custom_command(TARGET ${target} POST_BUILD
  238. COMMAND "${CMAKE_COMMAND}" -E copy_directory
  239. "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}"
  240. VERBATIM)
  241. endif()
  242. endmacro()
  243. macro(install_obs_datatarget target datadest)
  244. install(TARGETS ${target}
  245. LIBRARY DESTINATION "${OBS_DATA_DESTINATION}/${datadest}"
  246. RUNTIME DESTINATION "${OBS_DATA_DESTINATION}/${datadest}")
  247. add_custom_command(TARGET ${target} POST_BUILD
  248. COMMAND "${CMAKE_COMMAND}" -E copy
  249. "$<TARGET_FILE:${target}>"
  250. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/${datadest}/$<TARGET_FILE_NAME:${target}>"
  251. VERBATIM)
  252. if(DEFINED ENV{obsInstallerTempDir})
  253. add_custom_command(TARGET ${target} POST_BUILD
  254. COMMAND "${CMAKE_COMMAND}" -E copy
  255. "$<TARGET_FILE:${target}>"
  256. "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}/$<TARGET_FILE_NAME:${target}>"
  257. VERBATIM)
  258. endif()
  259. endmacro()
  260. macro(install_obs_plugin_data target datadir)
  261. install_obs_plugin(${target})
  262. install_obs_data(${target} "${datadir}" "obs-plugins/${target}")
  263. endmacro()