diff --git a/docs/quick_start/installation.rst b/docs/quick_start/installation.rst index 71292348c2..51103f1f6c 100644 --- a/docs/quick_start/installation.rst +++ b/docs/quick_start/installation.rst @@ -167,12 +167,18 @@ this script on Windows. Automated Installation ++++++++++++++++++++++ -Dependencies listed above with a preceeding * can be automatically installed at -build time using the ``OCIO_INSTALL_EXT_PACKAGES`` option in your ``cmake`` -command (requires an internet connection). The C/C++ libraries are pulled from -external repositories, built, and are (typically) statically-linked into an OCIO -dynamic library. All installs of these components are fully contained within your -build directory. +Dependencies listed above with a preceeding * can be automatically installed at +configure time using the ``OCIO_INSTALL_EXT_PACKAGES`` option in your ``cmake`` +command (requires an internet connection). The C/C++ libraries are downloaded from +their official releases, built, and are (typically) statically-linked into an OCIO +dynamic library. All installs of these components are fully contained within your +build directory: they are installed in ``/ext/dist``, along with the CMake +configuration files of each package, and are then located with ``find_package``. +Subsequent CMake runs reuse them unless their build settings change. + +To build a dependency from local sources instead of downloading it (e.g. on a +machine without internet access), set ``OCIO__SOURCE_DIR`` to the +location of the extracted sources, e.g. ``-DOCIO_yaml-cpp_SOURCE_DIR=``. Three ``OCIO_INSTALL_EXT_PACKAGES`` options are available:: diff --git a/setup.py b/setup.py index b55c534ed9..dd49cac952 100644 --- a/setup.py +++ b/setup.py @@ -14,24 +14,27 @@ from setuptools.command.build_ext import build_ext -# Extract the project version from CMake generated ABI header. +# Extract the project version from the top level CMakeLists.txt, the same way CMake builds +# OCIO_VERSION_FULL_STR in OpenColorABI.h. Running a CMake configuration instead would build the +# missing dependencies at configure time. def get_version(): VERSION_REGEX = re.compile( - r"^\s*#\s*define\s+OCIO_VERSION_FULL_STR\s+\"(.*)\"\s*$", re.MULTILINE) + r"^\s*project\(\s*OpenColorIO\s+VERSION\s+([0-9.]+)\s", re.MULTILINE) + RELEASE_TYPE_REGEX = re.compile( + r"^\s*set\(\s*OpenColorIO_VERSION_RELEASE_TYPE\s+\"(.*)\"\s*\)", re.MULTILINE) here = os.path.abspath(os.path.dirname(__file__)) - with tempfile.TemporaryDirectory() as tmpdir: - try: - subprocess.check_call(["cmake", here], cwd=tmpdir) - path = os.path.join(tmpdir, "include", "OpenColorIO", "OpenColorABI.h") - with open(path) as f: - match = VERSION_REGEX.search(f.read()) - return match.group(1) - except Exception as e: - raise RuntimeError( - "Unable to find OpenColorIO version: {}".format(str(e)) - ) + try: + with open(os.path.join(here, "CMakeLists.txt")) as f: + content = f.read() + version = VERSION_REGEX.search(content).group(1) + release_type = RELEASE_TYPE_REGEX.search(content).group(1) + return version + release_type + except Exception as e: + raise RuntimeError( + "Unable to find OpenColorIO version: {}".format(str(e)) + ) # Call CMake find_package from a dummy script and return whether the package @@ -146,6 +149,8 @@ def build_extension(self, ext): cmake_args += [ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), extdir), "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), bindir), + # Only the requested configuration of the dependencies is needed. + "-DCMAKE_CONFIGURATION_TYPES={}".format(cfg), ] build_args += ["--config", cfg] diff --git a/share/ci/scripts/multi/install_lcms2.sh b/share/ci/scripts/multi/install_lcms2.sh index 37e7237e4d..a4c84e8d40 100755 --- a/share/ci/scripts/multi/install_lcms2.sh +++ b/share/ci/scripts/multi/install_lcms2.sh @@ -17,15 +17,13 @@ else git checkout tags/lcms${LCMS2_VERSION} -b lcms${LCMS2_VERSION} fi -cp ../share/cmake/projects/Buildlcms2.cmake CMakeLists.txt - mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release \ ${INSTALL_TARGET:+"-DCMAKE_INSTALL_PREFIX="${INSTALL_TARGET}""} \ - -DBUILD_SHARED_LIBS=ON \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - ../. + -DOCIO_DEP_SOURCE_DIR="$(pwd)/.." \ + ../../share/cmake/projects/lcms2 cmake --build . \ --target install \ --config Release \ diff --git a/share/ci/scripts/multi/install_pystring.sh b/share/ci/scripts/multi/install_pystring.sh index 8d33616f99..ec037f38b1 100755 --- a/share/ci/scripts/multi/install_pystring.sh +++ b/share/ci/scripts/multi/install_pystring.sh @@ -17,15 +17,13 @@ else git checkout tags/v${PYSTRING_VERSION} -b v${PYSTRING_VERSION} fi -cp ../share/cmake/projects/Buildpystring.cmake CMakeLists.txt - mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release \ ${INSTALL_TARGET:+"-DCMAKE_INSTALL_PREFIX="${INSTALL_TARGET}""} \ - -DBUILD_SHARED_LIBS=ON \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - ../. + -DOCIO_DEP_SOURCE_DIR="$(pwd)/.." \ + ../../share/cmake/projects/pystring cmake --build . \ --target install \ --config Release \ diff --git a/share/cmake/deps/Imath.cmake b/share/cmake/deps/Imath.cmake new file mode 100644 index 0000000000..a61b519ec7 --- /dev/null +++ b/share/cmake/deps/Imath.cmake @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build Imath +# +# Global targets defined by the Imath CMake configuration files: +# Imath::Imath +# Imath::ImathConfig +# + +set(_Imath_URL_HASH_3.2.1 "SHA256=b2c8a44c3e4695b74e9644c76f5f5480767355c6f98cde58ba0e82b4ad8c63ce") + +set(_Imath_VERSION ${OCIO_Imath_RECOMMENDED_VERSION}) + +ocio_build_dependency(Imath + VERSION ${_Imath_VERSION} + URL "https://github.com/AcademySoftwareFoundation/Imath/archive/refs/tags/v${_Imath_VERSION}.tar.gz" + URL_HASH "${_Imath_URL_HASH_${_Imath_VERSION}}" + CMAKE_ARGS + -DBUILD_TESTING=OFF + -DPYTHON=OFF + -DDOCS=OFF + -DIMATH_HALF_USE_LOOKUP_TABLE=OFF +) + +ocio_find_built_dependency(Imath ${_Imath_VERSION} EXACT) diff --git a/share/cmake/deps/OpenEXR.cmake b/share/cmake/deps/OpenEXR.cmake new file mode 100644 index 0000000000..0a5de919d2 --- /dev/null +++ b/share/cmake/deps/OpenEXR.cmake @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build OpenEXR +# +# Global targets defined by the OpenEXR CMake configuration files: +# OpenEXR::OpenEXR +# OpenEXR::OpenEXRCore +# OpenEXR::OpenEXRUtil +# OpenEXR::Iex +# OpenEXR::IlmThread +# (and their *Config interface targets) +# +# Depending on user options when configuring OCIO, OpenEXR can be used to +# build libOpenColorIOimageioapphelpers. +# + +set(_OpenEXR_URL_HASH_3.4.0 "SHA256=d7b31637d7adc359f5e5a7517ba918cb5997bc1a4ae7a808ec874cdf91da93c0") + +set(_OpenEXR_VERSION ${OCIO_OpenEXR_RECOMMENDED_VERSION}) + +set(_OpenEXR_CMAKE_ARGS + -DBUILD_TESTING=OFF + -DOPENEXR_BUILD_EXAMPLES=OFF + -DOPENEXR_BUILD_TOOLS=OFF + -DOPENEXR_INSTALL_PKG_CONFIG=OFF + -DOPENEXR_FORCE_INTERNAL_DEFLATE=ON + -DOPENEXR_FORCE_INTERNAL_OPENJPH=ON + # OpenEXR 3.4.0 would use OpenJPH 0.22.0 by default, request the latest version at release + # time including build fixes. + -DOPENEXR_OPENJPH_TAG=0.23.1 +) + +# Build against the Imath used by OCIO, otherwise OpenEXR would download its own copy, which might +# result in version conflicts. An Imath built by OCIO is found through CMAKE_PREFIX_PATH. +if(Imath_DIR) + list(APPEND _OpenEXR_CMAKE_ARGS -DImath_DIR=${Imath_DIR}) +endif() + +ocio_build_dependency(OpenEXR + VERSION ${_OpenEXR_VERSION} + URL "https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v${_OpenEXR_VERSION}.tar.gz" + URL_HASH "${_OpenEXR_URL_HASH_${_OpenEXR_VERSION}}" + CMAKE_ARGS ${_OpenEXR_CMAKE_ARGS} +) + +ocio_find_built_dependency(OpenEXR ${_OpenEXR_VERSION} EXACT) diff --git a/share/cmake/deps/ZLIB.cmake b/share/cmake/deps/ZLIB.cmake new file mode 100644 index 0000000000..bdb21bc5c4 --- /dev/null +++ b/share/cmake/deps/ZLIB.cmake @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build ZLIB +# +# Global targets defined by CMake's FindZLIB module: +# ZLIB::ZLIB +# + +set(_ZLIB_URL_HASH_1.3.1 "SHA256=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23") + +set(_ZLIB_VERSION ${OCIO_ZLIB_RECOMMENDED_VERSION}) + +ocio_build_dependency(ZLIB + VERSION ${_ZLIB_VERSION} + URL "https://github.com/madler/zlib/releases/download/v${_ZLIB_VERSION}/zlib-${_ZLIB_VERSION}.tar.gz" + URL_HASH "${_ZLIB_URL_HASH_${_ZLIB_VERSION}}" + CMAKE_ARGS + # ZLIB requires an old CMake version that has no knowledge of this policy. + -DCMAKE_POLICY_DEFAULT_CMP0042=NEW + -DZLIB_BUILD_EXAMPLES=OFF +) + +# ZLIB 1.3.1 always installs both a shared and a static library. Remove the shared one, so that +# anything searching ZLIB in ${OCIO_EXT_DIST_ROOT} (e.g. minizip-ng, or consumers of a static +# OCIO) uses the static library OCIO links with. The shared library is named zlib on Windows. +foreach(_ZLIB_NAME z zd zlib zlibd) + file(GLOB _ZLIB_SHARED_FILES + "${OCIO_EXT_DIST_ROOT}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}${_ZLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}*" + "${OCIO_EXT_DIST_ROOT}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}${_ZLIB_NAME}.*${CMAKE_SHARED_LIBRARY_SUFFIX}" + "${OCIO_EXT_DIST_ROOT}/bin/${CMAKE_SHARED_LIBRARY_PREFIX}${_ZLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") + if(WIN32) + # Import library of the DLL. + list(APPEND _ZLIB_SHARED_FILES + "${OCIO_EXT_DIST_ROOT}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}${_ZLIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}") + endif() + if(_ZLIB_SHARED_FILES) + file(REMOVE ${_ZLIB_SHARED_FILES}) + endif() +endforeach() + +# Discard the results of a previous search, e.g. a system ZLIB rejected for being too old, as +# find_library and find_path don't search again when the cache variables are already set. +foreach(_ZLIB_VAR ZLIB_LIBRARY ZLIB_LIBRARY_RELEASE ZLIB_LIBRARY_DEBUG ZLIB_INCLUDE_DIR) + unset(${_ZLIB_VAR}) + unset(${_ZLIB_VAR} CACHE) +endforeach() + +# ZLIB 1.3.1 doesn't provide CMake configuration files. Point CMake's FindZLIB module to the static +# library, as it would do with ZLIB_USE_STATIC_LIBS (CMake 3.24+). The static library is named +# zlibstatic on Windows. +set(_ZLIB_NAMES z zlibstatic) +foreach(_ZLIB_CONFIG RELEASE DEBUG) + set(_ZLIB_STATIC_NAMES "") + foreach(_ZLIB_NAME ${_ZLIB_NAMES}) + list(APPEND _ZLIB_STATIC_NAMES + "${CMAKE_STATIC_LIBRARY_PREFIX}${_ZLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}") + endforeach() + + find_library(ZLIB_LIBRARY_${_ZLIB_CONFIG} + NAMES ${_ZLIB_STATIC_NAMES} + PATHS "${OCIO_EXT_DIST_ROOT}/lib" + NO_DEFAULT_PATH) + + # The Debug library has a "d" suffix. + list(TRANSFORM _ZLIB_NAMES APPEND "d") +endforeach() + +find_path(ZLIB_INCLUDE_DIR + NAMES zlib.h + PATHS "${OCIO_EXT_DIST_ROOT}/include" + NO_DEFAULT_PATH) + +find_package(ZLIB ${_ZLIB_VERSION} EXACT MODULE REQUIRED) diff --git a/share/cmake/deps/expat.cmake b/share/cmake/deps/expat.cmake new file mode 100644 index 0000000000..5f3e0d2f22 --- /dev/null +++ b/share/cmake/deps/expat.cmake @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build expat +# +# Global targets defined by the expat CMake configuration files: +# expat::expat +# + +set(_expat_URL_HASH_2.7.2 "SHA256=21b778b34ec837c2ac285aef340f9fb5fa063a811b21ea4d2412a9702c88995c") + +set(_expat_VERSION ${OCIO_expat_RECOMMENDED_VERSION}) +string(REPLACE "." "_" _expat_TAG "R_${_expat_VERSION}") + +set(_expat_CMAKE_ARGS + -DEXPAT_BUILD_DOCS=OFF + -DEXPAT_BUILD_EXAMPLES=OFF + -DEXPAT_BUILD_TESTS=OFF + -DEXPAT_BUILD_TOOLS=OFF + -DEXPAT_SHARED_LIBS=OFF +) + +# expat ignores CMAKE_DEBUG_POSTFIX and only uses a Debug postfix on Windows. With multi-config +# generators, the Debug and Release libraries must not collide. +get_property(_expat_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(_expat_IS_MULTI_CONFIG AND NOT WIN32) + list(APPEND _expat_CMAKE_ARGS -DEXPAT_DEBUG_POSTFIX=d) +endif() + +ocio_build_dependency(expat + VERSION ${_expat_VERSION} + URL "https://github.com/libexpat/libexpat/releases/download/${_expat_TAG}/expat-${_expat_VERSION}.tar.xz" + URL_HASH "${_expat_URL_HASH_${_expat_VERSION}}" + CMAKE_ARGS ${_expat_CMAKE_ARGS} +) + +ocio_find_built_dependency(expat ${_expat_VERSION} EXACT) diff --git a/share/cmake/deps/lcms2.cmake b/share/cmake/deps/lcms2.cmake new file mode 100644 index 0000000000..c6699135f7 --- /dev/null +++ b/share/cmake/deps/lcms2.cmake @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build lcms2 +# +# Global targets defined by the lcms2 CMake configuration files: +# lcms2::lcms2 +# + +set(_lcms2_URL_HASH_2.17 "SHA256=6e6f6411db50e85ae8ff7777f01b2da0614aac13b7b9fcbea66dc56a1bc71418") + +set(_lcms2_VERSION ${OCIO_lcms2_RECOMMENDED_VERSION}) + +# Little-CMS only provides Autotools and Meson builds. +ocio_build_dependency(lcms2 + VERSION ${_lcms2_VERSION} + URL "https://github.com/mm2/Little-CMS/archive/refs/tags/lcms${_lcms2_VERSION}.tar.gz" + URL_HASH "${_lcms2_URL_HASH_${_lcms2_VERSION}}" + PROJECT_DIR "${PROJECT_SOURCE_DIR}/share/cmake/projects/lcms2" +) + +ocio_find_built_dependency(lcms2 ${_lcms2_VERSION} EXACT) diff --git a/share/cmake/deps/minizip-ng.cmake b/share/cmake/deps/minizip-ng.cmake new file mode 100644 index 0000000000..1753da0270 --- /dev/null +++ b/share/cmake/deps/minizip-ng.cmake @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build minizip-ng +# +# Global targets defined by the minizip-ng CMake configuration files: +# MINIZIP::minizip-ng +# +# Link against the following target: +# ZLIB::ZLIB +# + +set(_minizip-ng_URL_HASH_4.0.10 "SHA256=c362e35ee973fa7be58cc5e38a4a6c23cc8f7e652555daf4f115a9eb2d3a6be7") + +set(_minizip-ng_VERSION ${OCIO_minizip-ng_RECOMMENDED_VERSION}) + +set(_minizip-ng_CMAKE_ARGS + -DMZ_OPENSSL=OFF + -DMZ_LIBBSD=OFF + -DMZ_BUILD_TESTS=OFF + -DMZ_COMPAT=OFF + -DMZ_BZIP2=OFF + -DMZ_LZMA=OFF + -DMZ_LIBCOMP=OFF + -DMZ_ZSTD=OFF + -DMZ_PKCRYPT=OFF + -DMZ_WZAES=OFF + -DMZ_SIGNING=OFF + -DMZ_ZLIB=ON + -DMZ_ICONV=OFF + -DMZ_FETCH_LIBS=OFF + -DMZ_FORCE_FETCH_LIBS=OFF + -DCMAKE_DISABLE_FIND_PACKAGE_ZLIBNG=ON +) + +# Build against the ZLIB used by OCIO (minizip-ng records the library path in its exported +# targets). Pass the per-configuration libraries to support multi-config generators. +get_target_property(_minizip-ng_ZLIB_INCLUDE_DIRS ZLIB::ZLIB INTERFACE_INCLUDE_DIRECTORIES) +list(GET _minizip-ng_ZLIB_INCLUDE_DIRS 0 _minizip-ng_ZLIB_INCLUDE_DIR) +list(APPEND _minizip-ng_CMAKE_ARGS -DZLIB_INCLUDE_DIR=${_minizip-ng_ZLIB_INCLUDE_DIR}) + +get_target_property(_minizip-ng_ZLIB_LOCATION ZLIB::ZLIB IMPORTED_LOCATION) +if(_minizip-ng_ZLIB_LOCATION) + list(APPEND _minizip-ng_CMAKE_ARGS -DZLIB_LIBRARY=${_minizip-ng_ZLIB_LOCATION}) +endif() +foreach(_minizip-ng_CONFIG RELEASE DEBUG) + get_target_property(_minizip-ng_ZLIB_LOCATION ZLIB::ZLIB IMPORTED_LOCATION_${_minizip-ng_CONFIG}) + if(_minizip-ng_ZLIB_LOCATION) + list(APPEND _minizip-ng_CMAKE_ARGS + -DZLIB_LIBRARY_${_minizip-ng_CONFIG}=${_minizip-ng_ZLIB_LOCATION}) + endif() +endforeach() + +ocio_build_dependency(minizip-ng + VERSION ${_minizip-ng_VERSION} + URL "https://github.com/zlib-ng/minizip-ng/archive/refs/tags/${_minizip-ng_VERSION}.tar.gz" + URL_HASH "${_minizip-ng_URL_HASH_${_minizip-ng_VERSION}}" + CMAKE_ARGS ${_minizip-ng_CMAKE_ARGS} +) + +ocio_find_built_dependency(minizip-ng ${_minizip-ng_VERSION} EXACT) diff --git a/share/cmake/deps/openfx.cmake b/share/cmake/deps/openfx.cmake new file mode 100644 index 0000000000..de6be4bd06 --- /dev/null +++ b/share/cmake/deps/openfx.cmake @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Install openfx headers +# +# Global targets defined by the openfx CMake configuration files: +# openfx::module +# +# Variables defined by this module: +# openfx_INCLUDE_DIR - Location of the header files +# + +set(_openfx_URL_HASH_1.5 "SHA256=553a8e2c24eabd263e6ece8d85fd08650c9601b689dd8c16dfa0c5895bb078d3") + +set(_openfx_VERSION ${OCIO_openfx_RECOMMENDED_VERSION}) + +# The openfx CMakeLists.txt requires Conan provided dependencies, OCIO only needs the headers. +ocio_build_dependency(openfx + VERSION ${_openfx_VERSION} + URL "https://github.com/AcademySoftwareFoundation/openfx/archive/refs/tags/OFX_Release_${_openfx_VERSION}.tar.gz" + URL_HASH "${_openfx_URL_HASH_${_openfx_VERSION}}" + PROJECT_DIR "${PROJECT_SOURCE_DIR}/share/cmake/projects/openfx" +) + +ocio_find_built_dependency(openfx ${_openfx_VERSION} EXACT) + +get_target_property(openfx_INCLUDE_DIR openfx::module INTERFACE_INCLUDE_DIRECTORIES) diff --git a/share/cmake/deps/pybind11.cmake b/share/cmake/deps/pybind11.cmake new file mode 100644 index 0000000000..0d8ad2e971 --- /dev/null +++ b/share/cmake/deps/pybind11.cmake @@ -0,0 +1,30 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build pybind11 +# +# Global targets defined by the pybind11 CMake configuration files: +# pybind11::module +# pybind11::headers +# +# Variables defined by the pybind11 CMake configuration files: +# pybind11_INCLUDE_DIR +# + +set(_pybind11_URL_HASH_3.0.1 "SHA256=741633da746b7c738bb71f1854f957b9da660bcd2dce68d71949037f0969d0ca") + +set(_pybind11_VERSION ${OCIO_pybind11_RECOMMENDED_VERSION}) + +# pybind11 is header only, there is no need to search for Python when installing it. OCIO's own +# Python search is used when loading the pybind11 CMake configuration files. +ocio_build_dependency(pybind11 + VERSION ${_pybind11_VERSION} + URL "https://github.com/pybind/pybind11/archive/refs/tags/v${_pybind11_VERSION}.tar.gz" + URL_HASH "${_pybind11_URL_HASH_${_pybind11_VERSION}}" + CMAKE_ARGS + -DPYBIND11_INSTALL=ON + -DPYBIND11_TEST=OFF + -DPYBIND11_NOPYTHON=ON +) + +ocio_find_built_dependency(pybind11 ${_pybind11_VERSION} EXACT) diff --git a/share/cmake/deps/pystring.cmake b/share/cmake/deps/pystring.cmake new file mode 100644 index 0000000000..fae8758b04 --- /dev/null +++ b/share/cmake/deps/pystring.cmake @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build pystring +# +# Global targets defined by the pystring CMake configuration files: +# pystring::pystring +# + +set(_pystring_URL_HASH_1.1.4 "SHA256=49da0fe2a049340d3c45cce530df63a2278af936003642330287b68cefd788fb") + +set(_pystring_VERSION ${OCIO_pystring_RECOMMENDED_VERSION}) + +# The pystring CMakeLists.txt doesn't install the headers nor CMake configuration files. +ocio_build_dependency(pystring + VERSION ${_pystring_VERSION} + URL "https://github.com/imageworks/pystring/archive/refs/tags/v${_pystring_VERSION}.tar.gz" + URL_HASH "${_pystring_URL_HASH_${_pystring_VERSION}}" + PROJECT_DIR "${PROJECT_SOURCE_DIR}/share/cmake/projects/pystring" +) + +ocio_find_built_dependency(pystring ${_pystring_VERSION} EXACT) diff --git a/share/cmake/deps/yaml-cpp.cmake b/share/cmake/deps/yaml-cpp.cmake new file mode 100644 index 0000000000..e937290484 --- /dev/null +++ b/share/cmake/deps/yaml-cpp.cmake @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Build yaml-cpp +# +# Global targets defined by the yaml-cpp CMake configuration files: +# yaml-cpp::yaml-cpp +# + +set(_yaml-cpp_URL_HASH_0.8.0 "SHA256=fbe74bbdcee21d656715688706da3c8becfd946d92cd44705cc6098bb23b3a16") + +set(_yaml-cpp_CXX_FLAGS "") +if(MSVC) + string(APPEND _yaml-cpp_CXX_FLAGS " /EHsc") +elseif(USE_CLANG) + # Remove some global 'shadow' warnings. + string(APPEND _yaml-cpp_CXX_FLAGS " -Wno-shadow") +endif() +string(STRIP "${_yaml-cpp_CXX_FLAGS}" _yaml-cpp_CXX_FLAGS) + +# In v0.8.0 yaml-cpp switched from "yaml-cpp-vA.B.C" to "vA.B.C" format for tags. +ocio_build_dependency(yaml-cpp + VERSION ${OCIO_yaml-cpp_RECOMMENDED_VERSION} + URL "https://github.com/jbeder/yaml-cpp/archive/refs/tags/${OCIO_yaml-cpp_RECOMMENDED_VERSION}.tar.gz" + URL_HASH "${_yaml-cpp_URL_HASH_${OCIO_yaml-cpp_RECOMMENDED_VERSION}}" + CMAKE_ARGS + -DCMAKE_CXX_FLAGS=${_yaml-cpp_CXX_FLAGS} + -DYAML_BUILD_SHARED_LIBS=OFF + -DYAML_CPP_BUILD_TESTS=OFF + -DYAML_CPP_BUILD_TOOLS=OFF + -DYAML_CPP_BUILD_CONTRIB=OFF +) + +ocio_find_built_dependency(yaml-cpp ${OCIO_yaml-cpp_RECOMMENDED_VERSION} EXACT) diff --git a/share/cmake/macros/ocio_build_dependency.cmake b/share/cmake/macros/ocio_build_dependency.cmake new file mode 100644 index 0000000000..2d8ce9f361 --- /dev/null +++ b/share/cmake/macros/ocio_build_dependency.cmake @@ -0,0 +1,406 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + +include_guard(GLOBAL) + +# Location of the per-dependency build recipes (share/cmake/deps/.cmake). +set(OCIO_DEPS_RECIPES_DIR "${CMAKE_CURRENT_LIST_DIR}/../deps") + +# Build and install locations of the dependencies built by OCIO. +set(OCIO_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") +set(OCIO_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") + +################################################################################################### +# ocio_build_dependency downloads, builds and installs a dependency at configure time, so that +# the caller can then locate it with a regular find_package() call, relying on the CMake +# configuration files exported by the dependency itself. +# +# The dependency is installed into ${OCIO_EXT_DIST_ROOT} (/ext/dist by default) and built +# in /ext/build/. A stamp file records all the inputs of the build, so that +# subsequent configurations skip the build when nothing changed. +# +# Argument: +# dep_name is the name of the dependency (package). Please note that dep_name is case sensitive. +# +# Options (one value): +# VERSION - Version of the dependency being built (required). +# URL - URL of the source archive to download. +# URL_HASH - Hash of the source archive, in the = format. +# GIT_REPOSITORY - Git repository to clone, alternatively to URL. +# GIT_TAG - Git tag or branch to checkout. +# SOURCE_SUBDIR - Sub-directory of the sources containing the CMakeLists.txt. +# PROJECT_DIR - Directory of an OCIO provided CMakeLists.txt to use instead of +# the one from the sources, for dependencies that don't provide +# a usable one. The project receives the location of the sources +# and the version in OCIO_DEP_SOURCE_DIR and OCIO_DEP_VERSION. +# +# Options (multiple values): +# CMAKE_ARGS - Extra arguments for the dependency configuration step. +# +# Setting OCIO__SOURCE_DIR skips the download step and builds the dependency from +# the given local sources instead (e.g. for offline builds). +################################################################################################### +function (ocio_build_dependency dep_name) + cmake_parse_arguments( + PARSE_ARGV 1 + # prefix + arg + # options + "" + # one value keywords + "VERSION;URL;URL_HASH;GIT_REPOSITORY;GIT_TAG;SOURCE_SUBDIR;PROJECT_DIR" + # multi value keywords + "CMAKE_ARGS") + + if(NOT arg_VERSION) + message(FATAL_ERROR "ocio_build_dependency(${dep_name}): VERSION is required.") + endif() + if(NOT arg_URL AND NOT arg_GIT_REPOSITORY AND NOT OCIO_${dep_name}_SOURCE_DIR) + message(FATAL_ERROR "ocio_build_dependency(${dep_name}): URL or GIT_REPOSITORY is required.") + endif() + + set(_root_dir "${OCIO_EXT_BUILD_ROOT}/${dep_name}") + set(_src_dir "${_root_dir}/src") + set(_build_dir "${_root_dir}/build") + set(_stamp_file "${_root_dir}/${dep_name}.stamp") + set(_init_cache "${_root_dir}/${dep_name}-init-cache.cmake") + + if(OCIO_${dep_name}_SOURCE_DIR) + set(_src_dir "${OCIO_${dep_name}_SOURCE_DIR}") + endif() + + ############################################################################################### + ### Build configurations ### + + get_property(_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(_is_multi_config) + # Only build the Release and Debug configurations used by OCIO, the other ones are + # mapped to Release when importing the dependencies (see ocio_find_built_dependency). + set(_build_types "") + foreach(_build_type Release Debug) + if(_build_type IN_LIST CMAKE_CONFIGURATION_TYPES) + list(APPEND _build_types ${_build_type}) + endif() + endforeach() + if(NOT _build_types) + set(_build_types Release) + endif() + elseif(CMAKE_BUILD_TYPE) + set(_build_types ${CMAKE_BUILD_TYPE}) + else() + set(_build_types Release) + endif() + + ############################################################################################### + ### Initial cache shared by all the dependencies ### + + # Variables forwarded from the OCIO configuration when defined. + set(_forwarded_vars + CMAKE_TOOLCHAIN_FILE + CMAKE_CXX_STANDARD + CMAKE_C_VISIBILITY_PRESET + CMAKE_CXX_VISIBILITY_PRESET + CMAKE_VISIBILITY_INLINES_HIDDEN + CMAKE_MSVC_RUNTIME_LIBRARY + CMAKE_OBJECT_PATH_MAX + CMAKE_INSTALL_MESSAGE + CMAKE_FIND_FRAMEWORK + CMAKE_FIND_APPBUNDLE + CMAKE_OSX_ARCHITECTURES + CMAKE_OSX_DEPLOYMENT_TARGET + CMAKE_OSX_SYSROOT + ANDROID_PLATFORM + ANDROID_ABI + ANDROID_STL + ) + if(NOT CMAKE_TOOLCHAIN_FILE) + # The toolchain file is in charge of the compilers when there is one. + list(APPEND _forwarded_vars + CMAKE_C_COMPILER + CMAKE_CXX_COMPILER + CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER + ) + endif() + + set(_cache_content "# Generated by ocio_build_dependency(${dep_name}), do not edit.\n") + macro (_ocio_add_cache_entry var value) + string(APPEND _cache_content "set(${var} [==[${value}]==] CACHE STRING \"\" FORCE)\n") + endmacro() + + foreach(_var ${_forwarded_vars}) + if(DEFINED ${_var} AND NOT "${${_var}}" STREQUAL "") + _ocio_add_cache_entry(${_var} "${${_var}}") + endif() + endforeach() + + _ocio_add_cache_entry(CMAKE_INSTALL_PREFIX "${OCIO_EXT_DIST_ROOT}") + _ocio_add_cache_entry(CMAKE_INSTALL_LIBDIR "lib") + # Dependencies built previously (e.g. ZLIB for minizip-ng) take precedence. + set(_prefix_path "${OCIO_EXT_DIST_ROOT}" ${CMAKE_PREFIX_PATH}) + _ocio_add_cache_entry(CMAKE_PREFIX_PATH "${_prefix_path}") + _ocio_add_cache_entry(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ON) + _ocio_add_cache_entry(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY ON) + # OCIO always links the dependencies it builds statically, and hides their symbols. + _ocio_add_cache_entry(BUILD_SHARED_LIBS OFF) + _ocio_add_cache_entry(CMAKE_POSITION_INDEPENDENT_CODE ON) + _ocio_add_cache_entry(CMAKE_POLICY_DEFAULT_CMP0063 NEW) + # Required for CMake 4.0+ compatibility with dependencies requiring CMake < 3.5. + _ocio_add_cache_entry(CMAKE_POLICY_VERSION_MINIMUM 3.5) + + if(_is_multi_config) + _ocio_add_cache_entry(CMAKE_CONFIGURATION_TYPES "${_build_types}") + # Debug and Release libraries are installed side by side and must not collide. + _ocio_add_cache_entry(CMAKE_DEBUG_POSTFIX "d") + else() + _ocio_add_cache_entry(CMAKE_BUILD_TYPE "${_build_types}") + endif() + + set(_generator_args -G "${CMAKE_GENERATOR}") + if(CMAKE_GENERATOR_PLATFORM) + list(APPEND _generator_args -A "${CMAKE_GENERATOR_PLATFORM}") + endif() + if(CMAKE_GENERATOR_TOOLSET) + list(APPEND _generator_args -T "${CMAKE_GENERATOR_TOOLSET}") + endif() + if(CMAKE_GENERATOR_INSTANCE) + _ocio_add_cache_entry(CMAKE_GENERATOR_INSTANCE "${CMAKE_GENERATOR_INSTANCE}") + endif() + if(CMAKE_MAKE_PROGRAM) + _ocio_add_cache_entry(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM}") + endif() + + ############################################################################################### + ### Skip the build if it is up to date ### + + # Rebuild when the OCIO provided project changes too. + set(_project_hash "") + if(arg_PROJECT_DIR) + file(GLOB_RECURSE _project_files "${arg_PROJECT_DIR}/*") + foreach(_project_file ${_project_files}) + file(SHA256 "${_project_file}" _project_file_hash) + string(APPEND _project_hash "${_project_file_hash}") + endforeach() + endif() + + string(SHA256 _stamp_hash + "${_project_hash}|${arg_VERSION}|${arg_URL}|${arg_URL_HASH}|${arg_GIT_REPOSITORY}|${arg_GIT_TAG}|\ +${arg_SOURCE_SUBDIR}|${arg_PROJECT_DIR}|${arg_CMAKE_ARGS}|${OCIO_${dep_name}_SOURCE_DIR}|\ +${_generator_args}|${_cache_content}") + + if(EXISTS "${_stamp_file}") + file(READ "${_stamp_file}" _previous_stamp_hash) + if(_previous_stamp_hash STREQUAL _stamp_hash) + if(OCIO_VERBOSE) + message(STATUS "${dep_name} ${arg_VERSION} is already built in ${OCIO_EXT_DIST_ROOT}") + endif() + return() + endif() + file(REMOVE "${_stamp_file}") + endif() + + message(STATUS "Building ${dep_name} ${arg_VERSION} (logs in ${_root_dir})...") + + # Start from a clean build directory, previous CMake cache might be stale. + file(REMOVE_RECURSE "${_build_dir}") + file(MAKE_DIRECTORY "${_build_dir}") + file(WRITE "${_init_cache}" "${_cache_content}") + + ############################################################################################### + ### Download ### + + if(NOT OCIO_${dep_name}_SOURCE_DIR) + file(REMOVE_RECURSE "${_src_dir}") + + if(arg_URL) + get_filename_component(_archive_name "${arg_URL}" NAME) + set(_archive "${_root_dir}/download/${dep_name}-${_archive_name}") + + if(arg_URL_HASH) + # =, where is one of the file() hash commands (e.g. SHA256). + string(REPLACE "=" ";" _hash "${arg_URL_HASH}") + list(GET _hash 0 _hash_algo) + list(GET _hash 1 _hash_value) + string(TOLOWER "${_hash_value}" _hash_value) + else() + message(WARNING "No hash provided for ${arg_URL}, the download cannot be verified.") + endif() + + # Retry to cope with transient network failures. The hash is verified separately, as + # file(DOWNLOAD EXPECTED_HASH) reports an error on a failed attempt. + set(_attempt 1) + while(TRUE) + file(DOWNLOAD "${arg_URL}" "${_archive}" STATUS _status TLS_VERIFY ON) + list(GET _status 0 _status_code) + list(GET _status 1 _status_message) + + if(_status_code EQUAL 0 AND arg_URL_HASH) + file(${_hash_algo} "${_archive}" _archive_hash) + if(NOT _archive_hash STREQUAL _hash_value) + set(_status_code 1) + set(_status_message + "${_hash_algo} mismatch, expected ${_hash_value}, got ${_archive_hash}") + endif() + endif() + + if(_status_code EQUAL 0) + break() + endif() + + file(REMOVE "${_archive}") + if(_attempt GREATER_EQUAL 3) + message(FATAL_ERROR + "Failed to download ${dep_name} from ${arg_URL}: ${_status_message}") + endif() + + message(STATUS "Failed to download ${dep_name} (${_status_message}), retrying...") + execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 5) + math(EXPR _attempt "${_attempt} + 1") + endwhile() + + # Extract in a temporary directory, then move the archive root folder into place. + set(_extract_dir "${_root_dir}/extract") + file(REMOVE_RECURSE "${_extract_dir}") + file(MAKE_DIRECTORY "${_extract_dir}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xf "${_archive}" + WORKING_DIRECTORY "${_extract_dir}" + RESULT_VARIABLE _result) + if(NOT _result EQUAL 0) + message(FATAL_ERROR "Failed to extract ${_archive}") + endif() + + file(GLOB _extracted LIST_DIRECTORIES true "${_extract_dir}/*") + list(LENGTH _extracted _extracted_count) + if(_extracted_count EQUAL 1 AND IS_DIRECTORY "${_extracted}") + file(RENAME "${_extracted}" "${_src_dir}") + file(REMOVE_RECURSE "${_extract_dir}") + else() + file(RENAME "${_extract_dir}" "${_src_dir}") + endif() + else() + find_package(Git REQUIRED QUIET) + execute_process( + COMMAND "${GIT_EXECUTABLE}" -c advice.detachedHead=false + clone --depth 1 --branch "${arg_GIT_TAG}" "${arg_GIT_REPOSITORY}" "${_src_dir}" + OUTPUT_FILE "${_root_dir}/${dep_name}-download.log" + ERROR_FILE "${_root_dir}/${dep_name}-download.log" + RESULT_VARIABLE _result) + if(NOT _result EQUAL 0) + message(FATAL_ERROR "Failed to clone ${arg_GIT_REPOSITORY} (${arg_GIT_TAG}), " + "see ${_root_dir}/${dep_name}-download.log") + endif() + endif() + endif() + + set(_cmake_src_dir "${_src_dir}") + if(arg_SOURCE_SUBDIR) + set(_cmake_src_dir "${_src_dir}/${arg_SOURCE_SUBDIR}") + endif() + + set(_project_args "") + if(arg_PROJECT_DIR) + set(_project_args + -DOCIO_DEP_SOURCE_DIR=${_cmake_src_dir} + -DOCIO_DEP_VERSION=${arg_VERSION}) + set(_cmake_src_dir "${arg_PROJECT_DIR}") + endif() + + ############################################################################################### + ### Configure, build and install ### + + macro (_ocio_run_step step_name) + set(_log "${_root_dir}/${dep_name}-${step_name}.log") + execute_process( + COMMAND ${ARGN} + OUTPUT_FILE "${_log}" + ERROR_FILE "${_log}" + RESULT_VARIABLE _result) + if(NOT _result EQUAL 0) + file(STRINGS "${_log}" _log_lines) + list(LENGTH _log_lines _log_lines_count) + if(_log_lines_count GREATER 40) + math(EXPR _log_first "${_log_lines_count} - 40") + list(SUBLIST _log_lines ${_log_first} 40 _log_lines) + endif() + string(REPLACE ";" "\n" _log_tail "${_log_lines}") + message(FATAL_ERROR "${_log_tail}\n" + "Failed to ${step_name} ${dep_name} ${arg_VERSION}, see ${_log}") + endif() + endmacro() + + _ocio_run_step(configure + ${CMAKE_COMMAND} + ${_generator_args} + -C "${_init_cache}" + ${_project_args} + ${arg_CMAKE_ARGS} + -S "${_cmake_src_dir}" + -B "${_build_dir}") + + set(_installed_libraries "") + foreach(_build_type ${_build_types}) + _ocio_run_step(build-${_build_type} + ${CMAKE_COMMAND} + --build "${_build_dir}" + --config ${_build_type} + --target install + --parallel) + + # Make sure that the libraries of the different configurations don't overwrite each other. + # Note that a single configuration can list the same file several times (e.g. OpenEXR + # installing the OpenJPH library it builds). + file(STRINGS "${_build_dir}/install_manifest.txt" _manifest) + set(_config_libraries "") + foreach(_file ${_manifest}) + if(_file MATCHES "\\${CMAKE_STATIC_LIBRARY_SUFFIX}$") + if(_file IN_LIST _installed_libraries) + message(FATAL_ERROR + "Several configurations of ${dep_name} install ${_file}, " + "a Debug postfix must be configured for ${dep_name}.") + endif() + list(APPEND _config_libraries "${_file}") + endif() + endforeach() + list(APPEND _installed_libraries ${_config_libraries}) + endforeach() + + file(WRITE "${_stamp_file}" "${_stamp_hash}") +endfunction() + +################################################################################################### +# ocio_find_built_dependency locates a dependency previously built by ocio_build_dependency, +# using the CMake configuration files it installed in ${OCIO_EXT_DIST_ROOT}. +# +# Argument: +# dep_name is the name of the dependency (package). Please note that dep_name is case sensitive. +# +# Any extra argument is forwarded to find_package (e.g. COMPONENTS). +# +# This is a macro because the variables and imported targets created by find_package must be +# visible in the caller scope. +################################################################################################### +macro (ocio_find_built_dependency dep_name) + # OCIO only builds the Release and Debug configurations with multi-config generators, so + # map the other configurations to Release. + foreach(_ocio_cfg MINSIZEREL RELWITHDEBINFO) + set(_ocio_previous_map_${_ocio_cfg} "${CMAKE_MAP_IMPORTED_CONFIG_${_ocio_cfg}}") + if(NOT CMAKE_MAP_IMPORTED_CONFIG_${_ocio_cfg}) + set(CMAKE_MAP_IMPORTED_CONFIG_${_ocio_cfg} "${_ocio_cfg};RELEASE;") + endif() + endforeach() + + # Ignore any previous result that might point elsewhere. + unset(${dep_name}_DIR CACHE) + + find_package(${dep_name} ${ARGN} + CONFIG + REQUIRED + PATHS "${OCIO_EXT_DIST_ROOT}" + NO_DEFAULT_PATH) + + foreach(_ocio_cfg MINSIZEREL RELWITHDEBINFO) + set(CMAKE_MAP_IMPORTED_CONFIG_${_ocio_cfg} "${_ocio_previous_map_${_ocio_cfg}}") + unset(_ocio_previous_map_${_ocio_cfg}) + endforeach() +endmacro() diff --git a/share/cmake/macros/ocio_handle_dependency.cmake b/share/cmake/macros/ocio_handle_dependency.cmake index dd848494ef..4b2fe18062 100644 --- a/share/cmake/macros/ocio_handle_dependency.cmake +++ b/share/cmake/macros/ocio_handle_dependency.cmake @@ -47,8 +47,9 @@ endmacro() # PREFER_CONFIG - Call find_package in CONFIG mode internally. # Note that it tries to find Config.cmake or # -Config.cmake directly. -# ALLOW_INSTALL - Try to install the dependency if not found. Note that a -# corresponding Install.cmake file must exist. +# ALLOW_INSTALL - Try to install the dependency if not found. Note that a +# corresponding share/cmake/deps/.cmake recipe +# or Install.cmake file must exist. # VERBOSE - Enable extra logging. # # Options (one value): diff --git a/share/cmake/macros/ocio_install_dependency.cmake b/share/cmake/macros/ocio_install_dependency.cmake index f5b6a4e893..2ad86beabf 100644 --- a/share/cmake/macros/ocio_install_dependency.cmake +++ b/share/cmake/macros/ocio_install_dependency.cmake @@ -1,9 +1,12 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. +include(ocio_build_dependency) + ################################################################################################### -# ocio_install_dependency installs a dependency by calling the corresponding Install module. -# e.g. Install.cmake +# ocio_install_dependency installs a dependency by calling the corresponding build recipe +# i.e. share/cmake/deps/.cmake, or the legacy Install.cmake module when the +# dependency has no recipe yet. # # Argument: # dep_name is the name of the dependency (package). Please note that dep_name is case sensitive. @@ -27,7 +30,13 @@ macro (ocio_install_dependency dep_name) if(NOT ${dep_name}_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) set(OCIO_${dep_name}_RECOMMENDED_VERSION ${ocio_id_VERSION}) - include(Install${dep_name}) + if(EXISTS "${OCIO_DEPS_RECIPES_DIR}/${dep_name}.cmake") + # Build the dependency at configure time and locate its CMake configuration files. + include("${OCIO_DEPS_RECIPES_DIR}/${dep_name}.cmake") + else() + # Legacy path, creating the imported targets by hand around an ExternalProject. + include(Install${dep_name}) + endif() set(_${dep_name}_built_by_ocio TRUE) endif() diff --git a/share/cmake/modules/Findyaml-cpp.cmake b/share/cmake/modules/Findyaml-cpp.cmake index 95275bcea8..0b0e7e568d 100644 --- a/share/cmake/modules/Findyaml-cpp.cmake +++ b/share/cmake/modules/Findyaml-cpp.cmake @@ -148,12 +148,4 @@ if (yaml-cpp_FOUND AND NOT TARGET yaml-cpp::yaml-cpp) IMPORTED_LOCATION ${yaml-cpp_LIBRARY} INTERFACE_INCLUDE_DIRECTORIES ${yaml-cpp_INCLUDE_DIR} ) - - # Required because Installyaml-cpp.cmake creates `yaml-cpp::yaml-cpp` - # as an alias, and aliases get resolved in exported targets, causing the - # find_dependency(yaml-cpp) call in OpenColorIOConfig.cmake to fail. - # This can be removed once Installyaml-cpp.cmake targets yaml-cpp 0.8. - if (NOT TARGET yaml-cpp) - add_library(yaml-cpp ALIAS yaml-cpp::yaml-cpp) - endif () endif () diff --git a/share/cmake/modules/install/InstallImath.cmake b/share/cmake/modules/install/InstallImath.cmake deleted file mode 100644 index 2d698971bd..0000000000 --- a/share/cmake/modules/install/InstallImath.cmake +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install Imath -# -# Variables defined by this module: -# Imath_FOUND - Indicate whether the library was found or not -# Imath_LIBRARY - Path to the library file -# Imath_INCLUDE_DIR - Location of the header files -# Imath_VERSION - Library's version -# -# Global targets defined by this module: -# Imath::Imath -# Imath::ImathConfig -# - - -############################################################################### -### Create target - -if (NOT TARGET Imath::Imath) - add_library(Imath::Imath UNKNOWN IMPORTED GLOBAL) - add_library(Imath::ImathConfig INTERFACE IMPORTED GLOBAL) - set(_Imath_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT Imath_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(Imath_FOUND TRUE) - if(OCIO_Imath_RECOMMENDED_VERSION) - set(Imath_VERSION ${OCIO_Imath_RECOMMENDED_VERSION}) - else() - set(Imath_VERSION ${Imath_FIND_VERSION}) - endif() - set(Imath_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - # Set the expected library name - if(BUILD_TYPE_DEBUG) - set(_Imath_LIB_SUFFIX "_d") - endif() - - include(VersionUtils) - split_version_string(${Imath_VERSION} _Imath_ExternalProject) - - set(_Imath_LIB_VER "${_Imath_ExternalProject_VERSION_MAJOR}_${_Imath_ExternalProject_VERSION_MINOR}") - - set(Imath_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}Imath-${_Imath_LIB_VER}${_Imath_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_Imath_TARGET_CREATE) - if(MSVC) - set(Imath_CXX_FLAGS "${Imath_CXX_FLAGS} /EHsc") - endif() - - string(STRIP "${Imath_CXX_FLAGS}" Imath_CXX_FLAGS) - - set(Imath_CMAKE_ARGS - ${Imath_CMAKE_ARGS} - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_FLAGS=${Imath_CXX_FLAGS} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DBUILD_SHARED_LIBS=OFF - -DBUILD_TESTING=OFF - -DPYTHON=OFF - -DDOCS=OFF - -DIMATH_HALF_USE_LOOKUP_TABLE=OFF - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(Imath_CMAKE_ARGS - ${Imath_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(Imath_CMAKE_ARGS - ${Imath_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(Imath_CMAKE_ARGS - ${Imath_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${Imath_INCLUDE_DIR}) - - ExternalProject_Add(imath_install - GIT_REPOSITORY "https://github.com/AcademySoftwareFoundation/Imath.git" - GIT_TAG "v${Imath_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/Imath" - BUILD_BYPRODUCTS ${Imath_LIBRARY} - CMAKE_ARGS ${Imath_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(Imath::Imath imath_install) - - if(OCIO_VERBOSE) - message(STATUS "Installing Imath: ${Imath_LIBRARY} (version \"${Imath_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_Imath_TARGET_CREATE) - file(MAKE_DIRECTORY ${Imath_INCLUDE_DIR}/Imath) - - set_target_properties(Imath::Imath PROPERTIES - IMPORTED_LOCATION ${Imath_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${Imath_INCLUDE_DIR};${Imath_INCLUDE_DIR}/Imath" - ) - set_target_properties(Imath::ImathConfig PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Imath_INCLUDE_DIR};${Imath_INCLUDE_DIR}/Imath" - ) - - mark_as_advanced(Imath_INCLUDE_DIR Imath_LIBRARY Imath_VERSION) -endif() diff --git a/share/cmake/modules/install/InstallOpenEXR.cmake b/share/cmake/modules/install/InstallOpenEXR.cmake deleted file mode 100644 index 3cd9a7893a..0000000000 --- a/share/cmake/modules/install/InstallOpenEXR.cmake +++ /dev/null @@ -1,263 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install OpenEXR -# -# Variables defined by this module: -# OpenEXR_FOUND - Indicate whether the library was found or not -# OpenEXR_LIBRARY - Path to the library file -# OpenEXR_INCLUDE_DIR - Location of the header files -# OpenEXR_VERSION - Library's version -# -# Imported targets defined by this module, if found: -# OpenEXR::Iex -# OpenEXR::IexConfig -# OpenEXR::IlmThread -# OpenEXR::IlmThreadConfig -# OpenEXR::OpenEXR -# OpenEXR::OpenEXRConfig -# OpenEXR::OpenEXRCore -# OpenEXR::OpenEXRUtil -# -# Depending on user options when configuring OCIO, OpenEXR can be used to -# build libOpenColorIOimageioapphelpers. -# - - -############################################################################### -### Create target - -if (NOT TARGET OpenEXR::OpenEXR) - set(_OpenEXR_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -macro(set_target_location target_name) - if(NOT DEFINED "${target_name}_LIBRARY") - set("${target_name}_LIBRARY" "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${target_name}-${_OpenEXR_LIB_VER}${_OpenEXR_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - endif() -endmacro() - -if(NOT OpenEXR_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Required dependency - # Not trying to find ZLIB here since it is a required dependency of OCIO. - if(NOT ZLIB_FOUND) - message(STATUS "ZLIB is required to build OpenEXR.") - return() - endif() - - ocio_handle_dependency(Threads) - if(NOT Threads_FOUND) - message(STATUS "Threads is required to build OpenEXR.") - return() - endif() - - # Set find_package standard args - set(OpenEXR_FOUND TRUE) - if(OCIO_OpenEXR_RECOMMENDED_VERSION) - set(OpenEXR_VERSION ${OCIO_OpenEXR_RECOMMENDED_VERSION}) - else() - set(OpenEXR_VERSION ${OpenEXR_FIND_VERSION}) - endif() - set(OpenEXR_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - # Set the expected library name - if(BUILD_TYPE_DEBUG) - set(_OpenEXR_LIB_SUFFIX "_d") - endif() - - include(VersionUtils) - split_version_string(${OpenEXR_VERSION} _OpenEXR) - - set(_OpenEXR_LIB_VER "${_OpenEXR_VERSION_MAJOR}_${_OpenEXR_VERSION_MINOR}") - - # Specify which OpenJPH version to use as we need to know the library name - # for the Windows library. OpenEXR 3.4.0 would install 0.22.0 by default, - # here we request the latest version at release time including build fixes. - set(openjph_VERSION_MAJOR 0) - set(openjph_VERSION_MINOR 23) - set(openjph_VERSION_PATCH 1) - set(openjph_VERSION "${openjph_VERSION_MAJOR}.${openjph_VERSION_MINOR}.${openjph_VERSION_PATCH}") - - if (MSVC) - set(openjph_LIBRARY "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}openjph.${openjph_VERSION_MAJOR}.${openjph_VERSION_MINOR}${_OpenEXR_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - else() - set(openjph_LIBRARY "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}openjph${_OpenEXR_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - endif() - - set_target_location(Iex) - set_target_location(IlmThread) - set_target_location(OpenEXR) - set_target_location(OpenEXRCore) - set_target_location(OpenEXRUtil) - - if(_OpenEXR_TARGET_CREATE) - if(MSVC) - set(OpenEXR_CXX_FLAGS "${OpenEXR_CXX_FLAGS} /EHsc") - endif() - - string(STRIP "${OpenEXR_CXX_FLAGS}" OpenEXR_CXX_FLAGS) - - set(OpenEXR_CMAKE_ARGS - ${OpenEXR_CMAKE_ARGS} - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_FLAGS=${OpenEXR_CXX_FLAGS} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DBUILD_SHARED_LIBS=OFF - -DBUILD_TESTING=OFF - -DOPENEXR_INSTALL_EXAMPLES=OFF - -DOPENEXR_BUILD_EXAMPLES=OFF - -DOPENEXR_BUILD_TOOLS=OFF - -DOPENEXR_FORCE_INTERNAL_DEFLATE=ON - -DOPENEXR_FORCE_INTERNAL_OPENJPH=ON - -DOPENEXR_OPENJPH_TAG=${openjph_VERSION} - # Try to use in-source built Imath first, if available. - -DCMAKE_PREFIX_PATH=${_EXT_DIST_ROOT} - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(OpenEXR_CMAKE_ARGS - ${OpenEXR_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(OpenEXR_CMAKE_ARGS - ${OpenEXR_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(OpenEXR_CMAKE_ARGS - ${OpenEXR_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${OpenEXR_INCLUDE_DIR}) - - ExternalProject_Add(openexr_install - GIT_REPOSITORY "https://github.com/AcademySoftwareFoundation/openexr.git" - GIT_TAG "v${OpenEXR_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/openexr" - BUILD_BYPRODUCTS - ${openjph_LIBRARY} - ${Iex_LIBRARY} - ${IlmThread_LIBRARY} - ${OpenEXR_LIBRARY} - ${OpenEXRCore_LIBRARY} - ${OpenEXRUtil_LIBRARY} - CMAKE_ARGS ${OpenEXR_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - # Prevent some CI jobs to fail when building. - # --parallel - ) - - # Additional targets. ALIAS to UNKNOWN imported target is only possible - # from CMake 3.15, so we explicitly define targets as STATIC here. - add_library(OpenEXR::openjph STATIC IMPORTED GLOBAL) - add_library(OpenEXR::Iex STATIC IMPORTED GLOBAL) - add_library(OpenEXR::IexConfig INTERFACE IMPORTED GLOBAL) - add_library(OpenEXR::IlmThread STATIC IMPORTED GLOBAL) - add_library(OpenEXR::IlmThreadConfig INTERFACE IMPORTED GLOBAL) - add_library(OpenEXR::OpenEXR STATIC IMPORTED GLOBAL) - add_library(OpenEXR::OpenEXRConfig INTERFACE IMPORTED GLOBAL) - add_library(OpenEXR::OpenEXRCore STATIC IMPORTED GLOBAL) - add_library(OpenEXR::OpenEXRUtil STATIC IMPORTED GLOBAL) - - add_dependencies(OpenEXR::OpenEXR openexr_install) - - # When building Imath ourselves, make sure it has been built first - # so that OpenEXR can find it. Otherwise OpenEXR will build its - # own copy of Imath which might result in version conflicts. - if (TARGET imath_install) - add_dependencies(openexr_install imath_install) - endif() - - if(OCIO_VERBOSE) - message(STATUS "Installing OpenEXR: ${OpenEXR_LIBRARY} (version \"${OpenEXR_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_OpenEXR_TARGET_CREATE) - file(MAKE_DIRECTORY ${OpenEXR_INCLUDE_DIR}/OpenEXR) - file(MAKE_DIRECTORY ${OpenEXR_INCLUDE_DIR}/openjph) - - set_target_properties(OpenEXR::openjph PROPERTIES - IMPORTED_LOCATION ${openjph_LIBRARY} - INTERFACE_COMPILE_DEFINITIONS "_FILE_OFFSET_BITS=64" - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}/openjph" - ) - set_target_properties(OpenEXR::Iex PROPERTIES - IMPORTED_LOCATION ${Iex_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "OpenEXR::OpenEXRConfig;OpenEXR::OpenEXRConfig" - ) - set_target_properties(OpenEXR::IexConfig PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR};${OpenEXR_INCLUDE_DIR}/OpenEXR" - ) - set_target_properties(OpenEXR::IlmThread PROPERTIES - IMPORTED_LOCATION ${IlmThread_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "OpenEXR::OpenEXRConfig;OpenEXR::OpenEXRConfig;OpenEXR::Iex;Threads::Threads" - STATIC_LIBRARY_OPTIONS "-no_warning_for_no_symbols" - ) - set_target_properties(OpenEXR::IlmThreadConfig PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR};${OpenEXR_INCLUDE_DIR}/OpenEXR" - ) - set_target_properties(OpenEXR::OpenEXR PROPERTIES - IMPORTED_LOCATION ${OpenEXR_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "OpenEXR::OpenEXRConfig;Imath::Imath;OpenEXR::OpenEXRConfig;OpenEXR::Iex;OpenEXR::IlmThread;OpenEXR::OpenEXRCore" - ) - set_target_properties(OpenEXR::OpenEXRConfig PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR};${OpenEXR_INCLUDE_DIR}/OpenEXR" - ) - set_target_properties(OpenEXR::OpenEXRCore PROPERTIES - IMPORTED_LOCATION ${OpenEXRCore_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "OpenEXR::OpenEXRConfig;Imath::Imath;OpenEXR::openjph" - STATIC_LIBRARY_OPTIONS "-no_warning_for_no_symbols" - ) - set_target_properties(OpenEXR::OpenEXRUtil PROPERTIES - IMPORTED_LOCATION ${OpenEXRUtil_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "OpenEXR::OpenEXRConfig;OpenEXR::OpenEXR;OpenEXR::OpenEXRCore" - ) - - mark_as_advanced(OpenEXR_INCLUDE_DIR OpenEXR_LIBRARY OpenEXR_VERSION) -endif() diff --git a/share/cmake/modules/install/InstallZLIB.cmake b/share/cmake/modules/install/InstallZLIB.cmake deleted file mode 100644 index 96f09bb09f..0000000000 --- a/share/cmake/modules/install/InstallZLIB.cmake +++ /dev/null @@ -1,165 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install ZLIB -# -# Except for the variable ZLIB_VERSION_STRING, OCIO sets the same variables as the -# CMake's FindZLIB when installing ZLIB manually. -# -# Variables defined by this module: -# ZLIB_FOUND - Indicate whether the library was found or not -# ZLIB_LIBRARY - Path to the library file -# ZLIB_INCLUDE_DIR - Location of the header files -# ZLIB_VERSION - Library's version -# -# Global targets defined by this module: -# ZLIB::ZLIB -# - - -############################################################################### -### Create target -############################################################################### -if(NOT TARGET ZLIB::ZLIB) - add_library(ZLIB::ZLIB UNKNOWN IMPORTED GLOBAL) - set(_ZLIB_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source -############################################################################### -if(NOT ZLIB_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - if(WIN32) - set(_ZLIB_LIB_NAME "zlib") - set(_ZLIB_STATIC_LIB_NAME "zlibstatic") - else() - set(_ZLIB_LIB_NAME "z") - set(_ZLIB_STATIC_LIB_NAME "z") - endif() - - # Set find_package standard args - set(ZLIB_FOUND TRUE) - if(OCIO_ZLIB_RECOMMENDED_VERSION) - set(ZLIB_VERSION ${OCIO_ZLIB_RECOMMENDED_VERSION}) - else() - set(ZLIB_VERSION ${ZLIB_FIND_VERSION}) - endif() - - set(ZLIB_INCLUDE_DIRS "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - # Windows need the "d" suffix at the end (only for MSVC). - if(MSVC AND BUILD_TYPE_DEBUG) - set(_ZLIB_LIB_SUFFIX "d") - endif() - - # ZLIB doesn't use CMAKE_INSTALL_LIBDIR - # It is hardcoded to ${CMAKE_INSTALL_PREFIX}/lib - # https://github.com/madler/zlib/blob/master/CMakeLists.txt#L9 - set(_ZLIB_INSTALL_LIBDIR "lib") - set(ZLIB_LIBRARIES - "${_EXT_DIST_ROOT}/${_ZLIB_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${_ZLIB_STATIC_LIB_NAME}${_ZLIB_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_ZLIB_TARGET_CREATE) - set(ZLIB_CMAKE_ARGS - ${ZLIB_CMAKE_ARGS} - # Setting policy CMP0042 when building ZLIB since that project is using an old CMake - # version as the cmake_minimum_required and that version has no knowledge of the policy. - # Since that policy gets unset, it causes a warning with CMake 3.25+. - -DCMAKE_POLICY_DEFAULT_CMP0042=NEW - # Required for CMake 4.0+ compatibility - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(ZLIB_CMAKE_ARGS - ${ZLIB_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(ZLIB_CMAKE_ARGS - ${ZLIB_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(ZLIB_CMAKE_ARGS - ${ZLIB_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${ZLIB_INCLUDE_DIRS}) - - ExternalProject_Add(ZLIB_install - GIT_REPOSITORY "https://github.com/madler/zlib.git" - GIT_TAG "v${ZLIB_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/zlib" - BUILD_BYPRODUCTS - ${ZLIB_LIBRARIES} - CMAKE_ARGS ${ZLIB_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - ExternalProject_Add_Step( - ZLIB_install zlib_remove_dll - COMMENT "Remove zlib.lib and zlib.dll, leaves only zlibstatic.lib" - DEPENDEES install - COMMAND ${CMAKE_COMMAND} -E remove -f ${_EXT_DIST_ROOT}/${_ZLIB_INSTALL_LIBDIR}/zlib.lib ${_EXT_DIST_ROOT}/bin/zlib.dll - ) - - add_dependencies(ZLIB::ZLIB ZLIB_install) - - # FindZLIB from CMake needs ZLIB_LIBRARY and ZLIB_INCLUDE_DIR. - # Starting CMake 3.17+, The mark_as_advanced() command no longer creates a cache entry if one - # does not already exist. (See policy CMP0102) - # For that reasons, ZLIB_LIBRARY and ZLIB_INCLUDE_DIR are set in the CMake's Cache since ZLIB - # is needed by other OCIO dependencies. - set(ZLIB_LIBRARY ${ZLIB_LIBRARIES} CACHE STRING "ZLIB library file") - set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS} CACHE STRING "ZLIB includes directory") - - if(OCIO_VERBOSE) - message(STATUS "Installing ZLIB: ${ZLIB_LIBRARIES} (version \"${ZLIB_VERSION}\") ") - endif() -endif() - - -############################################################################### -### Configure target ### -############################################################################### -if(_ZLIB_TARGET_CREATE) - set_target_properties(ZLIB::ZLIB PROPERTIES - IMPORTED_LOCATION ${ZLIB_LIBRARIES} - INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRS} - ) - - mark_as_advanced(ZLIB_INCLUDE_DIRS ZLIB_LIBRARIES ZLIB_VERSION) -endif() diff --git a/share/cmake/modules/install/Installexpat.cmake b/share/cmake/modules/install/Installexpat.cmake deleted file mode 100644 index ee750a1f41..0000000000 --- a/share/cmake/modules/install/Installexpat.cmake +++ /dev/null @@ -1,165 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install expat -# -# Variables defined by this module: -# expat_FOUND - Indicate whether the library was found or not -# expat_LIBRARY - Path to the library file -# expat_INCLUDE_DIR - Location of the header files -# expat_VERSION - Library's version -# -# Global targets defined by this module: -# expat::expat -# - - -############################################################################### -### Create target - -if(NOT TARGET expat::expat) - add_library(expat::expat UNKNOWN IMPORTED GLOBAL) - set(_expat_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT expat_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(expat_FOUND TRUE) - if(OCIO_expat_RECOMMENDED_VERSION) - set(expat_VERSION ${OCIO_expat_RECOMMENDED_VERSION}) - else() - set(expat_VERSION ${expat_FIND_VERSION}) - endif() - set(expat_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - # Set the expected library name - if(WIN32) - if(BUILD_TYPE_DEBUG) - set(_expat_LIB_SUFFIX "d") - endif() - if (MSVC) - # Static Linking, Multi-threaded Dll naming (>=2.2.8): - # https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt - set(_expat_LIB_SUFFIX "${_expat_LIB_SUFFIX}MD") - endif() - endif() - - # Expat use a hardcoded lib prefix instead of CMAKE_STATIC_LIBRARY_PREFIX - # https://github.com/libexpat/libexpat/blob/R_2_4_1/expat/CMakeLists.txt#L374 - set(_expat_LIB_PREFIX "lib") - - set(expat_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${_expat_LIB_PREFIX}expat${_expat_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_expat_TARGET_CREATE) - if(MSVC) - set(EXPAT_C_FLAGS "${EXPAT_C_FLAGS} /EHsc") - set(EXPAT_CXX_FLAGS "${EXPAT_CXX_FLAGS} /EHsc") - endif() - - string(STRIP "${EXPAT_C_FLAGS}" EXPAT_C_FLAGS) - string(STRIP "${EXPAT_CXX_FLAGS}" EXPAT_CXX_FLAGS) - - set(EXPAT_CMAKE_ARGS - ${EXPAT_CMAKE_ARGS} - -DCMAKE_POLICY_DEFAULT_CMP0063=NEW - # Required for CMake 4.0+ compatibility - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - -DCMAKE_C_VISIBILITY_PRESET=${CMAKE_C_VISIBILITY_PRESET} - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_C_FLAGS=${EXPAT_C_FLAGS} - -DCMAKE_CXX_FLAGS=${EXPAT_CXX_FLAGS} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DEXPAT_BUILD_DOCS=OFF - -DEXPAT_BUILD_EXAMPLES=OFF - -DEXPAT_BUILD_TESTS=OFF - -DEXPAT_BUILD_TOOLS=OFF - -DEXPAT_SHARED_LIBS=OFF - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(EXPAT_CMAKE_ARGS - ${EXPAT_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(EXPAT_CMAKE_ARGS - ${EXPAT_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(EXPAT_CMAKE_ARGS - ${EXPAT_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${expat_INCLUDE_DIR}) - - string(REPLACE "." ";" VERSION_LIST ${expat_VERSION}) - list(GET VERSION_LIST 0 expat_VERSION_MAJOR) - list(GET VERSION_LIST 1 expat_VERSION_MINOR) - list(GET VERSION_LIST 2 expat_VERSION_PATCH) - - ExternalProject_Add(expat_install - GIT_REPOSITORY "https://github.com/libexpat/libexpat.git" - GIT_TAG "R_${expat_VERSION_MAJOR}_${expat_VERSION_MINOR}_${expat_VERSION_PATCH}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/libexpat" - BUILD_BYPRODUCTS ${expat_LIBRARY} - SOURCE_SUBDIR expat - CMAKE_ARGS ${EXPAT_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(expat::expat expat_install) - if(OCIO_VERBOSE) - message(STATUS "Installing expat: ${expat_LIBRARY} (version \"${expat_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_expat_TARGET_CREATE) - set_target_properties(expat::expat PROPERTIES - IMPORTED_LOCATION ${expat_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES ${expat_INCLUDE_DIR} - ) - - mark_as_advanced(expat_INCLUDE_DIR expat_LIBRARY expat_VERSION) -endif() diff --git a/share/cmake/modules/install/Installlcms2.cmake b/share/cmake/modules/install/Installlcms2.cmake deleted file mode 100644 index 9f68a0b15c..0000000000 --- a/share/cmake/modules/install/Installlcms2.cmake +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install lcms2 -# -# Variables defined by this module: -# lcms2_FOUND - Indicate whether the library was found or not -# lcms2_LIBRARY - Path to the library file -# lcms2_INCLUDE_DIR - Location of the header files -# lcms2_VERSION - Library's version -# -# Global targets defined by this module: -# lcms2::lcms2 -# - - -############################################################################### -### Configure target ### - -if(NOT TARGET lcms2::lcms2) - add_library(lcms2::lcms2 UNKNOWN IMPORTED GLOBAL) - set(_lcms2_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT lcms2_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(lcms2_FOUND TRUE) - if(OCIO_lcms2_RECOMMENDED_VERSION) - set(lcms2_VERSION ${OCIO_lcms2_RECOMMENDED_VERSION}) - else() - set(lcms2_VERSION ${lcms2_FIND_VERSION}) - endif() - set(lcms2_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/lcms2") - set(lcms2_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}lcms2${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_lcms2_TARGET_CREATE) - if(UNIX) - set(lcms2_C_FLAGS "${lcms2_C_FLAGS} -fvisibility=hidden -fPIC") - endif() - - if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - set(lcms2_C_FLAGS "${lcms2_C_FLAGS} -Wno-aggressive-loop-optimizations") - endif() - - string(STRIP "${lcms2_C_FLAGS}" lcms2_C_FLAGS) - - # NOTE: Depending of the compiler version lcm2 2.2 does not compile with C++17 so revert - # to C++11 because the library is only used by a cmd line tool. - - set(lcms2_CXX_STANDARD ${CMAKE_CXX_STANDARD}) - if(${CMAKE_CXX_STANDARD} GREATER_EQUAL 17) - set(lcms2_CXX_STANDARD 11) - endif() - - set(lcms2_CMAKE_ARGS - ${lcms2_CMAKE_ARGS} - -DCMAKE_C_FLAGS=${lcms2_C_FLAGS} - -DCMAKE_CXX_STANDARD=${lcms2_CXX_STANDARD} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DBUILD_SHARED_LIBS=OFF - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(lcms2_CMAKE_ARGS - ${lcms2_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(lcms2_CMAKE_ARGS - ${lcms2_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(lcms2_CMAKE_ARGS - ${lcms2_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${lcms2_INCLUDE_DIR}) - - ExternalProject_Add(lcms2_install - GIT_REPOSITORY "https://github.com/mm2/Little-CMS.git" - GIT_TAG "lcms${lcms2_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/Little-CMS" - BUILD_BYPRODUCTS ${lcms2_LIBRARY} - CMAKE_ARGS ${lcms2_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - PATCH_COMMAND - ${CMAKE_COMMAND} -E copy - "${PROJECT_SOURCE_DIR}/share/cmake/projects/Buildlcms2.cmake" - "CMakeLists.txt" - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(lcms2::lcms2 lcms2_install) - if(OCIO_VERBOSE) - message(STATUS "Installing lcms2: ${lcms2_LIBRARY} (version \"${lcms2_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_lcms2_TARGET_CREATE) - set_target_properties(lcms2::lcms2 PROPERTIES - IMPORTED_LOCATION ${lcms2_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES ${lcms2_INCLUDE_DIR} - ) - - mark_as_advanced(lcms2_INCLUDE_DIR lcms2_LIBRARY lcms2_VERSION) -endif() diff --git a/share/cmake/modules/install/Installminizip-ng.cmake b/share/cmake/modules/install/Installminizip-ng.cmake deleted file mode 100644 index 28b6e6a782..0000000000 --- a/share/cmake/modules/install/Installminizip-ng.cmake +++ /dev/null @@ -1,155 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install minizip-ng -# -# Variables defined by this module: -# minizip-ng_FOUND - Indicate whether the library was found or not -# minizip-ng_LIBRARY - Path to the library file -# minizip-ng_INCLUDE_DIR - Location of the header files -# minizip-ng_VERSION - Library's version -# -# Global targets defined by this module: -# minizip-ng::minizip-ng -# -# Link against the following target: -# ZLIB::ZLIB -# - - -############################################################################### -### Create target -if(NOT TARGET MINIZIP::minizip-ng) - add_library(MINIZIP::minizip-ng UNKNOWN IMPORTED GLOBAL) - set(_minizip-ng_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT minizip-ng_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(minizip-ng_FOUND TRUE) - if(OCIO_minizip-ng_RECOMMENDED_VERSION) - set(minizip-ng_VERSION ${OCIO_minizip-ng_RECOMMENDED_VERSION}) - else() - set(minizip-ng_VERSION ${minizip-ng_FIND_VERSION}) - endif() - - set(minizip-ng_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/minizip-ng") - - # Minizip-ng use a hardcoded lib prefix instead of CMAKE_STATIC_LIBRARY_PREFIX - # Fixed from 4.0.7, see https://github.com/zlib-ng/minizip-ng/issues/778 - if(${minizip-ng_VERSION} VERSION_GREATER_EQUAL "4.0.7") - set(_minizip-ng_LIB_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}") - else() - set(_minizip-ng_LIB_PREFIX "lib") - endif() - - set(minizip-ng_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${_minizip-ng_LIB_PREFIX}minizip-ng${_minizip-ng_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_minizip-ng_TARGET_CREATE) - set(minizip-ng_CMAKE_ARGS - ${minizip-ng_CMAKE_ARGS} - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DBUILD_SHARED_LIBS=OFF - -DMZ_OPENSSL=OFF - -DMZ_LIBBSD=OFF - -DMZ_BUILD_TESTS=OFF - -DMZ_COMPAT=OFF - -DMZ_BZIP2=OFF - -DMZ_LZMA=OFF - -DMZ_LIBCOMP=OFF - -DMZ_ZSTD=OFF - -DMZ_PKCRYPT=OFF - -DMZ_WZAES=OFF - -DMZ_SIGNING=OFF - -DMZ_ZLIB=ON - -DMZ_ICONV=OFF - -DMZ_FETCH_LIBS=OFF - -DMZ_FORCE_FETCH_LIBS=OFF - -DZLIB_LIBRARY=${ZLIB_LIBRARIES} - -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIRS} - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(minizip-ng_CMAKE_ARGS - ${minizip-ng_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(minizip-ng_CMAKE_ARGS - ${minizip-ng_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(minizip-ng_CMAKE_ARGS - ${minizip-ng_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${minizip-ng_INCLUDE_DIR}) - - ExternalProject_Add(minizip-ng_install - GIT_REPOSITORY "https://github.com/zlib-ng/minizip-ng.git" - GIT_TAG "${minizip-ng_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/libminizip-ng" - BUILD_BYPRODUCTS ${minizip-ng_LIBRARY} - CMAKE_ARGS ${minizip-ng_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - DEPENDS ZLIB::ZLIB # minizip-ng depends on zlib - ) - - add_dependencies(MINIZIP::minizip-ng minizip-ng_install) - if(OCIO_VERBOSE) - message(STATUS "Installing minizip-ng: ${minizip-ng_LIBRARY} (version \"${minizip-ng_VERSION}\")") - endif() -endif() - -############################################################################### -### Configure target ### - -if(_minizip-ng_TARGET_CREATE) - set_target_properties(MINIZIP::minizip-ng PROPERTIES - IMPORTED_LOCATION "${minizip-ng_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${minizip-ng_INCLUDE_DIR}" - ) - - mark_as_advanced(minizip-ng_INCLUDE_DIR minizip-ng_LIBRARY minizip-ng_VERSION) - - target_link_libraries(MINIZIP::minizip-ng INTERFACE ZLIB::ZLIB) -endif() diff --git a/share/cmake/modules/install/Installopenfx.cmake b/share/cmake/modules/install/Installopenfx.cmake deleted file mode 100644 index 8ce587b33f..0000000000 --- a/share/cmake/modules/install/Installopenfx.cmake +++ /dev/null @@ -1,88 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install openfx -# -# Variables defined by this module: -# openfx_FOUND - Indicate whether the library was found or not -# openfx_INCLUDE_DIR - Location of the header files -# openfx_VERSION - Library's version -# -# Global targets defined by this module: -# openfx::module -# - - -############################################################################### -### Create target - -if(NOT TARGET openfx::module) - add_library(openfx::module INTERFACE IMPORTED GLOBAL) - set(_openfx_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT openfx_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - set(_openfx_INSTALL_DIR "${_EXT_BUILD_ROOT}/openfx/src/openfx_install") - - # Set find_package standard args - set(openfx_FOUND TRUE) - if(OCIO_openfx_RECOMMENDED_VERSION) - set(openfx_VERSION ${OCIO_openfx_RECOMMENDED_VERSION}) - else() - set(openfx_VERSION ${openfx_FIND_VERSION}) - endif() - set(openfx_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/openfx") - - if(_openfx_TARGET_CREATE) - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${openfx_INCLUDE_DIR}) - - include(VersionUtils) - split_version_string(${openfx_VERSION} openfx) - - ExternalProject_Add(openfx_install - GIT_REPOSITORY "https://github.com/ofxa/openfx.git" - # The latest version from 2015 is OFX_Release_1_4_TAG. - # The latest version from 2024 is OFX_Release_1.5. - # Need to be careful since older version might have the patch number in the tag. - # There don't seem to be enough consistency in tag names that we can rely on. - GIT_TAG "OFX_Release_${openfx_VERSION_MAJOR}.${openfx_VERSION_MINOR}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/openfx" - BUILD_BYPRODUCTS ${openfx_INCLUDE_DIR} - CONFIGURE_COMMAND "" - BUILD_COMMAND - ${CMAKE_COMMAND} -E copy_directory - "${_EXT_BUILD_ROOT}/openfx/src/openfx_install/include" - "${openfx_INCLUDE_DIR}" - INSTALL_COMMAND "" - CMAKE_ARGS ${openfx_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - ) - - add_dependencies(openfx::module openfx_install) - if(OCIO_VERBOSE) - message(STATUS "Installing openfx: ${openfx_INCLUDE_DIR} (version \"${openfx_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_openfx_TARGET_CREATE) - set_target_properties(openfx::module PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES ${openfx_INCLUDE_DIR} - ) - - mark_as_advanced(openfx_INCLUDE_DIR) -endif() diff --git a/share/cmake/modules/install/Installpybind11.cmake b/share/cmake/modules/install/Installpybind11.cmake deleted file mode 100644 index 85aea7720a..0000000000 --- a/share/cmake/modules/install/Installpybind11.cmake +++ /dev/null @@ -1,133 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install pybind11 -# -# Variables defined by this module: -# pybind11_FOUND - Indicate whether the library was found or not -# pybind11_INCLUDE_DIR - Location of the header files -# pybind11_VERSION - Library's version -# -# Global targets defined by this module: -# pybind11::module -# - - -############################################################################### -### Create target ### - -if(NOT TARGET pybind11::module) - add_library(pybind11::module INTERFACE IMPORTED GLOBAL) - set(_pybind11_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT pybind11_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(pybind11_FOUND TRUE) - if(OCIO_pybind11_RECOMMENDED_VERSION) - set(pybind11_VERSION ${OCIO_pybind11_RECOMMENDED_VERSION}) - else() - set(pybind11_VERSION ${pybind11_FIND_VERSION}) - endif() - set(pybind11_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - if(_pybind11_TARGET_CREATE) - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${pybind11_INCLUDE_DIR}) - - set(pybind11_CMAKE_ARGS - ${pybind11_CMAKE_ARGS} - # Required for CMake 4.0+ compatibility. - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - # Using FindPython mode (PYBIND11_FINDPYTHON=ON) doesn't seem to - # work when building on docker manylinux images where Development - # component is not available but is hardcoded in pybind11 script. - -DPYTHON_EXECUTABLE=${Python_EXECUTABLE} - -DPYBIND11_INSTALL=ON - -DPYBIND11_TEST=OFF - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(pybind11_CMAKE_ARGS - ${pybind11_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(pybind11_CMAKE_ARGS - ${pybind11_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - if (ANDROID) - set(pybind11_CMAKE_ARGS - ${pybind11_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - ExternalProject_Add(pybind11_install - GIT_REPOSITORY "https://github.com/pybind/pybind11.git" - GIT_TAG "v${pybind11_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/pybind11" - BUILD_BYPRODUCTS ${pybind11_INCLUDE_DIR} - CMAKE_ARGS ${pybind11_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(pybind11::module pybind11_install) - if(OCIO_VERBOSE) - message(STATUS "Installing pybind11: ${pybind11_INCLUDE_DIR} (version \"${pybind11_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_pybind11_TARGET_CREATE) - set_target_properties(pybind11::module PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES ${pybind11_INCLUDE_DIR} - ) - - # /bigobj is needed for bigger binding projects due to the limit to 64k - # addressable sections (see pybind11Common.cmake). - if (MSVC) - set_target_properties(pybind11::module PROPERTIES - INTERFACE_COMPILE_OPTIONS /bigobj - ) - - endif() - - mark_as_advanced(pybind11_INCLUDE_DIR pybind11_VERSION) -endif() diff --git a/share/cmake/modules/install/Installpystring.cmake b/share/cmake/modules/install/Installpystring.cmake deleted file mode 100644 index 48ca152290..0000000000 --- a/share/cmake/modules/install/Installpystring.cmake +++ /dev/null @@ -1,134 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install pystring -# -# Variables defined by this module: -# pystring_FOUND - Indicate whether the library was found or not -# pystring_LIBRARY - Path to the library file -# pystring_INCLUDE_DIR - Location of the header files -# pystring_VERSION - Library's version -# -# Global targets defined by this module: -# pystring::pystring -# - - -############################################################################### -### Configure target ### - -if(NOT TARGET pystring::pystring) - add_library(pystring::pystring UNKNOWN IMPORTED GLOBAL) - set(_pystring_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT pystring_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(pystring_FOUND TRUE) - if(OCIO_pystring_RECOMMENDED_VERSION) - set(pystring_VERSION ${OCIO_pystring_RECOMMENDED_VERSION}) - else() - set(pystring_VERSION ${pystring_FIND_VERSION}) - endif() - set(pystring_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/pystring") - - set(pystring_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}pystring${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_pystring_TARGET_CREATE) - if(MSVC) - set(pystring_CXX_FLAGS "${pystring_CXX_FLAGS} /EHsc") - endif() - - string(STRIP "${pystring_CXX_FLAGS}" pystring_CXX_FLAGS) - - set(pystring_CMAKE_ARGS - ${pystring_CMAKE_ARGS} - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_FLAGS=${pystring_CXX_FLAGS} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(pystring_CMAKE_ARGS - ${pystring_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(pystring_CMAKE_ARGS - ${pystring_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - - if (ANDROID) - set(pystring_CMAKE_ARGS - ${pystring_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${pystring_INCLUDE_DIR}) - - ExternalProject_Add(pystring_install - GIT_REPOSITORY "https://github.com/imageworks/pystring.git" - GIT_TAG "v${pystring_VERSION}" - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/pystring" - BUILD_BYPRODUCTS ${pystring_LIBRARY} - CMAKE_ARGS ${pystring_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - PATCH_COMMAND - ${CMAKE_COMMAND} -E copy - "${PROJECT_SOURCE_DIR}/share/cmake/projects/Buildpystring.cmake" - "CMakeLists.txt" - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(pystring::pystring pystring_install) - if(OCIO_VERBOSE) - message(STATUS "Installing pystring: ${pystring_LIBRARY} (version \"${pystring_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_pystring_TARGET_CREATE) - set_target_properties(pystring::pystring PROPERTIES - IMPORTED_LOCATION ${pystring_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES ${pystring_INCLUDE_DIR} - ) - - mark_as_advanced(pystring_INCLUDE_DIR pystring_LIBRARY pystring_VERSION) -endif() diff --git a/share/cmake/modules/install/Installyaml-cpp.cmake b/share/cmake/modules/install/Installyaml-cpp.cmake deleted file mode 100644 index 3ec993969c..0000000000 --- a/share/cmake/modules/install/Installyaml-cpp.cmake +++ /dev/null @@ -1,158 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Install yaml-cpp -# -# Variables defined by this module: -# yaml-cpp_FOUND - Indicate whether the library was found or not -# yaml-cpp_LIBRARY - Path to the library file -# yaml-cpp_INCLUDE_DIR - Location of the header files -# yaml-cpp_VERSION - Library's version -# -# Global targets defined by this module: -# yaml-cpp::yaml-cpp -# - -############################################################################### -### Create target (if previous 'find_package' call hasn't) ### - -if(NOT TARGET yaml-cpp::yaml-cpp) - add_library(yaml-cpp::yaml-cpp UNKNOWN IMPORTED GLOBAL) - set(_yaml-cpp_TARGET_CREATE TRUE) -endif() - -############################################################################### -### Install package from source ### - -if(NOT yaml-cpp_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${PROJECT_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${PROJECT_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(yaml-cpp_FOUND TRUE) - if(OCIO_yaml-cpp_RECOMMENDED_VERSION) - set(yaml-cpp_VERSION ${OCIO_yaml-cpp_RECOMMENDED_VERSION}) - else() - set(yaml-cpp_VERSION ${yaml-cpp_FIND_VERSION}) - endif() - set(yaml-cpp_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - - # Starting from 0.7.0, this is included on all platforms, we could also - # override CMAKE_DEBUG_POSTFIX to bypass it. - if(BUILD_TYPE_DEBUG) - string(APPEND _yaml-cpp_LIB_SUFFIX "d") - endif() - - # Set the expected library name - set(yaml-cpp_LIBRARY - "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}yaml-cpp${_yaml-cpp_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - - if(_yaml-cpp_TARGET_CREATE) - if(MSVC) - set(yaml-cpp_CXX_FLAGS "${yaml-cpp_CXX_FLAGS} /EHsc") - endif() - - if(UNIX) - if(USE_CLANG) - # Remove some global 'shadow' warnings. - set(yaml-cpp_CXX_FLAGS "${yaml-cpp_CXX_FLAGS} -Wno-shadow") - endif() - endif() - - string(STRIP "${yaml-cpp_CXX_FLAGS}" yaml-cpp_CXX_FLAGS) - - set(yaml-cpp_CMAKE_ARGS - ${yaml-cpp_CMAKE_ARGS} - -DCMAKE_POLICY_DEFAULT_CMP0063=NEW - # Required for CMake 4.0+ compatibility - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - -DCMAKE_CXX_VISIBILITY_PRESET=${CMAKE_CXX_VISIBILITY_PRESET} - -DCMAKE_VISIBILITY_INLINES_HIDDEN=${CMAKE_VISIBILITY_INLINES_HIDDEN} - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_FLAGS=${yaml-cpp_CXX_FLAGS} - -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} - -DCMAKE_INSTALL_DATADIR=${CMAKE_INSTALL_DATADIR} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} - -DBUILD_SHARED_LIBS=OFF - -DYAML_BUILD_SHARED_LIBS=OFF - -DYAML_CPP_BUILD_TESTS=OFF - -DYAML_CPP_BUILD_TOOLS=OFF - -DYAML_CPP_BUILD_CONTRIB=OFF - ) - - if(CMAKE_TOOLCHAIN_FILE) - set(yaml-cpp_CMAKE_ARGS - ${yaml-cpp_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(APPLE) - string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - - set(yaml-cpp_CMAKE_ARGS - ${yaml-cpp_CMAKE_ARGS} - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} - ) - endif() - - - if (ANDROID) - set(yaml-cpp_CMAKE_ARGS - ${yaml-cpp_CMAKE_ARGS} - -DANDROID_PLATFORM=${ANDROID_PLATFORM} - -DANDROID_ABI=${ANDROID_ABI} - -DANDROID_STL=${ANDROID_STL}) - endif() - - # in v0.8.0 yaml switched from "yaml-cpp-vA.B.C" to "vA.B.C" format for tags. - set(yaml-cpp_GIT_TAG "${yaml-cpp_VERSION}") - - # Hack to let imported target be built from ExternalProject_Add - file(MAKE_DIRECTORY ${yaml-cpp_INCLUDE_DIR}) - - ExternalProject_Add(yaml-cpp_install - GIT_REPOSITORY "https://github.com/jbeder/yaml-cpp.git" - GIT_TAG ${yaml-cpp_GIT_TAG} - GIT_CONFIG advice.detachedHead=false - GIT_SHALLOW TRUE - PREFIX "${_EXT_BUILD_ROOT}/yaml-cpp" - BUILD_BYPRODUCTS ${yaml-cpp_LIBRARY} - CMAKE_ARGS ${yaml-cpp_CMAKE_ARGS} - EXCLUDE_FROM_ALL TRUE - BUILD_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} --build . - --config ${CMAKE_BUILD_TYPE} - --target install - --parallel - ) - - add_dependencies(yaml-cpp::yaml-cpp yaml-cpp_install) - if(OCIO_VERBOSE) - message(STATUS "Installing yaml-cpp: ${yaml-cpp_LIBRARY} (version \"${yaml-cpp_VERSION}\")") - endif() - endif() -endif() - -############################################################################### -### Configure target ### - -if(_yaml-cpp_TARGET_CREATE) - set_target_properties(yaml-cpp::yaml-cpp PROPERTIES - IMPORTED_LOCATION ${yaml-cpp_LIBRARY} - INTERFACE_INCLUDE_DIRECTORIES ${yaml-cpp_INCLUDE_DIR} - # https://github.com/jbeder/yaml-cpp/issues/1339 - INTERFACE_COMPILE_DEFINITIONS YAML_CPP_STATIC_DEFINE - ) - - mark_as_advanced(yaml-cpp_INCLUDE_DIR yaml-cpp_LIBRARY yaml-cpp_VERSION) -endif() diff --git a/share/cmake/projects/Buildlcms2.cmake b/share/cmake/projects/Buildlcms2.cmake deleted file mode 100644 index 7292eeef48..0000000000 --- a/share/cmake/projects/Buildlcms2.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. - -project(lcms2) - -cmake_minimum_required(VERSION 3.10) - -include(GNUInstallDirs) - -include_directories(include) - -file(GLOB HEADERS "include/*.h") -file(GLOB SOURCES "src/*.c" "src/*.h") - -add_library(${PROJECT_NAME} STATIC ${HEADERS} ${SOURCES}) - -if(UNIX) - set(lcms2_C_FLAGS "${lcms2_C_FLAGS};-fPIC") -endif() - -set_target_properties(${PROJECT_NAME} PROPERTIES - LIBRARY_OUTPUT_NAME "${PROJECT_NAME}" - COMPILE_OPTIONS "${PLATFORM_COMPILE_OPTIONS};${lcms2_C_FLAGS}" - LINK_OPTIONS "${PLATFORM_LINK_OPTIONS}" - PUBLIC_HEADER "${HEADERS}" -) - -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lcms2 -) diff --git a/share/cmake/projects/Buildpystring.cmake b/share/cmake/projects/Buildpystring.cmake deleted file mode 100644 index 85dbb48675..0000000000 --- a/share/cmake/projects/Buildpystring.cmake +++ /dev/null @@ -1,35 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. - -project(pystring) - -cmake_minimum_required(VERSION 3.10) - -include(GNUInstallDirs) - -set(HEADERS - pystring.h -) - -set(SOURCES - pystring.cpp -) - -add_library(${PROJECT_NAME} STATIC ${HEADERS} ${SOURCES}) - -if(UNIX) - set(pystring_CXX_FLAGS "${pystring_CXX_FLAGS};-fPIC") -endif() - -set_target_properties(${PROJECT_NAME} PROPERTIES - COMPILE_OPTIONS "${PLATFORM_COMPILE_OPTIONS};${pystring_CXX_FLAGS}" - LINK_OPTIONS "${PLATFORM_LINK_OPTIONS}" - PUBLIC_HEADER "${HEADERS}" -) - -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pystring -) diff --git a/share/cmake/projects/lcms2/CMakeLists.txt b/share/cmake/projects/lcms2/CMakeLists.txt new file mode 100644 index 0000000000..ddcb704332 --- /dev/null +++ b/share/cmake/projects/lcms2/CMakeLists.txt @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# CMake project building lcms2 (Little CMS), as it only provides Autotools and Meson builds. +# +# cmake -S share/cmake/projects/lcms2 -DOCIO_DEP_SOURCE_DIR= ... +# +# Global targets defined by the installed CMake configuration files: +# lcms2::lcms2 +# + +cmake_minimum_required(VERSION 3.14) + +if(NOT OCIO_DEP_SOURCE_DIR) + message(FATAL_ERROR "OCIO_DEP_SOURCE_DIR must point to the Little-CMS sources.") +endif() + +if(OCIO_DEP_VERSION) + set(_lcms2_VERSION_ARGS VERSION ${OCIO_DEP_VERSION}) +endif() + +project(lcms2 ${_lcms2_VERSION_ARGS} LANGUAGES C) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +file(GLOB _lcms2_HEADERS "${OCIO_DEP_SOURCE_DIR}/include/*.h") +file(GLOB _lcms2_SOURCES "${OCIO_DEP_SOURCE_DIR}/src/*.c") + +add_library(lcms2 STATIC ${_lcms2_SOURCES}) + +set_target_properties(lcms2 PROPERTIES + PUBLIC_HEADER "${_lcms2_HEADERS}" +) + +target_include_directories(lcms2 + PUBLIC + $ + $ +) + +if(CMAKE_C_COMPILER_ID MATCHES "GNU") + target_compile_options(lcms2 PRIVATE -Wno-aggressive-loop-optimizations) +endif() + +set(_lcms2_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/lcms2") + +install(TARGETS lcms2 + EXPORT lcms2Targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lcms2 +) + +# The exported targets file is a complete configuration file as lcms2 has no dependencies. +install(EXPORT lcms2Targets + NAMESPACE lcms2:: + FILE lcms2Config.cmake + DESTINATION ${_lcms2_CONFIG_DIR} +) + +if(PROJECT_VERSION) + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/lcms2ConfigVersion.cmake" + COMPATIBILITY SameMajorVersion + ) + install(FILES "${PROJECT_BINARY_DIR}/lcms2ConfigVersion.cmake" + DESTINATION ${_lcms2_CONFIG_DIR} + ) +endif() diff --git a/share/cmake/projects/openfx/CMakeLists.txt b/share/cmake/projects/openfx/CMakeLists.txt new file mode 100644 index 0000000000..26ac41e97a --- /dev/null +++ b/share/cmake/projects/openfx/CMakeLists.txt @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# CMake project installing the openfx headers, as the openfx CMakeLists.txt requires Conan +# provided dependencies to build its examples and support libraries, which OCIO doesn't use. +# +# cmake -S share/cmake/projects/openfx -DOCIO_DEP_SOURCE_DIR= ... +# +# Global targets defined by the installed CMake configuration files: +# openfx::module +# + +cmake_minimum_required(VERSION 3.14) + +if(NOT OCIO_DEP_SOURCE_DIR) + message(FATAL_ERROR "OCIO_DEP_SOURCE_DIR must point to the openfx sources.") +endif() + +if(OCIO_DEP_VERSION) + set(_openfx_VERSION_ARGS VERSION ${OCIO_DEP_VERSION}) +endif() + +project(openfx ${_openfx_VERSION_ARGS} LANGUAGES NONE) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +add_library(openfx_module INTERFACE) + +set_target_properties(openfx_module PROPERTIES + EXPORT_NAME module +) + +target_include_directories(openfx_module + INTERFACE + $ + $ +) + +set(_openfx_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/openfx") + +install(TARGETS openfx_module + EXPORT openfxTargets +) + +install(DIRECTORY "${OCIO_DEP_SOURCE_DIR}/include/" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/openfx +) + +# The exported targets file is a complete configuration file as openfx has no dependencies. +install(EXPORT openfxTargets + NAMESPACE openfx:: + FILE openfxConfig.cmake + DESTINATION ${_openfx_CONFIG_DIR} +) + +if(PROJECT_VERSION) + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/openfxConfigVersion.cmake" + COMPATIBILITY SameMajorVersion + ARCH_INDEPENDENT + ) + install(FILES "${PROJECT_BINARY_DIR}/openfxConfigVersion.cmake" + DESTINATION ${_openfx_CONFIG_DIR} + ) +endif() diff --git a/share/cmake/projects/pystring/CMakeLists.txt b/share/cmake/projects/pystring/CMakeLists.txt new file mode 100644 index 0000000000..530885a2f2 --- /dev/null +++ b/share/cmake/projects/pystring/CMakeLists.txt @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# CMake project building pystring, as its own CMakeLists.txt doesn't install the headers nor +# CMake configuration files. +# +# cmake -S share/cmake/projects/pystring -DOCIO_DEP_SOURCE_DIR= ... +# +# Global targets defined by the installed CMake configuration files: +# pystring::pystring +# + +cmake_minimum_required(VERSION 3.14) + +if(NOT OCIO_DEP_SOURCE_DIR) + message(FATAL_ERROR "OCIO_DEP_SOURCE_DIR must point to the pystring sources.") +endif() + +if(OCIO_DEP_VERSION) + set(_pystring_VERSION_ARGS VERSION ${OCIO_DEP_VERSION}) +endif() + +project(pystring ${_pystring_VERSION_ARGS} LANGUAGES CXX) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +add_library(pystring STATIC + ${OCIO_DEP_SOURCE_DIR}/pystring.cpp +) + +set_target_properties(pystring PROPERTIES + PUBLIC_HEADER "${OCIO_DEP_SOURCE_DIR}/pystring.h" +) + +target_include_directories(pystring + PUBLIC + $ + $ +) + +set(_pystring_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/pystring") + +install(TARGETS pystring + EXPORT pystringTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pystring +) + +# The exported targets file is a complete configuration file as pystring has no dependencies. +install(EXPORT pystringTargets + NAMESPACE pystring:: + FILE pystringConfig.cmake + DESTINATION ${_pystring_CONFIG_DIR} +) + +if(PROJECT_VERSION) + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/pystringConfigVersion.cmake" + COMPATIBILITY SameMajorVersion + ) + install(FILES "${PROJECT_BINARY_DIR}/pystringConfigVersion.cmake" + DESTINATION ${_pystring_CONFIG_DIR} + ) +endif() diff --git a/src/OpenColorIO/CMakeLists.txt b/src/OpenColorIO/CMakeLists.txt index ff20c1a6c7..778112cecc 100755 --- a/src/OpenColorIO/CMakeLists.txt +++ b/src/OpenColorIO/CMakeLists.txt @@ -399,35 +399,23 @@ if(UNIX AND NOT APPLE) # dependencies. set(CUSTOM_LINK_FLAGS "${CUSTOM_LINK_FLAGS};-Wl,--exclude-libs,ALL") elseif(APPLE) - if (expat_LIBRARY) - get_filename_component(_expat_LIBDIR "${expat_LIBRARY}" DIRECTORY) - # Add the path to CMake list of search paths for libraries. - list(APPEND _OCIO_LINK_FLAGS_LIST_ "-Wl,-L${_expat_LIBDIR}") - # Hide the expat symbols. - list(APPEND _OCIO_LINK_FLAGS_LIST_ "-Wl,-hidden-lexpat") - endif() - - - # Check for minizip first since our Findminizip module sets minizip-ng_LIBRARY. - if (minizip_LIBRARY OR minizip-ng_COMPAT) - get_filename_component(_minizip-ng_LIBDIR "${minizip_LIBRARY}" DIRECTORY) - set(_minizip-ng_NAME "minizip") - elseif(minizip-ng_LIBRARY) - get_filename_component(_minizip-ng_LIBDIR "${minizip-ng_LIBRARY}" DIRECTORY) - set(_minizip-ng_NAME "minizip-ng") - endif() - - if (_minizip-ng_LIBDIR) - # Add the path to CMake list of search paths for libraries. - list(APPEND _OCIO_LINK_FLAGS_LIST_ "-Wl,-L${_minizip-ng_LIBDIR}") - # Hide the minizip-ng symbols. - list(APPEND _OCIO_LINK_FLAGS_LIST_ "-Wl,-hidden-l${_minizip-ng_NAME}") - endif() - - if (_OCIO_LINK_FLAGS_LIST_) - list(JOIN _OCIO_LINK_FLAGS_LIST_ ";" _OCIO_LINK_FLAGS_LIST_) - set(CUSTOM_LINK_FLAGS "${CUSTOM_LINK_FLAGS};${_OCIO_LINK_FLAGS_LIST_}") - endif() + # Hide the symbols of the static dependencies exporting symbols with default visibility + # (i.e. ignoring the hidden visibility preset), by loading their exact archive file with + # hidden visibility. Shared dependencies are left untouched. + foreach(_dep_target expat::expat MINIZIP::minizip-ng) + get_target_property(_dep_type ${_dep_target} TYPE) + if(_dep_type STREQUAL "UNKNOWN_LIBRARY") + # Imported targets created by find modules, check the library file itself. + get_target_property(_dep_location ${_dep_target} LOCATION) + if(_dep_location MATCHES "\\${CMAKE_STATIC_LIBRARY_SUFFIX}$") + set(_dep_type "STATIC_LIBRARY") + endif() + endif() + + if(_dep_type STREQUAL "STATIC_LIBRARY") + list(APPEND CUSTOM_LINK_FLAGS "-Wl,-load_hidden,$") + endif() + endforeach() endif() if (OCIO_USE_SOVERSION) diff --git a/src/bindings/python/CMakeLists.txt b/src/bindings/python/CMakeLists.txt index b3a343635f..ca5da32098 100644 --- a/src/bindings/python/CMakeLists.txt +++ b/src/bindings/python/CMakeLists.txt @@ -112,7 +112,12 @@ set(SOURCES PyViewTransform.cpp ) -# Reason not to use pybind11_add_module ? +# pybind11_add_module() is not used because: +# - It is only available when pybind11 is found through its CMake configuration files, while +# Findpybind11.cmake also supports pybind11 found as headers only. +# - Its defaults would change the module: name with the Python extension suffix (e.g. +# PyOpenColorIO.cpython-312-darwin.so), link time optimization in release builds, and +# stripping, which ocio_strip_binary() already does. # https://pybind11.readthedocs.io/en/stable/compiling.html#pybind11-add-module add_library(PyOpenColorIO MODULE ${SOURCES}) @@ -144,6 +149,13 @@ elseif(USE_MSVC) set(CUSTOM_COMPILE_FLAGS "${CUSTOM_COMPILE_FLAGS};/wd4996") endif() +# /bigobj is needed for bigger binding projects due to the limit to 64k addressable sections. +# pybind11 only adds it through pybind11_add_module() (pybind11::windows_extras), which is not +# used here. +if(MSVC) + set(CUSTOM_COMPILE_FLAGS "${CUSTOM_COMPILE_FLAGS};/bigobj") +endif() + # OSX demands that the linker resolve all symbols at build time # we pass this flag to allow dynamic linking if(APPLE)