mirror of
https://github.com/jellyfin/jellyfin-desktop.git
synced 2026-10-26 16:45:24 +00:00
CMP0026 OLD behavior was removed in cmake 4.0. This should be safe as, at least on Linux, there doesn't seem to be any resources being copied. There might still be changes needed to fix compatibility with cmake 4.0 when building for macos.
276 lines
9.1 KiB
CMake
276 lines
9.1 KiB
CMake
#############################################################
|
|
function(get_resources_source_list target var)
|
|
get_property(RESOURCE_LIST GLOBAL PROPERTY _${target}_RESOURCE_LIST)
|
|
foreach(RF ${RESOURCE_LIST})
|
|
string(REPLACE "|" ";" PARTS "${RF}")
|
|
list(GET PARTS 0 SOURCE_FILE)
|
|
list(APPEND _SF ${SOURCE_FILE})
|
|
endforeach()
|
|
set(${var} ${_SF} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
#############################################################
|
|
function(copy_resources target)
|
|
if(XCODE)
|
|
return()
|
|
endif()
|
|
|
|
get_property(RESOURCE_LIST GLOBAL PROPERTY _${target}_RESOURCE_LIST)
|
|
|
|
if(RESOURCE_LIST)
|
|
set_policy(CMP0026 OLD)
|
|
|
|
# we read the LOCATION from the target instead of using a generator
|
|
# here since add_custom_command doesn't support generator expresessions
|
|
# in the output field, and this is still cleaner than hardcoding the path
|
|
# of the output binary.
|
|
#
|
|
get_property(TARGET_LOC TARGET ${target} PROPERTY LOCATION)
|
|
get_filename_component(TARGET_DIR ${TARGET_LOC} DIRECTORY)
|
|
if(APPLE)
|
|
set(TARGET_LOC ${TARGET_DIR}/..)
|
|
else()
|
|
set(TARGET_LOC ${TARGET_DIR})
|
|
endif()
|
|
|
|
foreach(RF ${RESOURCE_LIST})
|
|
string(REPLACE "|" ";" PARTS "${RF}")
|
|
list(GET PARTS 0 SOURCE_FILE)
|
|
list(GET PARTS 1 _TARGET_FILE)
|
|
set(TARGET_FILE ${TARGET_LOC}/${_TARGET_FILE})
|
|
add_custom_command(OUTPUT ${TARGET_FILE}
|
|
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_FILE}" "${TARGET_FILE}"
|
|
DEPENDS ${SOURCE_FILE}
|
|
COMMENT "CopyResource (${target}): ${TARGET_FILE}")
|
|
list(APPEND RESOURCES ${TARGET_FILE})
|
|
endforeach()
|
|
add_custom_target(${target}_CopyResources DEPENDS ${RESOURCES})
|
|
add_dependencies(${target} ${target}_CopyResources)
|
|
endif(RESOURCE_LIST)
|
|
endfunction()
|
|
|
|
#############################################################
|
|
function(add_resources)
|
|
set(args1 TARGET)
|
|
set(args2 SOURCES DEST EXCLUDE)
|
|
cmake_parse_arguments(BD "" "${args1}" "${args2}" ${ARGN})
|
|
|
|
foreach(_BDFILE ${BD_SOURCES})
|
|
if(IS_DIRECTORY ${_BDFILE})
|
|
file(GLOB _DIRCONTENTS ${_BDFILE}/*)
|
|
foreach(_BDDFILE ${_DIRCONTENTS})
|
|
get_filename_component(_BDFILE_NAME ${_BDDFILE} NAME)
|
|
|
|
set(PROCESS_FILE 1)
|
|
foreach(EX_FILE ${BD_EXCLUDE})
|
|
string(REGEX MATCH ${EX_FILE} DID_MATCH ${_BDDFILE})
|
|
if(NOT "${DID_MATCH}" STREQUAL "")
|
|
set(PROCESS_FILE 0)
|
|
endif(NOT "${DID_MATCH}" STREQUAL "")
|
|
endforeach(EX_FILE ${BD_EXCLUDE})
|
|
|
|
if(PROCESS_FILE STREQUAL "1")
|
|
if(IS_DIRECTORY ${_BDDFILE})
|
|
set(DEST ${BD_DEST}/${_BDFILE_NAME})
|
|
else()
|
|
set(DEST ${BD_DEST})
|
|
endif()
|
|
|
|
add_resources(SOURCES ${_BDDFILE} DEST ${DEST} EXCLUDE ${BD_EXCLUDE} TARGET ${BD_TARGET})
|
|
endif()
|
|
endforeach()
|
|
else()
|
|
get_filename_component(_BDFILE_NAME ${_BDFILE} NAME)
|
|
set_property(GLOBAL APPEND PROPERTY _${BD_TARGET}_RESOURCE_LIST "${_BDFILE}|${BD_DEST}/${_BDFILE_NAME}")
|
|
if(XCODE)
|
|
set_source_files_properties(${_BDFILE} PROPERTIES MACOSX_PACKAGE_LOCATION ${BD_DEST})
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endfunction()
|
|
|
|
#############################################################
|
|
macro(find_all_sources DIRECTORY VARIABLE)
|
|
aux_source_directory(${DIRECTORY} ${VARIABLE})
|
|
file(GLOB headers ${DIRECTORY}/*h)
|
|
list(APPEND ${VARIABLE} ${headers})
|
|
endmacro()
|
|
|
|
#############################################################
|
|
# function to collect all the sources from sub-directories
|
|
# into a single list
|
|
function(add_sources)
|
|
get_property(is_defined GLOBAL PROPERTY SRCS_LIST DEFINED)
|
|
if(NOT is_defined)
|
|
define_property(GLOBAL PROPERTY SRCS_LIST
|
|
BRIEF_DOCS "List of source files"
|
|
FULL_DOCS "List of source files to be compiled in one library")
|
|
endif()
|
|
# make absolute paths
|
|
set(SRCS)
|
|
foreach(s IN LISTS ARGN)
|
|
if(NOT IS_ABSOLUTE "${s}")
|
|
get_filename_component(s "${s}" ABSOLUTE)
|
|
endif()
|
|
list(APPEND SRCS "${s}")
|
|
endforeach()
|
|
|
|
string(REPLACE ${CMAKE_SOURCE_DIR}/src/ "" SUBDIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
string(TOLOWER ${SUBDIR} SUBDIR)
|
|
string(REPLACE "/" "\\\\" LIBNAME ${SUBDIR})
|
|
source_group(${LIBNAME} FILES ${SRCS})
|
|
|
|
# add it to the global list.
|
|
set_property(GLOBAL APPEND PROPERTY SRCS_LIST ${SRCS})
|
|
endfunction(add_sources)
|
|
|
|
## ---------------------------------------------------------------------
|
|
##
|
|
## Copyright (C) 2012 - 2014 by the deal.II authors
|
|
##
|
|
## This file is part of the deal.II library.
|
|
##
|
|
## The deal.II library is free software; you can use it, redistribute
|
|
## it, and/or modify it under the terms of the GNU Lesser General
|
|
## Public License as published by the Free Software Foundation; either
|
|
## version 2.1 of the License, or (at your option) any later version.
|
|
## The full text of the license can be found in the file LICENSE at
|
|
## the top level of the deal.II distribution.
|
|
##
|
|
## ---------------------------------------------------------------------
|
|
|
|
#
|
|
# Tests whether the cxx compiler understands a flag.
|
|
# If so, add it to 'variable'.
|
|
#
|
|
# Usage:
|
|
# ENABLE_IF_SUPPORTED(variable flag)
|
|
#
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
MACRO(ENABLE_IF_SUPPORTED _variable _flag)
|
|
#
|
|
# Clang is too conservative when reporting unsupported compiler flags.
|
|
# Therefore, we promote all warnings for an unsupported compiler flag to
|
|
# actual errors with the -Werror switch:
|
|
#
|
|
IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
SET(_werror_string "-Werror ")
|
|
ELSE()
|
|
SET(_werror_string "")
|
|
ENDIF()
|
|
|
|
STRING(STRIP "${_flag}" _flag_stripped)
|
|
SET(_flag_stripped_orig "${_flag_stripped}")
|
|
|
|
#
|
|
# Gcc does not emit a warning if testing -Wno-... flags which leads to
|
|
# false positive detection. Unfortunately it later warns that an unknown
|
|
# warning option is used if another warning is emitted in the same
|
|
# compilation unit.
|
|
# Therefore we invert the test for -Wno-... flags:
|
|
#
|
|
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
STRING(REPLACE "-Wno-" "-W" _flag_stripped "${_flag_stripped}")
|
|
ENDIF()
|
|
|
|
IF(NOT "${_flag_stripped}" STREQUAL "")
|
|
STRING(REGEX REPLACE "^-" "" _flag_name "${_flag_stripped}")
|
|
STRING(REPLACE "," "" _flag_name "${_flag_name}")
|
|
STRING(REPLACE "-" "_" _flag_name "${_flag_name}")
|
|
STRING(REPLACE "+" "_" _flag_name "${_flag_name}")
|
|
CHECK_CXX_COMPILER_FLAG(
|
|
"${_werror_string}${_flag_stripped}"
|
|
HAVE_FLAG_${_flag_name}
|
|
)
|
|
IF(HAVE_FLAG_${_flag_name})
|
|
SET(${_variable} "${${_variable}} ${_flag_stripped_orig}")
|
|
STRING(STRIP "${${_variable}}" ${_variable})
|
|
ENDIF()
|
|
ENDIF()
|
|
ENDMACRO()
|
|
|
|
#
|
|
# Tests whether it is possible to compile and link a dummy program with a
|
|
# given flag.
|
|
# If so, add it to variable.
|
|
#
|
|
# Usage:
|
|
# ENABLE_IF_LINKS(variable flag)
|
|
#
|
|
|
|
MACRO(ENABLE_IF_LINKS _variable _flag)
|
|
STRING(STRIP "${_flag}" _flag_stripped)
|
|
IF(NOT "${_flag_stripped}" STREQUAL "")
|
|
STRING(REGEX REPLACE "^-" "" _flag_name "${_flag_stripped}")
|
|
STRING(REPLACE "," "" _flag_name "${_flag_name}")
|
|
STRING(REPLACE "-" "_" _flag_name "${_flag_name}")
|
|
STRING(REPLACE "+" "_" _flag_name "${_flag_name}")
|
|
SET(_backup ${CMAKE_REQUIRED_LIBRARIES})
|
|
LIST(APPEND CMAKE_REQUIRED_LIBRARIES "${_flag_stripped}")
|
|
CHECK_CXX_COMPILER_FLAG(
|
|
""
|
|
HAVE_FLAG_${_flag_name}
|
|
)
|
|
SET(CMAKE_REQUIRED_LIBRARIES ${_backup})
|
|
|
|
IF(HAVE_FLAG_${_flag_name})
|
|
SET(${_variable} "${${_variable}} ${_flag_stripped}")
|
|
STRING(STRIP "${${_variable}}" ${_variable})
|
|
ENDIF()
|
|
ENDIF()
|
|
ENDMACRO()
|
|
|
|
#############################################################
|
|
function(std_target_properties target)
|
|
set_target_properties(${target} PROPERTIES CXX_STANDARD 14 CXX_STANDARD_REQUIRED ON)
|
|
endfunction()
|
|
|
|
#############################################################
|
|
function(safe_download URL)
|
|
set(ARGS FILENAME SHA1)
|
|
cmake_parse_arguments(SD "SHOW_PROGRESS" "${ARGS}" "" ${ARGN})
|
|
if(NOT DEFINED SD_FILENAME)
|
|
get_filename_component(SD_FILENAME ${CU_URL} NAME)
|
|
endif(NOT DEFINED SD_FILENAME)
|
|
|
|
if(EXISTS "${SD_FILENAME}")
|
|
file(SHA1 "${SD_FILENAME}" CURRENT_SHA1)
|
|
endif()
|
|
|
|
if(NOT DEFINED SD_SHA1)
|
|
set(SD_SHA1 ${CURRENT_SHA1})
|
|
endif()
|
|
|
|
if(SD_SHOW_PROGRESS)
|
|
set(_SHOW_PROGRESS "SHOW_PROGRESS")
|
|
endif()
|
|
|
|
if(NOT CURRENT_SHA1 STREQUAL SD_SHA1)
|
|
message(STATUS "Downloading ${URL} to ${SD_FILENAME}...")
|
|
file(
|
|
DOWNLOAD ${URL} ${SD_FILENAME}
|
|
STATUS SD_STATUS
|
|
${_SHOW_PROGRESS}
|
|
)
|
|
list(GET SD_STATUS 0 SD_SUCCESS)
|
|
if(NOT SD_SUCCESS EQUAL 0)
|
|
list(GET SD_STATUS 1 SD_ERROR)
|
|
file(REMOVE ${SD_FILENAME})
|
|
if("${SD_ERROR}" STREQUAL "\"Unsupported protocol\"")
|
|
message(FATAL_ERROR "Download failed and your cmake probably don't support SSL! Beware that cmake downloaded from cmake.org doesn't support SSL on all platforms, make sure to build it yourself.")
|
|
endif()
|
|
message(FATAL_ERROR "Failed to download: ${URL}: ${SD_ERROR}")
|
|
endif()
|
|
|
|
file(SHA1 "${SD_FILENAME}" NEW_SHA1)
|
|
if(DEFINED SD_SHA1)
|
|
if(NOT SD_SHA1 STREQUAL NEW_SHA1)
|
|
file(REMOVE ${SD_FILENAME})
|
|
message(FATAL_ERROR "Failed to verify SHA1 on ${SD_FILENAME}, expected '${SD_SHA1}' got '${NEW_SHA1}'")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endfunction()
|