obs-studio/libobs/CMakeLists.txt
PatTheMav aae3a6a466 cmake: Fix diverging prefix padding for OBS status outputs
Status output related to OBS configuration is prefixed with the string
"OBS" and added padding for enabled and disabled features. This padding
was not aligned between platforms.

By moving the padding and prefix decoration into its own function,
both elements are controlled in a single place. CMake scripts were
changed to use this new function `obs_status` instead of using CMake's
`message` function directly.
2022-03-26 09:44:23 -04:00

472 lines
13 KiB
CMake

if(POLICY CMP0090)
cmake_policy(SET CMP0090 NEW)
endif()
project(libobs)
find_package(Threads REQUIRED)
find_package(
FFmpeg REQUIRED
COMPONENTS avformat avutil swscale swresample
OPTIONAL_COMPONENTS avcodec)
find_package(ZLIB REQUIRED)
add_library(libobs SHARED)
add_library(OBS::libobs ALIAS libobs)
target_sources(
libobs
PRIVATE obs.c
obs.h
obs.hpp
obs-audio.c
obs-audio-controls.c
obs-audio-controls.h
obs-avc.c
obs-avc.h
obs-data.c
obs-data.h
obs-defs.h
obs-display.c
obs-encoder.c
obs-encoder.h
obs-ffmpeg-compat.h
obs-hevc.c
obs-hevc.h
obs-hotkey.c
obs-hotkey.h
obs-hotkeys.h
obs-missing-files.c
obs-missing-files.h
obs-nal.c
obs-nal.h
obs-hotkey-name-map.c
obs-interaction.h
obs-internal.h
obs-module.c
obs-module.h
obs-output.c
obs-output.h
obs-output-delay.c
obs-properties.c
obs-properties.h
obs-service.c
obs-service.h
obs-scene.c
obs-scene.h
obs-source.c
obs-source.h
obs-source-deinterlace.c
obs-source-transition.c
obs-ui.h
obs-video.c
obs-video-gpu-encode.c
obs-view.c
obs-config.h)
target_sources(
libobs
PRIVATE util/simde/check.h
util/simde/debug-trap.h
util/simde/hedley.h
util/simde/simde-align.h
util/simde/simde-arch.h
util/simde/simde-common.h
util/simde/simde-constify.h
util/simde/simde-detect-clang.h
util/simde/simde-diagnostic.h
util/simde/simde-features.h
util/simde/simde-math.h
util/simde/x86/mmx.h
util/simde/x86/sse2.h
util/simde/x86/sse.h)
target_sources(
libobs
PRIVATE callback/calldata.c
callback/calldata.h
callback/decl.c
callback/decl.h
callback/signal.c
callback/signal.h
callback/proc.c
callback/proc.h)
target_sources(
libobs
PRIVATE graphics/graphics.c
graphics/graphics.h
graphics/graphics-imports.c
graphics/graphics-internal.h
graphics/axisang.c
graphics/axisang.h
graphics/bounds.c
graphics/bounds.h
graphics/device-exports.h
graphics/effect.c
graphics/effect.h
graphics/effect-parser.c
graphics/effect-parser.h
graphics/half.h
graphics/image-file.c
graphics/image-file.h
graphics/math-extra.c
graphics/math-extra.h
graphics/matrix3.c
graphics/matrix3.h
graphics/matrix4.c
graphics/matrix4.h
graphics/plane.c
graphics/plane.h
graphics/quat.c
graphics/quat.h
graphics/shader-parser.c
graphics/shader-parser.h
graphics/srgb.h
graphics/texture-render.c
graphics/vec2.c
graphics/vec2.h
graphics/vec3.c
graphics/vec3.h
graphics/vec4.c
graphics/vec4.h
graphics/libnsgif/libnsgif.c
graphics/libnsgif/libnsgif.h
graphics/graphics-ffmpeg.c)
target_sources(
libobs
PRIVATE media-io/audio-io.c
media-io/audio-io.h
media-io/audio-math.h
media-io/audio-resampler.h
media-io/audio-resampler-ffmpeg.c
media-io/format-conversion.c
media-io/format-conversion.h
media-io/frame-rate.h
media-io/media-remux.c
media-io/media-remux.h
media-io/video-fourcc.c
media-io/video-frame.c
media-io/video-frame.h
media-io/video-io.c
media-io/video-io.h
media-io/media-io-defs.h
media-io/video-matrices.c
media-io/video-scaler-ffmpeg.c
media-io/video-scaler.h)
target_sources(
libobs
PRIVATE util/array-serializer.c
util/array-serializer.h
util/base.c
util/base.h
util/bitstream.c
util/bitstream.h
util/bmem.c
util/bmem.h
util/c99defs.h
util/cf-lexer.c
util/cf-lexer.h
util/cf-parser.c
util/cf-parser.h
util/circlebuf.h
util/config-file.c
util/config-file.h
util/crc32.c
util/crc32.h
util/dstr.c
util/dstr.h
util/file-serializer.c
util/file-serializer.h
util/lexer.c
util/lexer.h
util/platform.c
util/platform.h
util/profiler.c
util/profiler.h
util/profiler.hpp
util/pipe.h
util/serializer.h
util/sse-intrin.h
util/task.c
util/task.h
util/text-lookup.c
util/text-lookup.h
util/threading.h
util/utf8.c
util/utf8.h
util/util_uint64.h
util/util_uint128.h
util/curl/curl-helper.h
util/darray.h
util/util.hpp)
# Contents of "data" dir already automatically added to bundles on macOS
if(NOT OS_MACOS)
target_sources(
libobs
PRIVATE data/area.effect
data/bicubic_scale.effect
data/bilinear_lowres_scale.effect
data/default.effect
data/default_rect.effect
data/deinterlace_base.effect
data/deinterlace_blend.effect
data/deinterlace_blend_2x.effect
data/deinterlace_discard.effect
data/deinterlace_discard_2x.effect
data/deinterlace_linear.effect
data/deinterlace_linear_2x.effect
data/deinterlace_yadif.effect
data/deinterlace_yadif_2x.effect
data/format_conversion.effect
data/lanczos_scale.effect
data/opaque.effect
data/premultiplied_alpha.effect
data/repeat.effect
data/solid.effect)
endif()
target_link_libraries(
libobs
PRIVATE FFmpeg::avcodec
FFmpeg::avformat
FFmpeg::avutil
FFmpeg::swscale
FFmpeg::swresample
Jansson::Jansson
OBS::caption
ZLIB::ZLIB
PUBLIC Threads::Threads)
set_target_properties(
libobs
PROPERTIES OUTPUT_NAME obs
FOLDER "core"
VERSION "${OBS_VERSION_MAJOR}"
SOVERSION "0")
target_compile_definitions(
libobs
PUBLIC ${ARCH_SIMD_DEFINES}
PRIVATE IS_LIBOBS)
target_compile_features(libobs PRIVATE cxx_alias_templates)
target_compile_options(libobs PUBLIC ${ARCH_SIMD_FLAGS})
target_include_directories(
libobs PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/config>)
if(OS_WINDOWS)
set(MODULE_DESCRIPTION "OBS Library")
set(UI_VERSION "${OBS_VERSION_CANONICAL}")
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
libobs.rc)
target_sources(
libobs
PRIVATE obs-win-crash-handler.c
obs-windows.c
util/threading-windows.c
util/threading-windows.h
util/pipe-windows.c
util/platform-windows.c
util/windows/win-registry.h
util/windows/win-version.h
util/windows/ComPtr.hpp
util/windows/CoTaskMemPtr.hpp
util/windows/HRError.hpp
util/windows/WinHandle.hpp
libobs.rc
audio-monitoring/win32/wasapi-output.c
audio-monitoring/win32/wasapi-enum-devices.c
audio-monitoring/win32/wasapi-output.h
audio-monitoring/win32/wasapi-monitoring-available.c)
target_compile_definitions(
libobs PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
_CRT_NONSTDC_NO_WARNINGS)
target_link_libraries(libobs PRIVATE Avrt winmm)
if(MSVC)
target_link_libraries(libobs PRIVATE OBS::w32-pthreads)
target_compile_options(libobs PRIVATE "$<$<COMPILE_LANGUAGE:C>:/EHc->"
"$<$<COMPILE_LANGUAGE:CXX>:/EHc->")
target_link_options(libobs PRIVATE "LINKER:/SAFESEH:NO")
endif()
elseif(OS_MACOS)
find_library(COCOA Cocoa)
find_library(COREAUDIO CoreAudio)
find_library(AUDIOTOOLBOX AudioToolbox)
find_library(AUDIOUNIT AudioUnit)
find_library(APPKIT AppKit)
find_library(IOKIT IOKit)
find_library(CARBON Carbon)
mark_as_advanced(
COCOA
COREAUDIO
AUDIOTOOLBOX
AUDIOUNIT
APPKIT
IOKIT
CARBON)
target_link_libraries(
libobs
PRIVATE ${COCOA}
${COREAUDIO}
${AUDIOTOOLBOX}
${AUDIOUNIT}
${APPKIT}
${IOKIT}
${CARBON})
target_sources(
libobs
PRIVATE obs-cocoa.m
util/pipe-posix.c
util/platform-cocoa.m
util/platform-nix.c
util/threading-posix.c
util/threading-posix.h
util/apple/cfstring-utils.h
audio-monitoring/osx/coreaudio-enum-devices.c
audio-monitoring/osx/coreaudio-output.c
audio-monitoring/osx/coreaudio-monitoring-available.c
audio-monitoring/osx/mac-helpers.h)
set_source_files_properties(util/platform-cocoa.m obs-cocoa.m
PROPERTIES COMPILE_FLAGS -fobjc-arc)
set_target_properties(
libobs PROPERTIES SOVERSION "1" BUILD_RPATH
"$<TARGET_FILE_DIR:OBS::libobs-opengl>")
elseif(OS_POSIX)
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
target_compile_definitions(libobs PRIVATE ENABLE_DARRAY_TYPE_TEST)
endif()
find_package(X11 REQUIRED)
find_package(
XCB
COMPONENTS XCB
OPTIONAL_COMPONENTS XINPUT
QUIET)
find_package(X11_XCB REQUIRED)
target_sources(
libobs
PRIVATE obs-nix.c
obs-nix-platform.c
obs-nix-platform.h
obs-nix-x11.c
util/threading-posix.c
util/threading-posix.h
util/pipe-posix.c
util/platform-nix.c)
target_link_libraries(libobs PRIVATE X11::X11_xcb XCB::XCB)
if(USE_XDG)
target_compile_definitions(libobs PRIVATE USE_XDG)
endif()
if(ENABLE_PULSEAUDIO)
find_package(PulseAudio REQUIRED)
obs_status(STATUS "-> PulseAudio found - audio monitoring enabled")
target_sources(
libobs
PRIVATE audio-monitoring/pulse/pulseaudio-output.c
audio-monitoring/pulse/pulseaudio-enum-devices.c
audio-monitoring/pulse/pulseaudio-wrapper.c
audio-monitoring/pulse/pulseaudio-wrapper.h
audio-monitoring/pulse/pulseaudio-monitoring-available.c)
target_link_libraries(libobs PRIVATE ${PULSEAUDIO_LIBRARY})
else()
target_sources(libobs PRIVATE audio-monitoring/null/null-audio-monitoring.c)
endif()
find_package(Gio)
if(TARGET GIO::GIO)
target_link_libraries(libobs PRIVATE GIO::GIO)
target_sources(libobs PRIVATE util/platform-nix-dbus.c
util/platform-nix-portal.c)
endif()
if(TARGET XCB::XINPUT)
target_link_libraries(libobs PRIVATE XCB::XINPUT)
endif()
if(ENABLE_WAYLAND)
find_package(
Wayland
COMPONENTS Client
REQUIRED)
find_package(Xkbcommon REQUIRED)
target_link_libraries(libobs PRIVATE Wayland::Client Xkbcommon::Xkbcommon)
target_sources(libobs PRIVATE obs-nix-wayland.c)
endif()
if(OS_LINUX)
target_link_libraries(glad PRIVATE ${CMAKE_DL_LIBS})
endif()
if(OS_FREEBSD)
find_package(Sysinfo REQUIRED)
target_link_libraries(libobs PRIVATE Sysinfo::Sysinfo)
endif()
set_target_properties(
libobs PROPERTIES BUILD_RPATH "$<TARGET_FILE_DIR:OBS::libobs-opengl>")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obsconfig.h.in
${CMAKE_BINARY_DIR}/config/obsconfig.h)
target_compile_definitions(libobs PUBLIC HAVE_OBSCONFIG_H)
if(ENABLE_FFMPEG_MUX_DEBUG)
target_compile_definitions(libobs PRIVATE SHOW_SUBPROCESSES)
endif()
get_target_property(_OBS_SOURCES libobs SOURCES)
set(_OBS_HEADERS ${_OBS_SOURCES})
set(_OBS_FILTERS ${_OBS_SOURCES})
list(FILTER _OBS_HEADERS INCLUDE REGEX ".*\\.h(pp)?")
list(FILTER _OBS_SOURCES INCLUDE REGEX ".*\\.(m|c[cp]?p?)")
list(FILTER _OBS_FILTERS INCLUDE REGEX ".*\\.effect")
source_group(
TREE "${CMAKE_CURRENT_SOURCE_DIR}"
PREFIX "Source Files"
FILES ${_OBS_SOURCES})
source_group(
TREE "${CMAKE_CURRENT_SOURCE_DIR}"
PREFIX "Header Files"
FILES ${_OBS_HEADERS})
source_group(
TREE "${CMAKE_CURRENT_SOURCE_DIR}"
PREFIX "Effect Files"
FILES ${_OBS_FILTERS})
setup_binary_target(libobs)
setup_target_resources(libobs libobs)
export_target(libobs)
install_headers(libobs)