legacy.cmake 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. option(ENABLE_SCRIPTING_LUA "Enable Lua scripting support" ON)
  2. option(ENABLE_SCRIPTING_PYTHON "Enable Python scripting support" ON)
  3. if(NOT ENABLE_SCRIPTING)
  4. obs_status(DISABLED "obs-scripting")
  5. return()
  6. endif()
  7. project(obs-scripting)
  8. if(ENABLE_SCRIPTING_LUA)
  9. add_subdirectory(obslua)
  10. find_package(Luajit)
  11. if(NOT TARGET Luajit::Luajit)
  12. obs_status(FATAL_ERROR "obs-scripting -> Luajit not found.")
  13. return()
  14. else()
  15. obs_status(STATUS "obs-scripting -> Luajit found.")
  16. endif()
  17. else()
  18. obs_status(DISABLED "Luajit support")
  19. endif()
  20. if(ENABLE_SCRIPTING_PYTHON)
  21. add_subdirectory(obspython)
  22. if(OS_WINDOWS)
  23. find_package(PythonWindows)
  24. else()
  25. find_package(Python COMPONENTS Interpreter Development)
  26. endif()
  27. if(NOT TARGET Python::Python)
  28. obs_status(FATAL_ERROR "obs-scripting -> Python not found.")
  29. return()
  30. else()
  31. obs_status(STATUS "obs-scripting -> Python ${Python_VERSION} found.")
  32. endif()
  33. else()
  34. obs_status(DISABLED "Python support")
  35. endif()
  36. if(NOT TARGET Luajit::Luajit AND NOT TARGET Python::Python)
  37. obs_status(WARNING "obs-scripting -> No supported scripting libraries found.")
  38. return()
  39. endif()
  40. if(OS_MACOS)
  41. find_package(SWIG 4 REQUIRED)
  42. elseif(OS_POSIX)
  43. find_package(SWIG 3 REQUIRED)
  44. elseif(OS_WINDOWS)
  45. find_package(SwigWindows 3 REQUIRED)
  46. endif()
  47. add_library(obs-scripting SHARED)
  48. add_library(OBS::scripting ALIAS obs-scripting)
  49. target_sources(
  50. obs-scripting
  51. PUBLIC obs-scripting.h
  52. PRIVATE obs-scripting.c cstrcache.cpp cstrcache.h obs-scripting-logging.c obs-scripting-callback.h)
  53. target_link_libraries(obs-scripting PRIVATE OBS::libobs)
  54. target_compile_features(obs-scripting PRIVATE cxx_auto_type)
  55. target_include_directories(obs-scripting PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  56. if(OS_WINDOWS)
  57. set(MODULE_DESCRIPTION "OBS Studio scripting module")
  58. configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in obs-scripting.rc)
  59. target_sources(obs-scripting PRIVATE obs-scripting.rc)
  60. target_link_libraries(obs-scripting PRIVATE OBS::w32-pthreads)
  61. elseif(OS_MACOS)
  62. target_link_libraries(obs-scripting PRIVATE objc)
  63. endif()
  64. set_target_properties(
  65. obs-scripting
  66. PROPERTIES FOLDER "scripting"
  67. VERSION "${OBS_VERSION_MAJOR}"
  68. SOVERSION "1")
  69. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swig)
  70. if(TARGET Luajit::Luajit)
  71. add_custom_command(
  72. OUTPUT swig/swigluarun.h
  73. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  74. PRE_BUILD
  75. COMMAND ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE} -lua -external-runtime swig/swigluarun.h
  76. COMMENT "obs-scripting - generating Luajit SWIG interface headers")
  77. set_source_files_properties(swig/swigluarun.h PROPERTIES GENERATED ON)
  78. target_link_libraries(obs-scripting PRIVATE Luajit::Luajit)
  79. target_compile_definitions(obs-scripting PUBLIC LUAJIT_FOUND)
  80. target_sources(obs-scripting PRIVATE obs-scripting-lua.c obs-scripting-lua.h obs-scripting-lua-source.c
  81. ${CMAKE_CURRENT_BINARY_DIR}/swig/swigluarun.h)
  82. target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
  83. if(ENABLE_UI)
  84. target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
  85. target_sources(obs-scripting PRIVATE obs-scripting-lua-frontend.c)
  86. target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
  87. endif()
  88. endif()
  89. if(TARGET Python::Python)
  90. add_custom_command(
  91. OUTPUT swig/swigpyrun.h
  92. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  93. PRE_BUILD
  94. COMMAND
  95. ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE} -python
  96. $<IF:$<AND:$<BOOL:${OS_POSIX}>,$<NOT:$<BOOL:${OS_MACOS}>>>,-py3,-py3-stable-abi> -external-runtime
  97. swig/swigpyrun.h
  98. COMMENT "obs-scripting - generating Python 3 SWIG interface headers")
  99. set_source_files_properties(swig/swigpyrun.h PROPERTIES GENERATED ON)
  100. target_sources(obs-scripting PRIVATE obs-scripting-python.c obs-scripting-python.h obs-scripting-python-import.h
  101. ${CMAKE_CURRENT_BINARY_DIR}/swig/swigpyrun.h)
  102. target_compile_definitions(
  103. obs-scripting
  104. PRIVATE ENABLE_SCRIPTING PYTHON_LIB="$<TARGET_LINKER_FILE_NAME:Python::Python>"
  105. PUBLIC Python_FOUND)
  106. target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
  107. get_filename_component(_PYTHON_PATH "${Python_LIBRARIES}" PATH)
  108. get_filename_component(_PYTHON_FILE "${Python_LIBRARIES}" NAME)
  109. string(REGEX REPLACE "\\.[^.]*$" "" _PYTHON_FILE ${_PYTHON_FILE})
  110. if(OS_WINDOWS)
  111. string(REGEX REPLACE "_d" "" _PYTHON_FILE ${_PYTHON_FILE})
  112. endif()
  113. set(OBS_SCRIPT_PYTHON_PATH "${_PYTHON_FILE}")
  114. unset(_PYTHON_FILE)
  115. unset(_PYTHON_PATH)
  116. if(OS_WINDOWS OR OS_MACOS)
  117. target_include_directories(obs-scripting PRIVATE ${Python_INCLUDE_DIRS})
  118. target_sources(obs-scripting PRIVATE obs-scripting-python-import.c)
  119. if(OS_MACOS)
  120. target_link_options(obs-scripting PRIVATE -undefined dynamic_lookup)
  121. endif()
  122. else()
  123. target_link_libraries(obs-scripting PRIVATE Python::Python)
  124. endif()
  125. if(ENABLE_UI)
  126. target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
  127. target_sources(obs-scripting PRIVATE obs-scripting-python-frontend.c)
  128. target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
  129. endif()
  130. endif()
  131. target_compile_definitions(obs-scripting PRIVATE SCRIPT_DIR="${OBS_SCRIPT_PLUGIN_PATH}"
  132. $<$<BOOL:${ENABLE_UI}>:ENABLE_UI>)
  133. setup_binary_target(obs-scripting)