ObsHelpers.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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. function(obs_debug_copy_helper target dest)
  171. add_custom_command(TARGET ${target} POST_BUILD
  172. COMMAND "${CMAKE_COMMAND}"
  173. "-DCONFIG=$<CONFIGURATION>"
  174. "-DFNAME=$<TARGET_FILE_NAME:${target}>"
  175. "-DINPUT=$<TARGET_FILE_DIR:${target}>"
  176. "-DOUTPUT=${dest}"
  177. -P "${CMAKE_SOURCE_DIR}/cmake/copy_on_debug_helper.cmake"
  178. VERBATIM)
  179. endfunction()
  180. function(install_obs_pdb ttype target)
  181. if(NOT MSVC)
  182. return()
  183. endif()
  184. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  185. set(_bit_suffix "64bit")
  186. else()
  187. set(_bit_suffix "32bit")
  188. endif()
  189. obs_debug_copy_helper(${target} "${CMAKE_CURRENT_BINARY_DIR}/pdbs")
  190. if("${ttype}" STREQUAL "PLUGIN")
  191. obs_debug_copy_helper(${target} "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/obs-plugins/${_bit_suffix}")
  192. if(DEFINED ENV{obsInstallerTempDir})
  193. obs_debug_copy_helper(${target} "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}")
  194. endif()
  195. install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/"
  196. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  197. CONFIGURATIONS Debug RelWithDebInfo)
  198. else()
  199. obs_debug_copy_helper(${target} "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/bin/${_bit_suffix}")
  200. if(DEFINED ENV{obsInstallerTempDir})
  201. obs_debug_copy_helper(${target} "$ENV{obsInstallerTempDir}/${OBS_EXECUTABLE_DESTINATION}")
  202. endif()
  203. install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/"
  204. DESTINATION "${OBS_EXECUTABLE_DESTINATION}"
  205. CONFIGURATIONS Debug RelWithDebInfo)
  206. endif()
  207. endfunction()
  208. macro(install_obs_core target)
  209. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  210. set(_bit_suffix "64bit/")
  211. else()
  212. set(_bit_suffix "32bit/")
  213. endif()
  214. if(APPLE)
  215. set(_bit_suffix "")
  216. endif()
  217. if("${ARGV1}" STREQUAL "EXPORT")
  218. export_obs_core("${target}" "${ARGV2}")
  219. else()
  220. install(TARGETS ${target}
  221. LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}"
  222. RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}")
  223. endif()
  224. add_custom_command(TARGET ${target} POST_BUILD
  225. COMMAND "${CMAKE_COMMAND}" -E copy
  226. "$<TARGET_FILE:${target}>"
  227. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/bin/${_bit_suffix}$<TARGET_FILE_NAME:${target}>"
  228. VERBATIM)
  229. if(DEFINED ENV{obsInstallerTempDir})
  230. get_property(target_type TARGET ${target} PROPERTY TYPE)
  231. if("${target_type}" STREQUAL "EXECUTABLE")
  232. set(tmp_target_dir "${OBS_EXECUTABLE_DESTINATION}")
  233. else()
  234. set(tmp_target_dir "${OBS_LIBRARY_DESTINATION}")
  235. endif()
  236. add_custom_command(TARGET ${target} POST_BUILD
  237. COMMAND "${CMAKE_COMMAND}" -E copy
  238. "$<TARGET_FILE:${target}>"
  239. "$ENV{obsInstallerTempDir}/${tmp_target_dir}/$<TARGET_FILE_NAME:${target}>"
  240. VERBATIM)
  241. endif()
  242. install_obs_pdb(CORE ${target})
  243. endmacro()
  244. macro(install_obs_plugin target)
  245. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  246. set(_bit_suffix "64bit/")
  247. else()
  248. set(_bit_suffix "32bit/")
  249. endif()
  250. if(APPLE)
  251. set(_bit_suffix "")
  252. endif()
  253. install(TARGETS ${target}
  254. LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}"
  255. RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}")
  256. add_custom_command(TARGET ${target} POST_BUILD
  257. COMMAND "${CMAKE_COMMAND}" -E copy
  258. "$<TARGET_FILE:${target}>"
  259. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/obs-plugins/${_bit_suffix}$<TARGET_FILE_NAME:${target}>"
  260. VERBATIM)
  261. if(DEFINED ENV{obsInstallerTempDir})
  262. add_custom_command(TARGET ${target} POST_BUILD
  263. COMMAND "${CMAKE_COMMAND}" -E copy
  264. "$<TARGET_FILE:${target}>" "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/$<TARGET_FILE_NAME:${target}>"
  265. VERBATIM)
  266. endif()
  267. install_obs_pdb(PLUGIN ${target})
  268. endmacro()
  269. macro(install_obs_data target datadir datadest)
  270. install(DIRECTORY ${datadir}/
  271. DESTINATION "${OBS_DATA_DESTINATION}/${datadest}"
  272. USE_SOURCE_PERMISSIONS)
  273. add_custom_command(TARGET ${target} POST_BUILD
  274. COMMAND "${CMAKE_COMMAND}" -E copy_directory
  275. "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/${datadest}"
  276. VERBATIM)
  277. if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir})
  278. add_custom_command(TARGET ${target} POST_BUILD
  279. COMMAND "${CMAKE_COMMAND}" -E copy_directory
  280. "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}"
  281. VERBATIM)
  282. endif()
  283. endmacro()
  284. macro(install_obs_datatarget target datadest)
  285. install(TARGETS ${target}
  286. LIBRARY DESTINATION "${OBS_DATA_DESTINATION}/${datadest}"
  287. RUNTIME DESTINATION "${OBS_DATA_DESTINATION}/${datadest}")
  288. add_custom_command(TARGET ${target} POST_BUILD
  289. COMMAND "${CMAKE_COMMAND}" -E copy
  290. "$<TARGET_FILE:${target}>"
  291. "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/${datadest}/$<TARGET_FILE_NAME:${target}>"
  292. VERBATIM)
  293. if(DEFINED ENV{obsInstallerTempDir})
  294. add_custom_command(TARGET ${target} POST_BUILD
  295. COMMAND "${CMAKE_COMMAND}" -E copy
  296. "$<TARGET_FILE:${target}>"
  297. "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}/$<TARGET_FILE_NAME:${target}>"
  298. VERBATIM)
  299. endif()
  300. endmacro()
  301. macro(install_obs_plugin_data target datadir)
  302. install_obs_plugin(${target})
  303. install_obs_data(${target} "${datadir}" "obs-plugins/${target}")
  304. endmacro()