Warning, /graphics/krita/3rdparty/CMakeLists.txt is written in an unsupported language. File is not indexed.

0001 project (krita-and-all-its-deps)
0002 
0003 if (POLICY CMP0135)
0004     cmake_policy(SET CMP0135 OLD)
0005 endif()
0006 
0007 #
0008 # Build all dependencies for Krita and finally Krita itself.
0009 # Parameters: EXTERNALS_DOWNLOAD_DIR place to download all packages
0010 #             INSTALL_ROOT place to install everything to
0011 #             MXE_TOOLCHAIN: the toolchain file to cross-compile using MXE
0012 #
0013 # Example usage: cmake ..\kritadeposx -DEXTERNALS_DOWNLOAD_DIR=/dev2/d -DINSTALL_ROOT=/dev2/i -DWIN64_BUILD=TRUE  -DBOOST_LIBRARYDIR=/dev2/i/lib   -G "Visual Studio 11 Win64"
0014 
0015 if(APPLE)
0016         execute_process(COMMAND sysctl -n hw.optional.arm64 OUTPUT_VARIABLE apple_has_arm64_optional)
0017         if(apple_has_arm64_optional)
0018                 message(STATUS "Building on macos arm")
0019                 cmake_minimum_required(VERSION 3.19.3)
0020         else()
0021         cmake_minimum_required(VERSION 3.7.2)
0022         endif()
0023 else(APPLE)
0024         cmake_minimum_required(VERSION 3.7.0 FATAL_ERROR)
0025 endif()
0026 
0027 if(POLICY CMP0135)
0028   cmake_policy(SET CMP0135 NEW)
0029 endif()
0030 
0031 #
0032 # If you add a new dependency into 3rdparty folder, do **not** overide
0033 # BUILD_COMMAND and INSTALL_COMMAND with their '-j${SUBMAKE_JOBS}' equivalents,
0034 # unless you need a really custom command for this dep. CMake will pass the
0035 # correct threading option to make/ninja automatically. The variable below is
0036 # Used **only** by custom builds, like sip and boost.
0037 #
0038 
0039 if (NOT SUBMAKE_JOBS)
0040     include(ProcessorCount)
0041     ProcessorCount(NUM_CORES)
0042     if  (NOT NUM_CORES EQUAL 0)
0043         if (NUM_CORES GREATER 2)
0044             # be nice...
0045             MATH( EXPR NUM_CORES "${NUM_CORES} - 2" )
0046         endif()
0047         set(SUBMAKE_JOBS ${NUM_CORES})
0048     else()
0049         set(SUBMAKE_JOBS 1)
0050     endif()
0051 endif()
0052 
0053 MESSAGE("SUBMAKE_JOBS: " ${SUBMAKE_JOBS})
0054 
0055 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
0056         message(FATAL_ERROR "Compiling in the source directory is not supported. Use for example 'mkdir build; cd build; cmake ..'.")
0057 endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
0058 
0059 # Tools must be obtained to work with:
0060 include (ExternalProject)
0061 
0062 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake/kde_macro")
0063 LIST (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
0064 include (KritaToNativePath)
0065 include (KritaExternalProject)
0066 
0067 # allow specification of a directory with pre-downloaded
0068 # requirements
0069 if(DEFINED ENV{EXTERNALS_DOWNLOAD_DIR})
0070     set(EXTERNALS_DOWNLOAD_DIR $ENV{EXTERNALS_DOWNLOAD_DIR})
0071 endif()
0072 
0073 if(NOT IS_DIRECTORY ${EXTERNALS_DOWNLOAD_DIR})
0074     message(FATAL_ERROR "No externals download dir set. Use -DEXTERNALS_DOWNLOAD_DIR")
0075 else()
0076     file(TO_CMAKE_PATH "${EXTERNALS_DOWNLOAD_DIR}" EXTERNALS_DOWNLOAD_DIR)
0077 endif()
0078 
0079 if(NOT IS_DIRECTORY ${INSTALL_ROOT})
0080     message(FATAL_ERROR "No install dir set. Use -DINSTALL_ROOT")
0081 else()
0082     file(TO_CMAKE_PATH "${INSTALL_ROOT}" INSTALL_ROOT)
0083 endif()
0084 
0085 set(TOP_INST_DIR ${INSTALL_ROOT})
0086 set(EXTPREFIX "${TOP_INST_DIR}")
0087 set(CMAKE_PREFIX_PATH "${EXTPREFIX}")
0088 
0089 if (${CMAKE_GENERATOR} STREQUAL "Visual Studio 14 2015 Win64")
0090     SET(GLOBAL_PROFILE
0091         -DCMAKE_MODULE_LINKER_FLAGS=/machine:x64
0092         -DCMAKE_EXE_LINKER_FLAGS=/machine:x64
0093         -DCMAKE_SHARED_LINKER_FLAGS=/machine:x64
0094         -DCMAKE_STATIC_LINKER_FLAGS=/machine:x64
0095     )
0096 endif ()
0097 
0098 message( STATUS "CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
0099 message( STATUS "CMAKE_CL_64: ${CMAKE_CL_64}")
0100 
0101 set(GLOBAL_BUILD_TYPE RelWithDebInfo)
0102 set(GLOBAL_PROFILE ${GLOBAL_PROFILE} -DBUILD_TESTING=false)
0103 
0104 if (UNIX AND NOT APPLE)
0105         set(LINUX true)
0106     set(PATCH_COMMAND patch)
0107 endif ()
0108 
0109 if (WIN32 OR LINUX)
0110 option(QT_ENABLE_DEBUG_INFO "Build Qt with full debug info included" OFF)
0111 option(QT_ENABLE_ASAN "Build Qt with ASAN" OFF)
0112 endif()
0113 
0114 include(FeatureSummary)
0115 
0116 if (WIN32)
0117     set(_is_perl_required)
0118     set(_perl_type OPTIONAL)
0119 else()
0120     set(_is_perl_required REQUIRED)
0121     set(_perl_type REQUIRED)
0122 endif()
0123 find_package(Perl ${_is_perl_required})
0124 set_package_properties(Perl PROPERTIES
0125     URL "https://www.perl.org/"
0126     DESCRIPTION "Perl is a highly capable, feature-rich programming language with over 30 years of development."
0127     TYPE ${_perl_type}
0128     PURPOSE "Needed for building Qt from source."
0129 )
0130 
0131 if (WIN32)
0132     option(ENABLE_MSYS2_FIXES "Enable patches that are needed for MSYS2+Clang Krita build" OFF)
0133 
0134     if(ENABLE_MSYS2_FIXES)
0135         find_package(ZLIB)
0136         find_package(Iconv)
0137         find_package(EXPAT)
0138         find_package(Gettext)
0139         find_package(OpenSSL)
0140     endif()
0141 
0142     if (NOT ZLIB_FOUND)
0143         set (ZLIB_DEP ext_zlib)
0144     endif()
0145     
0146     if (NOT Iconv_FOUND)
0147         set (ICONV_DEP ext_iconv)
0148     endif()
0149     
0150     if (NOT EXPAT_FOUND)
0151         set (EXPAT_DEP ext_expat)
0152     endif()
0153     
0154     if (NOT Gettext_FOUND)
0155         set (GETTEXT_DEP ext_gettext)
0156     endif()
0157     
0158     if (NOT OpenSSL_FOUND)
0159         set (OPENSSL_DEP ext_openssl)
0160     endif()
0161 elseif (APPLE OR ANDROID)
0162     set (ZLIB_DEP ext_zlib)
0163     set (ICONV_DEP ext_iconv)
0164     set (GETTEXT_DEP ext_gettext)
0165 else()
0166     # In Linux we require system versions for compatibility reasons.
0167     find_package(ZLIB REQUIRED)
0168     set_package_properties(ZLIB PROPERTIES
0169         DESCRIPTION "Compression library"
0170         URL "https://www.zlib.net/"
0171         TYPE REQUIRED
0172         PURPOSE "Needed for building libpng from source.")
0173     find_package(Iconv REQUIRED)
0174     set_package_properties(Iconv PROPERTIES
0175         URL "https://www.gnu.org/software/libiconv/"
0176         DESCRIPTION "Conversion library"
0177         TYPE REQUIRED
0178         PURPOSE "Needed for building exiv2 and gettext from source."
0179     )
0180 endif (WIN32)
0181 
0182 set(SECURITY_EXE_LINKER_FLAGS "")
0183 set(SECURITY_SHARED_LINKER_FLAGS "")
0184 set(SECURITY_MODULE_LINKER_FLAGS "")
0185 if (MINGW)
0186         option(USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags (mingw-w64)" ON)
0187         if (USE_MINGW_HARDENING_LINKER)
0188                 set(SECURITY_EXE_LINKER_FLAGS "-Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0189                 set(SECURITY_SHARED_LINKER_FLAGS "-Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0190                 set(SECURITY_MODULE_LINKER_FLAGS "-Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0191         # Enable high-entropy ASLR for 64-bit
0192         # The image base has to be >4GB for HEASLR to be enabled.
0193         # The values used here are kind of arbitrary.
0194         set(SECURITY_EXE_LINKER_FLAGS "${SECURITY_EXE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x140000000")
0195         set(SECURITY_SHARED_LINKER_FLAGS "${SECURITY_SHARED_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0196         set(SECURITY_MODULE_LINKER_FLAGS "${SECURITY_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0197         set(GLOBAL_PROFILE ${GLOBAL_PROFILE}
0198             -DCMAKE_EXE_LINKER_FLAGS=${SECURITY_EXE_LINKER_FLAGS}
0199             -DCMAKE_SHARED_LINKER_FLAGS=${SECURITY_SHARED_LINKER_FLAGS}
0200             -DCMAKE_MODULE_LINKER_FLAGS=${SECURITY_MODULE_LINKER_FLAGS}
0201         )
0202         else ()
0203                 message(WARNING "Linker Security Flags not enabled!")
0204         endif ()
0205 
0206     # Generate reduced debug info
0207     set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g1")
0208     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g1")
0209 
0210     # Clang does not generate DWARF aranges data by default, which makes
0211     # DrMingw not able to parse the DWARF debug symbols. Add -gdwarf-aranges
0212     # explicitly.
0213     # See: https://github.com/jrfonseca/drmingw/issues/42#issuecomment-516614561
0214     #
0215     # `-fdebug-info-for-profiling` is needed for proper C++ function signatures
0216     # when using Clang with `-g1`.
0217     if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
0218         set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -gdwarf-aranges -fdebug-info-for-profiling")
0219     endif ()
0220     if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
0221         set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gdwarf-aranges -fdebug-info-for-profiling")
0222     endif ()
0223 
0224     set(GLOBAL_PROFILE ${GLOBAL_PROFILE}
0225         -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
0226         -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
0227     )
0228 elseif (MSVC)
0229     set(SECURITY_C_FLAGS "")
0230     set(SECURITY_CXX_FLAGS "")
0231         # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0232     set(SECURITY_EXE_LINKER_FLAGS "/STACK:4194304")
0233     set(SECURITY_SHARED_LINKER_FLAGS "/STACK:4194304")
0234     set(SECURITY_MODULE_LINKER_FLAGS "/STACK:4194304")
0235         option(USE_CONTROL_FLOW_GUARD "Enable Control Flow Guard hardening (MSVC)" ON)
0236         if (USE_CONTROL_FLOW_GUARD)
0237         set(SECURITY_C_FLAGS "/guard:cf")
0238         set(SECURITY_CXX_FLAGS "/guard:cf")
0239         set(SECURITY_EXE_LINKER_FLAGS "/GUARD:CF")
0240         set(SECURITY_SHARED_LINKER_FLAGS "/GUARD:CF")
0241         set(SECURITY_MODULE_LINKER_FLAGS "/GUARD:CF")
0242         endif (USE_CONTROL_FLOW_GUARD)
0243         set(GLOBAL_PROFILE ${GLOBAL_PROFILE}
0244                 -DCMAKE_C_FLAGS=${SECURITY_C_FLAGS}
0245                 -DCMAKE_CXX_FLAGS=${SECURITY_CXX_FLAGS}
0246                 -DCMAKE_EXE_LINKER_FLAGS=${SECURITY_EXE_LINKER_FLAGS}
0247                 -DCMAKE_SHARED_LINKER_FLAGS=${SECURITY_SHARED_LINKER_FLAGS}
0248                 -DCMAKE_MODULE_LINKER_FLAGS=${SECURITY_MODULE_LINKER_FLAGS}
0249         )
0250 endif ()
0251 
0252 if (DEFINED EP_PREFIX)
0253         set_directory_properties(PROPERTIES EP_PREFIX ${EP_PREFIX})
0254 endif ()
0255 
0256 if (WIN32)
0257    set(PATCH_COMMAND patch)
0258 endif()
0259 
0260 if (MSYS)
0261         set(PATCH_COMMAND patch)
0262     set(GLOBAL_PROFILE ${GLOBAL_PROFILE}
0263                            -DCMAKE_TOOLCHAIN_FILE=${MXE_TOOLCHAIN}
0264                            -DCMAKE_FIND_PREFIX_PATH=${CMAKE_PREFIX_PATH}
0265                            -DCMAKE_SYSTEM_INCLUDE_PATH=${CMAKE_PREFIX_PATH}/include
0266                            -DCMAKE_INCLUDE_PATH=${CMAKE_PREFIX_PATH}/include
0267                            -DCMAKE_LIBRARY_PATH=${CMAKE_PREFIX_PATH}/lib
0268                            -DZLIB_ROOT=${CMAKE_PREFIX_PATH}
0269     )
0270     set(GLOBAL_AUTOMAKE_PROFILE  --host=i686-pc-mingw32 )
0271 endif()
0272 
0273 if (APPLE)
0274     set(PARENT_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
0275     string(REPLACE ";" "$<SEMICOLON>" CMAKE_OSX_ARCHITECTURES_ESCAPED "${CMAKE_OSX_ARCHITECTURES}")
0276     set(GLOBAL_PROFILE ${GLOBAL_PROFILE}
0277                         -DCMAKE_PREFIX_PATH:PATH=${CMAKE_PREFIX_PATH}
0278                         -DCMAKE_INCLUDE_PATH:PATH=${CMAKE_PREFIX_PATH}/include
0279                         -DCMAKE_LIBRARY_PATH:PATH=${CMAKE_PREFIX_PATH}/lib
0280                         -DCMAKE_MACOSX_RPATH=ON
0281                         -DKDE_SKIP_RPATH_SETTINGS=ON
0282                         -DBUILD_WITH_INSTALL_RPATH=ON
0283                         -DAPPLE_SUPPRESS_X11_WARNING=ON
0284                         -DCMAKE_FIND_FRAMEWORK=LAST
0285                         -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES_ESCAPED}
0286     )
0287 
0288     list(LENGTH CMAKE_OSX_ARCHITECTURES MACOS_ARCHS)
0289     list(JOIN CMAKE_OSX_ARCHITECTURES " " CMAKE_OSX_ARCHITECTURES_STR)
0290 
0291     foreach(arch ${CMAKE_OSX_ARCHITECTURES})
0292         string(APPEND MACOS_ARCH_FLAGS "-arch ${arch} ")
0293     endforeach()
0294     string(STRIP "${MACOS_ARCH_FLAGS}" MACOS_ARCH_FLAGS)
0295 
0296     set(GLOBAL_AUTOMAKE_PROFILE 
0297         "CFLAGS=${MACOS_ARCH_FLAGS}"
0298         "CXXFLAGS=${MACOS_ARCH_FLAGS}"
0299     )
0300 
0301     set(PATCH_COMMAND patch)
0302 
0303 endif ()
0304 
0305 if (ANDROID)
0306   # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0307   set(SECURITY_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0308   set(SECURITY_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0309   set(SECURITY_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0310 
0311   string(REPLACE ";" "$<SEMICOLON>" _escape_find_root_path "${CMAKE_FIND_ROOT_PATH}")
0312   # stl must be consistent: https://github.com/android/ndk/issues/1441
0313   set (GLOBAL_PROFILE ${GLOBAL_PROFILE}
0314                      -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
0315                      -DANDROID_PLATFORM=${ANDROID_PLATFORM}
0316                      -DANDROID_ABI=${ANDROID_ABI}
0317                      -DANDROID_STL=${ANDROID_STL}
0318                      -DCMAKE_FIND_ROOT_PATH=${_escape_find_root_path}
0319                      -DCMAKE_EXE_LINKER_FLAGS=${SECURITY_EXE_LINKER_FLAGS}
0320                      -DCMAKE_SHARED_LINKER_FLAGS=${SECURITY_SHARED_LINKER_FLAGS}
0321                      -DCMAKE_MODULE_LINKER_FLAGS=${SECURITY_MODULE_LINKER_FLAGS})
0322 endif()
0323 
0324 function(TestCompileLinkPythonLibs OUTPUT_VARNAME)
0325         include(CheckCXXSourceCompiles)
0326         set(CMAKE_REQUIRED_INCLUDES ${Python_INCLUDE_DIRS})
0327         set(CMAKE_REQUIRED_LIBRARIES ${Python_LIBRARIES})
0328         if (MINGW)
0329                 set(CMAKE_REQUIRED_DEFINITIONS -D_hypot=hypot)
0330         endif ()
0331         unset(${OUTPUT_VARNAME} CACHE)
0332         CHECK_CXX_SOURCE_COMPILES("
0333 // https://bugs.python.org/issue22411
0334 #if defined(_MSC_VER)
0335 #  ifdef _DEBUG
0336 #    undef _DEBUG
0337 #  endif /* _DEBUG */
0338 #endif /* _MSC_VER */
0339 #include <Python.h>
0340 int main(int argc, char *argv[]) {
0341         Py_InitializeEx(0);
0342 }" ${OUTPUT_VARNAME})
0343 endfunction()
0344 
0345 function(DumpSitePackages PYTHONPATH)
0346     if (WIN32)
0347         krita_to_native_path("${${PYTHONPATH}}" _krita_pythonpath)
0348         string(TOLOWER "${_krita_pythonpath}" _krita_pythonpath)
0349     else()
0350         set(_krita_pythonpath ${${PYTHONPATH}})
0351     endif()
0352     execute_process(COMMAND ${CMAKE_COMMAND}
0353         -E env PYTHONPATH=${_krita_pythonpath}
0354         ${Python_EXECUTABLE} -c "import sysconfig; print(sysconfig.get_paths());"
0355         OUTPUT_VARIABLE __sysconfig)
0356     message(STATUS "Python's system directories: ${__sysconfig}")
0357     execute_process(COMMAND ${CMAKE_COMMAND}
0358         -E env PYTHONPATH=${_krita_pythonpath}
0359         ${Python_EXECUTABLE} -c "from setuptools.command import easy_install; print(easy_install.get_site_dirs())"
0360         OUTPUT_VARIABLE __setuptools)
0361     message(STATUS "Python's setuptools directories: ${__setuptools}")
0362 endfunction()
0363 
0364 if (WIN32)
0365     option(ENABLE_PYTHON_DEPS "Enable Python deps (sip, pyqt)" ON)
0366     if (ENABLE_PYTHON_DEPS)
0367         set(KRITA_PYTHONPATH "${INSTALL_ROOT}/lib/site-packages;$ENV{PYTHONPATH}")
0368         message(STATUS "Krita's PEP-0250 root: ${KRITA_PYTHONPATH}")
0369         set(Python_FIND_STRATEGY LOCATION)
0370         find_package(Python 3.8 COMPONENTS Development Interpreter)
0371         if (Python_FOUND)
0372             message(STATUS "Python requirements met.")
0373             TestCompileLinkPythonLibs(CAN_USE_PYTHON_LIBS)
0374             DumpSitePackages(KRITA_PYTHONPATH)
0375             if (NOT CAN_USE_PYTHON_LIBS)
0376                 file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log ERROR_LOG)
0377                 string(REPLACE "\n" "\n  " ERROR_LOG "${ERROR_LOG}")
0378                 message(FATAL_ERROR "Compiling with Python library failed, please check whether the architecture is correct!\nCMakeError.log:\n  ${ERROR_LOG}\n\n")
0379             endif ()
0380         else ()
0381             message(FATAL_ERROR "Python requirements not met. To disable Python deps, set ENABLE_PYTHON_DEPS to OFF.")
0382         endif ()
0383     endif ()
0384 elseif(UNIX)
0385     set(PYTHON_VERSION "3.10")
0386 
0387     set(KRITA_PYTHONPATH "${INSTALL_ROOT}/lib/python${PYTHON_VERSION}/site-packages")
0388     message(STATUS "Krita's PEP-0250 root: ${KRITA_PYTHONPATH}")
0389 endif ()
0390 
0391 # Prepare meson-compatible environment variables
0392 if (WIN32)
0393     krita_to_native_path("${KRITA_PYTHONPATH}" _krita_pythonpath)
0394     string(TOLOWER ${_krita_pythonpath} _krita_pythonpath)
0395     krita_to_native_environment_path_list("${_krita_pythonpath}" _krita_pythonpath)
0396 else()
0397     set(_krita_pythonpath ${KRITA_PYTHONPATH})
0398 endif()
0399 
0400 message(STATUS "Python environment for Krita: ${_krita_pythonpath}")
0401 
0402 macro(mesonify VAR DEST)
0403     set(${DEST} "${${VAR}}")
0404     separate_arguments(${DEST})
0405     if (MSVC) # Fix compiler flags
0406         list(TRANSFORM ${DEST} REPLACE "^\/" "-")
0407     endif()
0408     list(TRANSFORM ${DEST} REPLACE "(.+)" "\'\\1\'")
0409     list(FILTER ${DEST} EXCLUDE REGEX "^$")
0410     list(JOIN ${DEST} "," ${DEST})
0411     set(${DEST} "[${${DEST}}]")
0412 endmacro()
0413 
0414 if (ANDROID OR (CMAKE_CROSSCOMPILING AND NOT APPLE))
0415     set(CROSS_COMPILE_FLAGS "--sysroot=${CMAKE_SYSROOT}")
0416     set(CROSS_LINKER_FLAGS "--sysroot=${CMAKE_SYSROOT}")
0417 elseif (APPLE)
0418     set(CROSS_COMPILE_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT}")
0419     set(CROSS_LINKER_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT}")
0420 endif()
0421 
0422 if (ANDROID OR CMAKE_CROSSCOMPILING)
0423     set(CROSS_COMPILE_FLAGS "${CROSS_COMPILE_FLAGS} --target=${CMAKE_C_COMPILER_TARGET}")
0424     set(CROSS_LINKER_FLAGS "${CROSS_EXE_LINKER_FLAGS} --target=${CMAKE_C_COMPILER_TARGET}")
0425 endif()
0426 
0427 if (ANDROID)
0428 # Meson injects -D_FILE_OFFSET_BITS=64 which triggers off_t functions.
0429 # Alternatively, increase API level to 24.
0430     set(CROSS_COMPILE_FLAGS "${CROSS_COMPILE_FLAGS} -D_LIBCPP_HAS_NO_OFF_T_FUNCTIONS")
0431 endif()
0432 
0433 if (CMAKE_OSX_ARCHITECTURES)
0434     foreach(arch ${CMAKE_OSX_ARCHITECTURES})
0435         string(APPEND CROSS_COMPILE_FLAGS_${arch} "${CROSS_COMPILE_FLAGS} -arch ${arch}")
0436     endforeach()
0437 endif()
0438 
0439 mesonify(SECURITY_C_FLAGS _security_c_flags)
0440 mesonify(SECURITY_CXX_FLAGS _security_cxx_flags)
0441 mesonify(SECURITY_EXE_LINKER_FLAGS _security_exe_linker_flags)
0442 mesonify(CROSS_COMPILE_FLAGS _cross_compile_flags)
0443 mesonify(CROSS_LINKER_FLAGS _cross_linker_flags)
0444 
0445 # Block any libraries not coming from our PATH when crosscompiling
0446 if (UNIX AND CMAKE_CROSSCOMPILING)
0447     set(_pkg_config_libdir "pkg_config_libdir = ''")
0448 else()
0449     # In Windows either we pick up the MSYS2 pkg-config
0450     # or we ship our own, both use the correct architecture.
0451     # Linux also uses the correct architecture.
0452     set(_pkg_config_libdir)
0453 endif()
0454 
0455 include(TestBigEndian)
0456 test_big_endian(IS_ENDIAN)
0457 set(CROSSCOMPILING REQUIRED)
0458 
0459 if (IS_ENDIAN)
0460     set(_endian "big")
0461 else()
0462     set(_endian "little")
0463 endif()
0464 
0465 string(TOLOWER ${CMAKE_SYSTEM_NAME} _system_name)
0466 
0467 if (ANDROID OR CMAKE_CROSSCOMPILING)
0468     set(EXTRA_MESON_FLAGS
0469         --cross-file=${CMAKE_CURRENT_BINARY_DIR}/meson-compiler.ini
0470         --cross-file=${CMAKE_CURRENT_BINARY_DIR}/meson-host.ini
0471     )
0472     set(CROSSCOMPILING REQUIRED)
0473 else()
0474     set(EXTRA_MESON_FLAGS
0475         --native-file=${CMAKE_CURRENT_BINARY_DIR}/meson-compiler.ini
0476     )
0477     set(CROSSCOMPILING)
0478 endif()
0479 
0480 if (MSVC)
0481     set(_c_ld "c_ld = ['${CMAKE_LINKER}'] + cross_link_args")
0482     set(_cpp_ld "cpp_ld = ['${CMAKE_LINKER}'] + cross_link_args")
0483 endif()
0484 
0485 if (CMAKE_CROSSCOMPILING AND NOT APPLE)
0486 find_package(Python 3.0 COMPONENTS Interpreter REQUIRED)
0487 set_package_properties(Python PROPERTIES
0488     DESCRIPTION "Python Library"
0489     URL "https://www.python.org"
0490     TYPE REQUIRED
0491     PURPOSE "Required to run Meson when crosscompiling")
0492 endif()
0493 find_program(MESON_BINARY_PATH meson)
0494 find_program(NINJA_BINARY_PATH ninja)
0495 find_package(PkgConfig QUIET ${CROSSCOMPILING})
0496 
0497 if (NOT Python_EXECUTABLE)
0498     set(Python_EXECUTABLE ${EXTPREFIX}/bin/python3)
0499     if(NOT EXISTS "${Python_EXECUTABLE}")
0500         message("WARNING: using system python3!")
0501         SET(Python_EXECUTABLE python3)
0502     endif()
0503 
0504     set(PYTHON_DEP ext_python)
0505 endif()
0506 
0507 # python needs openssl
0508 if (NOT WIN32 OR OPENSSL_DEP)
0509     add_subdirectory( ext_openssl )
0510 endif()
0511 
0512 # Meson needs the sitecustomize.py to set the site-packages root
0513 add_subdirectory( ext_python )
0514 
0515 if (NOT NINJA_BINARY_PATH)
0516     set(NINJA_DEP ext_ninja)
0517     message(STATUS "Ninja not available, building 3rdparty version.")
0518     add_subdirectory(ext_ninja)
0519 endif()
0520 
0521 if (NOT MESON_BINARY_PATH)
0522     set(MESON_DEP ext_meson)
0523     set(MESON_BINARY_PATH ${EXTPREFIX}/bin/meson)
0524     message(STATUS "Meson not available, building 3rdparty version.")
0525     add_subdirectory(ext_meson)
0526 endif()
0527 
0528 set(MESON_NASM_PATH "${EXTPREFIX}/bin/nasm${CMAKE_EXECUTABLE_SUFFIX}")
0529 
0530 if (NOT PKG_CONFIG_FOUND OR WIN32)
0531     set(PKG_CONFIG_DEP ext_pkgconfig)
0532     if (NOT WIN32)
0533         set(ENV{PKG_CONFIG} ${EXTPREFIX}/bin/pkg-config)
0534     else()
0535         set(ENV{PKG_CONFIG} ${EXTPREFIX}/bin/pkgconf)
0536     endif()
0537     # meson currently reads from the variable directly
0538     set(PKG_CONFIG_EXECUTABLE $ENV{PKG_CONFIG})
0539     message(STATUS "pkg-config not available, building 3rdparty version.")
0540     message(STATUS "$PKG_CONFIG is set to $ENV{PKG_CONFIG}")
0541     add_subdirectory(ext_pkgconfig)
0542 endif()
0543 
0544 configure_file(
0545     ${CMAKE_CURRENT_SOURCE_DIR}/meson-compiler.ini.in
0546     ${CMAKE_CURRENT_BINARY_DIR}/meson-compiler.ini
0547 )
0548 
0549 # Meson's CPU family is a bit different from what
0550 # Android SDK exports as CMAKE_SYSTEM_PROCESSOR
0551 set (MESON_CPU_FAMILY ${CMAKE_SYSTEM_PROCESSOR})
0552 if (${MESON_CPU_FAMILY} STREQUAL "armv7-a")
0553     set(MESON_CPU_FAMILY "arm")
0554 elseif (${MESON_CPU_FAMILY} STREQUAL "i686")
0555     set(MESON_CPU_FAMILY "x86")
0556 endif()
0557 
0558 configure_file(
0559     ${CMAKE_CURRENT_SOURCE_DIR}/meson-host.ini.in
0560     ${CMAKE_CURRENT_BINARY_DIR}/meson-host.ini
0561 )
0562 
0563 # Prepare file for crosscompile multiple archs
0564 if (CMAKE_OSX_ARCHITECTURES)
0565     foreach(arch ${CMAKE_OSX_ARCHITECTURES})
0566         mesonify(CROSS_COMPILE_FLAGS_${arch} _cross_compile_flags)
0567         configure_file(
0568             ${CMAKE_CURRENT_SOURCE_DIR}/meson-compiler.ini.in
0569             ${CMAKE_CURRENT_BINARY_DIR}/meson-compiler_${arch}.ini
0570         )
0571     endforeach()
0572 endif()
0573 
0574 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake/modules/avcodecs")
0575 
0576 include(FeatureSummary)
0577 
0578 # ======================== AUDIO ===========================
0579 
0580 find_package(FLAC 1.3.3 QUIET)
0581 set_package_properties(FLAC PROPERTIES
0582     DESCRIPTION "libFLAC flac audio codec"
0583     URL "https://xiph.org/flac/"
0584 )
0585 if (NOT FLAC_FOUND)
0586     message(STATUS "FLAC not available, building 3rdparty version.")
0587     set(FLAC_DEP ext_flac)
0588 endif()
0589 
0590 find_package(Ogg 1.3.2 QUIET)
0591 set_package_properties(Ogg PROPERTIES
0592     DESCRIPTION "ogg is a library for manipulating ogg bitstreams"
0593     URL "https://xiph.org/vorbis/"
0594 )
0595 if (NOT Ogg_FOUND)
0596     message(STATUS "libogg not available, building 3rdparty version.")
0597     set(OGG_DEP ext_libogg)
0598 endif()
0599 
0600 find_package(Opus 1.3.1 QUIET)
0601 set_package_properties(Opus PROPERTIES
0602     DESCRIPTION "Opus IETF audio codec"
0603     URL "https://opus-codec.org/"
0604 )
0605 if (NOT Opus_FOUND)
0606     message(STATUS "Opus not available, building 3rdparty version.")
0607     set(OPUS_DEP ext_opus)
0608 endif()
0609 
0610 # ======================== VIDEO ===========================
0611 
0612 find_package(VPX 1.7.0 QUIET)
0613 set_package_properties(VPX PROPERTIES
0614     DESCRIPTION "libvpx vp8/vp9 video encoder."
0615     URL "https://www.webmproject.org/"
0616 )
0617 if (NOT VPX_FOUND AND NOT WIN32)
0618     message(STATUS "libvpx not available, building 3rdparty version.")
0619     set(VPX_DEP ext_vpx)
0620 endif()
0621 
0622 find_package(SDL 2.24.0 QUIET)
0623 set_package_properties(SDL PROPERTIES
0624     DESCRIPTION "Low-level access to audio, keyboard, mouse, joystick, and graphics"
0625     URL "https://www.libsdl.org/"
0626 )
0627 if (NOT SDL_FOUND)
0628     message(STATUS "SDL not available, building 3rdparty version.")
0629     set(SDL_DEP ext_sdl2)
0630 endif()
0631 
0632 set(QT_DEP "ext_qt")
0633 # ================== END OF FFMPEG DEPS =====================
0634 
0635 # this list must be dependency-ordered
0636 if (WIN32)
0637     add_subdirectory( ext_patch )
0638 endif ()
0639 add_subdirectory( ext_lzma )
0640 
0641 if (NOT WIN32 OR ICONV_DEP)
0642     add_subdirectory( ext_iconv )
0643 endif()
0644 
0645 if (NOT WIN32 OR GETTEXT_DEP)
0646     add_subdirectory( ext_gettext )
0647 endif()
0648 
0649 if (NOT WIN32 OR ZLIB_DEP)
0650     add_subdirectory( ext_zlib )
0651 endif()
0652 
0653 add_subdirectory( ext_boost )
0654 add_subdirectory( ext_jpeg )
0655 add_subdirectory( ext_tiff )
0656 add_subdirectory( ext_png )
0657 if (WIN32)
0658     add_subdirectory( ext_icoutils )
0659 endif ()
0660 add_subdirectory( ext_eigen3 )
0661 
0662 if (NOT WIN32 OR EXPAT_DEP)
0663     add_subdirectory( ext_expat ) # for exiv2
0664 endif()
0665 
0666 add_subdirectory( ext_exiv2 )
0667 add_subdirectory( ext_lcms2 )
0668 add_subdirectory( ext_openexr )
0669 add_subdirectory( ext_gsl )
0670 add_subdirectory( ext_fftw3 )
0671 add_subdirectory( ext_ocio )
0672 add_subdirectory( ext_openjpeg )
0673 
0674 if(WIN32)
0675     add_subdirectory(ext_googleangle)
0676 endif()
0677 
0678 if (WIN32 AND NOT PERL_FOUND)
0679     add_subdirectory( ext_perl )
0680 endif()
0681 
0682 add_subdirectory(ext_icu)
0683 add_subdirectory( ext_qt )
0684 if (ANDROID)
0685   # gettext replacement
0686   add_subdirectory(ext_libintl-lite)
0687   add_subdirectory(ext_libunwindstack-ndk)
0688 endif()
0689 add_subdirectory( ext_frameworks )
0690 add_subdirectory( ext_libraw )
0691 if (ENABLE_PYTHON_DEPS OR NOT MINGW)
0692     add_subdirectory( ext_sip )
0693     add_subdirectory( ext_pyqt )
0694 endif ()
0695 
0696 if (WIN32)
0697     add_subdirectory( ext_drmingw )
0698 endif ()
0699 
0700 add_subdirectory( ext_lager )
0701 add_subdirectory( ext_heif )
0702 add_subdirectory(ext_giflib)
0703 add_subdirectory(ext_quazip)
0704 add_subdirectory(ext_seexpr)
0705 add_subdirectory(ext_json_c)
0706 add_subdirectory(ext_mypaint)
0707 
0708 if (UNIX AND NOT APPLE)
0709     add_subdirectory(ext_fcitx-qt)
0710 endif()
0711 
0712 add_subdirectory(ext_webp)
0713 add_subdirectory(ext_jpegxl)
0714 add_subdirectory(ext_xsimd)
0715 
0716 add_subdirectory(ext_freetype)
0717 add_subdirectory(ext_fontconfig)
0718 add_subdirectory(ext_poppler)
0719 add_subdirectory(ext_fribidi)
0720 add_subdirectory(ext_unibreak)
0721 
0722 add_subdirectory(ext_ffmpeg)
0723 add_subdirectory(ext_mlt)