CMakeLists.txt 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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
  53. obs-scripting-callback.h)
  54. target_link_libraries(obs-scripting PRIVATE OBS::libobs)
  55. target_compile_features(obs-scripting PRIVATE cxx_auto_type)
  56. target_include_directories(obs-scripting PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
  57. ${CMAKE_BINARY_DIR}/config)
  58. if(OS_WINDOWS)
  59. set(MODULE_DESCRIPTION "OBS Studio scripting module")
  60. configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
  61. obs-scripting.rc)
  62. target_sources(obs-scripting PRIVATE obs-scripting.rc)
  63. target_link_libraries(obs-scripting PRIVATE OBS::w32-pthreads)
  64. elseif(OS_MACOS)
  65. target_link_libraries(obs-scripting PRIVATE objc)
  66. endif()
  67. set_target_properties(
  68. obs-scripting
  69. PROPERTIES FOLDER "scripting"
  70. VERSION "${OBS_VERSION_MAJOR}"
  71. SOVERSION "1")
  72. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swig)
  73. if(TARGET Luajit::Luajit)
  74. add_custom_command(
  75. OUTPUT swig/swigluarun.h
  76. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  77. PRE_BUILD
  78. COMMAND ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE}
  79. -lua -external-runtime swig/swigluarun.h
  80. COMMENT "obs-scripting - generating Luajit SWIG interface headers")
  81. set_source_files_properties(swig/swigluarun.h PROPERTIES GENERATED ON)
  82. target_link_libraries(obs-scripting PRIVATE Luajit::Luajit)
  83. target_sources(
  84. obs-scripting
  85. PRIVATE obs-scripting-lua.c obs-scripting-lua.h obs-scripting-lua-source.c
  86. ${CMAKE_CURRENT_BINARY_DIR}/swig/swigluarun.h)
  87. target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
  88. if(ENABLE_UI)
  89. target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
  90. target_sources(obs-scripting PRIVATE obs-scripting-lua-frontend.c)
  91. target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
  92. endif()
  93. endif()
  94. if(TARGET Python::Python)
  95. add_custom_command(
  96. OUTPUT swig/swigpyrun.h
  97. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  98. PRE_BUILD
  99. COMMAND
  100. ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE} -python
  101. $<IF:$<AND:$<BOOL:${OS_POSIX}>,$<NOT:$<BOOL:${OS_MACOS}>>>,-py3,-py3-stable-abi>
  102. -external-runtime swig/swigpyrun.h
  103. COMMENT "obs-scripting - generating Python 3 SWIG interface headers")
  104. set_source_files_properties(swig/swigpyrun.h PROPERTIES GENERATED ON)
  105. target_sources(
  106. obs-scripting
  107. PRIVATE obs-scripting-python.c obs-scripting-python.h
  108. obs-scripting-python-import.h
  109. ${CMAKE_CURRENT_BINARY_DIR}/swig/swigpyrun.h)
  110. target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
  111. get_filename_component(_PYTHON_PATH "${Python_LIBRARIES}" PATH)
  112. get_filename_component(_PYTHON_FILE "${Python_LIBRARIES}" NAME)
  113. string(REGEX REPLACE "\\.[^.]*$" "" _PYTHON_FILE ${_PYTHON_FILE})
  114. if(OS_WINDOWS)
  115. string(REGEX REPLACE "_d" "" _PYTHON_FILE ${_PYTHON_FILE})
  116. endif()
  117. set(OBS_SCRIPT_PYTHON_PATH "${_PYTHON_FILE}")
  118. unset(_PYTHON_FILE)
  119. unset(_PYTHON_PATH)
  120. if(OS_WINDOWS OR OS_MACOS)
  121. target_include_directories(obs-scripting PRIVATE ${Python_INCLUDE_DIRS})
  122. target_sources(obs-scripting PRIVATE obs-scripting-python-import.c)
  123. if(OS_MACOS)
  124. target_link_options(obs-scripting PRIVATE -undefined dynamic_lookup)
  125. endif()
  126. else()
  127. target_link_libraries(obs-scripting PRIVATE Python::Python)
  128. endif()
  129. if(ENABLE_UI)
  130. target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
  131. target_sources(obs-scripting PRIVATE obs-scripting-python-frontend.c)
  132. target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
  133. endif()
  134. endif()
  135. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs-scripting-config.h.in
  136. ${CMAKE_BINARY_DIR}/config/obs-scripting-config.h)
  137. target_sources(obs-scripting
  138. PUBLIC ${CMAKE_BINARY_DIR}/config/obs-scripting-config.h)
  139. setup_binary_target(obs-scripting)