64efcd155d
Due to swig using a hardcoded swig library path in self-compiled variants, we need to pass our custom swig library path with every invocation of swig on macOS. CMake's `add_custom_command` function does _not_ inherit the environment variables used during configuration, hence why it needs to be passed explicitly on invocation. Usage of CMake's "-E env" command module should allow for cross-platform compatible invocation.
182 lines
5.3 KiB
CMake
182 lines
5.3 KiB
CMake
option(ENABLE_SCRIPTING_LUA "Enable Lua scripting support" ON)
|
|
option(ENABLE_SCRIPTING_PYTHON "Enable Python scripting support" ON)
|
|
|
|
if(NOT ENABLE_SCRIPTING)
|
|
obs_status(DISABLED "obs-scripting")
|
|
return()
|
|
endif()
|
|
|
|
project(obs-scripting)
|
|
|
|
if(ENABLE_SCRIPTING_LUA)
|
|
add_subdirectory(obslua)
|
|
find_package(Luajit)
|
|
|
|
if(NOT TARGET Luajit::Luajit)
|
|
obs_status(FATAL_ERROR "obs-scripting -> Luajit not found.")
|
|
return()
|
|
else()
|
|
obs_status(STATUS "obs-scripting -> Luajit found.")
|
|
endif()
|
|
else()
|
|
obs_status(DISABLED "Luajit support")
|
|
endif()
|
|
|
|
if(ENABLE_SCRIPTING_PYTHON)
|
|
add_subdirectory(obspython)
|
|
if(OS_WINDOWS)
|
|
find_package(PythonWindows)
|
|
else()
|
|
find_package(Python COMPONENTS Interpreter Development)
|
|
endif()
|
|
|
|
if(NOT TARGET Python::Python)
|
|
obs_status(FATAL_ERROR "obs-scripting -> Python not found.")
|
|
return()
|
|
else()
|
|
obs_status(STATUS "obs-scripting -> Python ${Python_VERSION} found.")
|
|
endif()
|
|
else()
|
|
obs_status(DISABLED "Python support")
|
|
endif()
|
|
|
|
if(NOT TARGET Luajit::Luajit AND NOT TARGET Python::Python)
|
|
obs_status(WARNING "obs-scripting -> No supported scripting libraries found.")
|
|
return()
|
|
endif()
|
|
|
|
if(OS_MACOS)
|
|
find_package(SWIG 4 REQUIRED)
|
|
elseif(OS_POSIX)
|
|
find_package(SWIG 3 REQUIRED)
|
|
elseif(OS_WINDOWS)
|
|
find_package(SwigWindows 3 REQUIRED)
|
|
endif()
|
|
|
|
add_library(obs-scripting SHARED)
|
|
add_library(OBS::scripting ALIAS obs-scripting)
|
|
|
|
target_sources(
|
|
obs-scripting
|
|
PUBLIC obs-scripting.h
|
|
PRIVATE obs-scripting.c cstrcache.cpp cstrcache.h obs-scripting-logging.c
|
|
obs-scripting-callback.h)
|
|
|
|
target_link_libraries(obs-scripting PRIVATE OBS::libobs)
|
|
|
|
target_compile_features(obs-scripting PRIVATE cxx_auto_type)
|
|
|
|
target_include_directories(obs-scripting PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
|
${CMAKE_BINARY_DIR}/config)
|
|
|
|
if(OS_WINDOWS)
|
|
set(MODULE_DESCRIPTION "OBS Studio scripting module")
|
|
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
|
|
obs-scripting.rc)
|
|
|
|
target_sources(obs-scripting PRIVATE obs-scripting.rc)
|
|
|
|
target_link_libraries(obs-scripting PRIVATE OBS::w32-pthreads)
|
|
|
|
elseif(OS_MACOS)
|
|
target_link_libraries(obs-scripting PRIVATE objc)
|
|
endif()
|
|
|
|
set_target_properties(
|
|
obs-scripting
|
|
PROPERTIES FOLDER "scripting"
|
|
VERSION "${OBS_VERSION_MAJOR}"
|
|
SOVERSION "1")
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swig)
|
|
|
|
if(TARGET Luajit::Luajit)
|
|
add_custom_command(
|
|
OUTPUT swig/swigluarun.h
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE}
|
|
-lua -external-runtime swig/swigluarun.h
|
|
COMMENT "obs-scripting - generating Luajit SWIG interface headers")
|
|
|
|
set_source_files_properties(swig/swigluarun.h PROPERTIES GENERATED ON)
|
|
|
|
target_link_libraries(obs-scripting PRIVATE Luajit::Luajit)
|
|
|
|
target_sources(
|
|
obs-scripting
|
|
PRIVATE obs-scripting-lua.c obs-scripting-lua.h obs-scripting-lua-source.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/swig/swigluarun.h)
|
|
|
|
target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
if(ENABLE_UI)
|
|
target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
|
|
|
|
target_sources(obs-scripting PRIVATE obs-scripting-lua-frontend.c)
|
|
|
|
target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
|
|
endif()
|
|
|
|
endif()
|
|
|
|
if(TARGET Python::Python)
|
|
add_custom_command(
|
|
OUTPUT swig/swigpyrun.h
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E env "SWIG_LIB=${SWIG_DIR}" ${SWIG_EXECUTABLE}
|
|
-python -external-runtime swig/swigpyrun.h
|
|
COMMENT "obs-scripting - generating Python 3 SWIG interface headers")
|
|
|
|
set_source_files_properties(swig/swigpyrun.h PROPERTIES GENERATED ON)
|
|
|
|
target_sources(
|
|
obs-scripting
|
|
PRIVATE obs-scripting-python.c obs-scripting-python.h
|
|
obs-scripting-python-import.h
|
|
${CMAKE_CURRENT_BINARY_DIR}/swig/swigpyrun.h)
|
|
|
|
target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
get_filename_component(_PYTHON_PATH "${Python_LIBRARIES}" PATH)
|
|
get_filename_component(_PYTHON_FILE "${Python_LIBRARIES}" NAME)
|
|
|
|
string(REGEX REPLACE "\\.[^.]*$" "" _PYTHON_FILE ${_PYTHON_FILE})
|
|
|
|
if(OS_WINDOWS)
|
|
string(REGEX REPLACE "_d" "" _PYTHON_FILE ${_PYTHON_FILE})
|
|
endif()
|
|
set(OBS_SCRIPT_PYTHON_PATH "${_PYTHON_FILE}")
|
|
|
|
unset(_PYTHON_FILE)
|
|
unset(_PYTHON_PATH)
|
|
|
|
if(OS_WINDOWS OR OS_MACOS)
|
|
target_include_directories(obs-scripting PRIVATE ${Python_INCLUDE_DIRS})
|
|
|
|
target_sources(obs-scripting PRIVATE obs-scripting-python-import.c)
|
|
if(OS_MACOS)
|
|
target_link_options(obs-scripting PRIVATE -undefined dynamic_lookup)
|
|
endif()
|
|
else()
|
|
target_link_libraries(obs-scripting PRIVATE Python::Python)
|
|
endif()
|
|
|
|
if(ENABLE_UI)
|
|
target_link_libraries(obs-scripting PRIVATE OBS::frontend-api)
|
|
|
|
target_sources(obs-scripting PRIVATE obs-scripting-python-frontend.c)
|
|
|
|
target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON)
|
|
endif()
|
|
endif()
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs-scripting-config.h.in
|
|
${CMAKE_BINARY_DIR}/config/obs-scripting-config.h)
|
|
|
|
target_sources(obs-scripting
|
|
PUBLIC ${CMAKE_BINARY_DIR}/config/obs-scripting-config.h)
|
|
|
|
setup_binary_target(obs-scripting)
|