Browse Source

cmake: Add updated Linux CMake scripts

PatTheMav 2 years ago
parent
commit
c9ba8eeb7c

+ 2 - 0
.github/scripts/utils.zsh/check_linux

@@ -12,6 +12,8 @@ local -a dependencies=("${(f)$(<${SCRIPT_HOME}/.Aptfile)}")
 local -a install_list
 local -a install_list
 local binary
 local binary
 
 
+sudo apt-get update -qq
+
 for dependency (${dependencies}) {
 for dependency (${dependencies}) {
   local -a tokens=(${(s: :)dependency//(,|:|\')/})
   local -a tokens=(${(s: :)dependency//(,|:|\')/})
 
 

+ 85 - 0
cmake/linux/compilerconfig.cmake

@@ -0,0 +1,85 @@
+# CMake Linux compiler configuration module
+
+include_guard(GLOBAL)
+
+include(ccache)
+include(compiler_common)
+
+option(ENABLE_COMPILER_TRACE "Enable Clang time-trace (required Clang and Ninja)" OFF)
+mark_as_advanced(ENABLE_COMPILER_TRACE)
+
+# gcc options for C
+set(_obs_gcc_c_options
+    # cmake-format: sortable
+    -fno-strict-aliasing
+    -fopenmp-simd
+    -Wdeprecated-declarations
+    -Wempty-body
+    -Wenum-conversion
+    -Werror=return-type
+    -Wextra
+    -Wformat
+    -Wformat-security
+    -Wno-conversion
+    -Wno-float-conversion
+    -Wno-implicit-fallthrough
+    -Wno-missing-braces
+    -Wno-missing-field-initializers
+    -Wno-shadow
+    -Wno-sign-conversion
+    -Wno-trigraphs
+    -Wno-unknown-pragmas
+    -Wno-unused-function
+    -Wno-unused-label
+    -Wparentheses
+    -Wshadow
+    -Wuninitialized
+    -Wunreachable-code
+    -Wunused-parameter
+    -Wunused-value
+    -Wunused-variable
+    -Wvla)
+
+# gcc options for C++
+set(_obs_gcc_cxx_options
+    # cmake-format: sortable
+    ${_obs_gcc_c_options} -Wconversion -Wfloat-conversion -Winvalid-offsetof -Wno-overloaded-virtual)
+
+add_compile_options(
+  -fopenmp-simd
+  "$<$<COMPILE_LANG_AND_ID:C,GNU>:${_obs_gcc_c_options}>"
+  "$<$<COMPILE_LANG_AND_ID:C,GNU>:-Wint-conversion;-Wno-missing-prototypes;-Wno-strict-prototypes;-Wpointer-sign>"
+  "$<$<COMPILE_LANG_AND_ID:CXX,GNU>:${_obs_gcc_cxx_options}>"
+  "$<$<COMPILE_LANG_AND_ID:C,Clang>:${_obs_clang_c_options}>"
+  "$<$<COMPILE_LANG_AND_ID:CXX,Clang>:${_obs_clang_cxx_options}>")
+
+# Add support for color diagnostics and CMake switch for warnings as errors to CMake < 3.24
+if(CMAKE_VERSION VERSION_LESS 3.24.0)
+  add_compile_options($<$<C_COMPILER_ID:Clang>:-fcolor-diagnostics> $<$<CXX_COMPILER_ID:Clang>:-fcolor-diagnostics>)
+  if(CMAKE_COMPILE_WARNING_AS_ERROR)
+    add_compile_options(-Werror)
+  endif()
+else()
+  set(CMAKE_COLOR_DIAGNOSTICS ON)
+endif()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
+  # Disable false-positive warning in GCC 12.1.0 and later
+  add_compile_options(-Wno-error=maybe-uninitialized)
+
+  # Add warning for infinite recursion (added in GCC 12)
+  if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0.0)
+    add_compile_options(-Winfinite-recursion)
+  endif()
+endif()
+
+# Enable compiler and build tracing (requires Ninja generator)
+if(ENABLE_COMPILER_TRACE AND CMAKE_GENERATOR STREQUAL "Ninja")
+  add_compile_options($<$<COMPILE_LANG_AND_ID:C,Clang>:-ftime-trace> $<$<COMPILE_LANG_AND_ID:CXX,Clang>:-ftime-trace>)
+else()
+  set(ENABLE_COMPILER_TRACE
+      OFF
+      CACHE STRING "Enable Clang time-trace (required Clang and Ninja)" FORCE)
+endif()
+
+add_compile_definitions($<$<CONFIG:DEBUG>:DEBUG> $<$<CONFIG:DEBUG>:_DEBUG> SIMDE_ENABLE_OPENMP)

+ 86 - 0
cmake/linux/defaults.cmake

@@ -0,0 +1,86 @@
+# CMake Linux defaults module
+
+# cmake-format: off
+# cmake-lint: disable=C0103
+# cmake-lint: disable=C0111
+# cmake-format: on
+
+include_guard(GLOBAL)
+
+include(GNUInstallDirs)
+
+# Enable find_package targets to become globally available targets
+set(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL TRUE)
+
+set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
+set(CPACK_PACKAGE_VERSION "${CMAKE_PROJECT_VERSION}")
+set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_C_LIBRARY_ARCHITECTURE}")
+
+set(CPACK_GENERATOR "DEB")
+set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
+set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${PLUGIN_EMAIL}")
+set(CPACK_SET_DESTDIR ON)
+
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.25.0 OR NOT CMAKE_CROSSCOMPILING)
+  set(CPACK_DEBIAN_DEBUGINFO_PACKAGE ON)
+endif()
+
+set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/release")
+
+set(CPACK_SOURCE_GENERATOR "TXZ")
+set(CPACK_SOURCE_IGNORE_FILES
+    # cmake-format: sortable
+    ".*~$"
+    \\.git/
+    \\.github/
+    \\.gitignore
+    build_.*
+    cmake/\\.CMakeBuildNumber
+    release/)
+
+set(CPACK_VERBATIM_VARIABLES YES)
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-source")
+set(CPACK_ARCHIVE_THREADS 0)
+
+include(CPack)
+
+find_package(libobs QUIET)
+
+if(NOT TARGET OBS::libobs)
+  find_package(LibObs REQUIRED)
+  add_library(OBS::libobs ALIAS libobs)
+
+  if(ENABLE_FRONTEND_API)
+    find_path(
+      obs-frontend-api_INCLUDE_DIR
+      NAMES obs-frontend-api.h
+      PATHS /usr/include /usr/local/include
+      PATH_SUFFIXES obs)
+
+    find_library(
+      obs-frontend-api_LIBRARY
+      NAMES obs-frontend-api
+      PATHS /usr/lib /usr/local/lib)
+
+    if(obs-frontend-api_LIBRARY)
+      if(NOT TARGET OBS::obs-frontend-api)
+        if(IS_ABSOLUTE "${obs-frontend-api_LIBRARY}")
+          add_library(OBS::obs-frontend-api UNKNOWN IMPORTED)
+          set_property(TARGET OBS::obs-frontend-api PROPERTY IMPORTED_LOCATION "${obs-frontend-api_LIBRARY}")
+        else()
+          add_library(OBS::obs-frontend-api INTERFACE IMPORTED)
+          set_property(TARGET OBS::obs-frontend-api PROPERTY IMPORTED_LIBNAME "${obs-frontend-api_LIBRARY}")
+        endif()
+
+        set_target_properties(OBS::obs-frontend-api PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+                                                               "${obs-frontend-api_INCLUDE_DIR}")
+      endif()
+    endif()
+  endif()
+
+  macro(find_package)
+    if(NOT "${ARGV0}" STREQUAL libobs AND NOT "${ARGV0}" STREQUAL obs-frontend-api)
+      _find_package(${ARGV})
+    endif()
+  endmacro()
+endif()

+ 74 - 0
cmake/linux/helpers.cmake

@@ -0,0 +1,74 @@
+# CMake Linux helper functions module
+
+include_guard(GLOBAL)
+
+include(helpers_common)
+
+# set_target_properties_plugin: Set target properties for use in obs-studio
+function(set_target_properties_plugin target)
+  set(options "")
+  set(oneValueArgs "")
+  set(multiValueArgs PROPERTIES)
+  cmake_parse_arguments(PARSE_ARGV 0 _STPO "${options}" "${oneValueArgs}" "${multiValueArgs}")
+
+  message(DEBUG "Setting additional properties for target ${target}...")
+
+  while(_STPO_PROPERTIES)
+    list(POP_FRONT _STPO_PROPERTIES key value)
+    set_property(TARGET ${target} PROPERTY ${key} "${value}")
+  endwhile()
+
+  set_target_properties(
+    ${target}
+    PROPERTIES VERSION 0
+               SOVERSION ${PLUGIN_VERSION}
+               PREFIX "")
+
+  install(
+    TARGETS ${target}
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/obs-plugins)
+
+  if(TARGET plugin-support)
+    target_link_libraries(${target} PRIVATE plugin-support)
+  endif()
+
+  target_install_resources(${target})
+
+  get_target_property(target_sources ${target} SOURCES)
+  set(target_ui_files ${target_sources})
+  list(FILTER target_ui_files INCLUDE REGEX ".+\\.(ui|qrc)")
+  source_group(
+    TREE "${CMAKE_CURRENT_SOURCE_DIR}"
+    PREFIX "UI Files"
+    FILES ${target_ui_files})
+endfunction()
+
+# Helper function to add resources into bundle
+function(target_install_resources target)
+  message(DEBUG "Installing resources for target ${target}...")
+  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
+    file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
+    foreach(data_file IN LISTS data_files)
+      cmake_path(RELATIVE_PATH data_file BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/" OUTPUT_VARIABLE
+                 relative_path)
+      cmake_path(GET relative_path PARENT_PATH relative_path)
+      target_sources(${target} PRIVATE "${data_file}")
+      source_group("Resources/${relative_path}" FILES "${data_file}")
+    endforeach()
+
+    install(
+      DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
+      DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/obs/obs-plugins/${target}
+      USE_SOURCE_PERMISSIONS)
+  endif()
+endfunction()
+
+# Helper function to add a specific resource to a bundle
+function(target_add_resource target resource)
+  message(DEBUG "Add resource '${resource}' to target ${target} at destination '${target_destination}'...")
+
+  install(FILES "${resource}" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/obs/obs-plugins/${target})
+
+  source_group("Resources" FILES "${resource}")
+endfunction()

+ 56 - 0
cmake/linux/toolchains/aarch64-linux-clang.cmake

@@ -0,0 +1,56 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+set(CMAKE_CROSSCOMPILING TRUE)
+
+set(CMAKE_C_COMPILER /usr/bin/clang)
+set(CMAKE_CXX_COMPILER /usr/bin/clang++)
+
+set(CMAKE_C_COMPILER_TARGET aarch64-linux-gnu)
+set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-gnu)
+
+set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(PKG_CONFIG_EXECUTABLE
+    /usr/bin/aarch64-linux-gnu-pkg-config
+    CACHE FILEPATH "pkg-config executable")
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-ranlib
+  OUTPUT_VARIABLE CMAKE_RANLIB
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-ar
+  OUTPUT_VARIABLE CMAKE_LLVM_AR
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-readelf
+  OUTPUT_VARIABLE READELF
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-objcopy
+  OUTPUT_VARIABLE CMAKE_LLVM_OBJCOPY
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-objdump
+  OUTPUT_VARIABLE CMAKE_LLVM_OBJDUMP
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+set(CMAKE_AR
+    "${CMAKE_LLVM_AR}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} ar" FORCE)
+set(CMAKE_OBJCOPY
+    "${CMAKE_LLVM_OBJCOPY}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} objcopy" FORCE)
+set(CMAKE_OBJDUMP
+    "${CMAKE_LLVM_OBJDUMP}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} objdump" FORCE)
+
+set(CPACK_READELF_EXECUTABLE "${READELF}")
+set(CPACK_OBJCOPY_EXECUTABLE "${CMAKE_LLVM_OBJCOPY}")
+set(CPACK_OBJDUMP_EXECUTABLE "${CMAKE_LLVM_OBJDUMP}")
+set(CPACK_PACKAGE_ARCHITECTURE arm64)
+set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64)

+ 20 - 0
cmake/linux/toolchains/aarch64-linux-gcc.cmake

@@ -0,0 +1,20 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+set(CMAKE_CROSSCOMPILING TRUE)
+
+set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
+set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
+
+set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+set(PKG_CONFIG_EXECUTABLE
+    /usr/bin/aarch64-linux-gnu-pkg-config
+    CACHE FILEPATH "pkg-config executable")
+
+set(CPACK_READELF_EXECUTABLE /usr/bin/aarch64-linux-gnu-readelf)
+set(CPACK_OBJCOPY_EXECUTABLE /usr/bin/aarch64-linux-gnu-objcopy)
+set(CPACK_OBJDUMP_EXECUTABLE /usr/bin/aarch64-linux-gnu-objdump)
+set(CPACK_PACKAGE_ARCHITECTURE arm64)
+set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64)

+ 56 - 0
cmake/linux/toolchains/x86_64-linux-clang.cmake

@@ -0,0 +1,56 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR x86_64)
+set(CMAKE_CROSSCOMPILING TRUE)
+
+set(CMAKE_C_COMPILER /usr/bin/clang)
+set(CMAKE_CXX_COMPILER /usr/bin/clang++)
+
+set(CMAKE_C_COMPILER_TARGET x86_64-linux-gnu)
+set(CMAKE_CXX_COMPILER_TARGET x86_64-linux-gnu)
+
+set(CMAKE_FIND_ROOT_PATH /usr/x86_64-linux-gnu)
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(PKG_CONFIG_EXECUTABLE
+    /usr/bin/x86_64-linux-gnu-pkg-config
+    CACHE FILEPATH "pkg-config executable")
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-ranlib
+  OUTPUT_VARIABLE CMAKE_RANLIB
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-ar
+  OUTPUT_VARIABLE CMAKE_LLVM_AR
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-readelf
+  OUTPUT_VARIABLE READELF
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-objcopy
+  OUTPUT_VARIABLE CMAKE_LLVM_OBJCOPY
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(
+  COMMAND ${CMAKE_C_COMPILER} -print-prog-name=llvm-objdump
+  OUTPUT_VARIABLE CMAKE_LLVM_OBJDUMP
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+set(CMAKE_AR
+    "${CMAKE_LLVM_AR}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} ar" FORCE)
+set(CMAKE_OBJCOPY
+    "${CMAKE_LLVM_OBJCOPY}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} objcopy" FORCE)
+set(CMAKE_OBJDUMP
+    "${CMAKE_LLVM_OBJDUMP}"
+    CACHE INTERNAL "${CMAKE_SYSTEM_NAME} objdump" FORCE)
+
+set(CPACK_READELF_EXECUTABLE "${READELF}")
+set(CPACK_OBJCOPY_EXECUTABLE "${CMAKE_LLVM_OBJCOPY}")
+set(CPACK_OBJDUMP_EXECUTABLE "${CMAKE_LLVM_OBJDUMP}")
+set(CPACK_PACKAGE_ARCHITECTURE x86_64)
+set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE x86_64)

+ 20 - 0
cmake/linux/toolchains/x86_64-linux-gcc.cmake

@@ -0,0 +1,20 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR x86_64)
+set(CMAKE_CROSSCOMPILING TRUE)
+
+set(CMAKE_C_COMPILER /usr/bin/x86_64-linux-gnu-gcc)
+set(CMAKE_CXX_COMPILER /usr/bin/x86_64-linux-gnu-g++)
+
+set(CMAKE_FIND_ROOT_PATH /usr/x86_64-linux-gnu)
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+set(PKG_CONFIG_EXECUTABLE
+    /usr/bin/x86_64-linux-gnu-pkg-config
+    CACHE FILEPATH "pkg-config executable")
+
+set(CPACK_READELF_EXECUTABLE /usr/bin/x86_64-linux-gnu-readelf)
+set(CPACK_OBJCOPY_EXECUTABLE /usr/bin/x86_64-linux-gnu-objcopy)
+set(CPACK_OBJDUMP_EXECUTABLE /usr/bin/x86_64-linux-gnu-objdump)
+set(CPACK_PACKAGE_ARCHITECTURE x86_64)
+set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE x86_64)