diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 890021741b..77527cd723 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -287,11 +287,12 @@ jobs: --target install \ --config ${{ matrix.build-type }} \ -- -j$(nproc) + echo "ocio_build_path=$(pwd)" >> $GITHUB_ENV working-directory: _build - name: Test run: ctest -V -C ${{ matrix.build-type }} working-directory: _build - - name: Test CMake Consumer + - name: Test CMake Consumer with shared OCIO if: matrix.build-shared == 'ON' run: | cmake . \ @@ -301,6 +302,34 @@ jobs: --config ${{ matrix.build-type }} ./consumer working-directory: _build/tests/cmake-consumer-dist + - name: Test CMake Consumer with static OCIO + if: matrix.build-shared == 'OFF' + # The yaml-cpp_VERSION is set below because Findyaml-cpp.cmake needs it but is unable to + # extract it from the headers, like the other modules. + # + # Prefer the static version of each dependencies by using _STATIC_LIBRARY. + # Alternatively, this can be done by setting _LIBRARY and _INCLUDE_DIR to + # the static version of the package. + run: | + cmake . \ + -DCMAKE_PREFIX_PATH=../../../_install \ + -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ + -Dexpat_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dexpat_STATIC_LIBRARY=ON \ + -DImath_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DImath_STATIC_LIBRARY=ON \ + -Dpystring_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_STATIC_LIBRARY=ON \ + -Dyaml-cpp_VERSION=0.7.0 \ + -DZLIB_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DZLIB_STATIC_LIBRARY=ON \ + -Dminizip-ng_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dminizip-ng_STATIC_LIBRARY=ON + cmake --build . \ + --config ${{ matrix.build-type }} + ./consumer + working-directory: _build/tests/cmake-consumer-dist # --------------------------------------------------------------------------- # macOS @@ -424,11 +453,12 @@ jobs: --target install \ --config ${{ matrix.build-type }} \ -- -j$(sysctl -n hw.ncpu) + echo "ocio_build_path=$(pwd)" >> $GITHUB_ENV working-directory: _build - name: Test run: ctest -V -C ${{ matrix.build-type }} working-directory: _build - - name: Test CMake Consumer + - name: Test CMake Consumer with shared OCIO if: matrix.build-shared == 'ON' run: | cmake . \ @@ -438,6 +468,34 @@ jobs: --config ${{ matrix.build-type }} ./consumer working-directory: _build/tests/cmake-consumer-dist + - name: Test CMake Consumer with static OCIO + if: matrix.build-shared == 'OFF' + # The yaml-cpp_VERSION is set below because Findyaml-cpp.cmake needs it but is unable to + # extract it from the headers, like the other modules. + # + # Prefer the static version of each dependencies by using _STATIC_LIBRARY. + # Alternatively, this can be done by setting _LIBRARY and _INCLUDE_DIR to + # the static version of the package. + run: | + cmake . \ + -DCMAKE_PREFIX_PATH=../../../_install \ + -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ + -Dexpat_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dexpat_STATIC_LIBRARY=ON \ + -DImath_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DImath_STATIC_LIBRARY=ON \ + -Dpystring_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_STATIC_LIBRARY=ON \ + -Dyaml-cpp_VERSION=0.7.0 \ + -DZLIB_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DZLIB_STATIC_LIBRARY=ON \ + -Dminizip-ng_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dminizip-ng_STATIC_LIBRARY=ON + cmake --build . \ + --config ${{ matrix.build-type }} + ./consumer + working-directory: _build/tests/cmake-consumer-dist # --------------------------------------------------------------------------- # Windows @@ -567,13 +625,14 @@ jobs: cmake --build . \ --target install \ --config ${{ matrix.build-type }} + echo "ocio_build_path=$(pwd)" >> $GITHUB_ENV shell: bash working-directory: _build - name: Test run: ctest -V -C ${{ matrix.build-type }} shell: bash working-directory: _build - - name: Test CMake Consumer + - name: Test CMake Consumer with shared OCIO if: matrix.build-shared == 'ON' run: | cmake . \ @@ -585,3 +644,33 @@ jobs: ./${{ matrix.build-type }}/consumer shell: bash working-directory: _build/tests/cmake-consumer-dist + - name: Test CMake Consumer with static OCIO + if: matrix.build-shared == 'OFF' + # The yaml-cpp_VERSION is set below because Findyaml-cpp.cmake needs it but is unable to + # extract it from the headers, like the other modules. + # + # Prefer the static version of each dependencies by using _STATIC_LIBRARY. + # Alternatively, this can be done by setting _LIBRARY and _INCLUDE_DIR to + # the static version of the package. + run: | + cmake . \ + -DCMAKE_PREFIX_PATH=../../../_install \ + -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ + -Dexpat_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dexpat_STATIC_LIBRARY=ON \ + -DImath_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DImath_STATIC_LIBRARY=ON \ + -Dpystring_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dyaml-cpp_STATIC_LIBRARY=ON \ + -Dyaml-cpp_VERSION=0.7.0 \ + -DZLIB_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -DZLIB_STATIC_LIBRARY=ON \ + -Dminizip-ng_ROOT=${{ env.ocio_build_path }}/ext/dist \ + -Dminizip-ng_STATIC_LIBRARY=ON + cmake --build . \ + --config ${{ matrix.build-type }} + export PATH=../../../_install/bin:$PATH + ./${{ matrix.build-type }}/consumer + shell: bash + working-directory: _build/tests/cmake-consumer-dist diff --git a/CMakeLists.txt b/CMakeLists.txt index d7ea2b176f..3911a154ce 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -251,6 +251,15 @@ if(OCIO_BUILD_STATIC) endif() endif() +if (NOT BUILD_SHARED_LIBS AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) + message(STATUS "Note that building the static version of OpenColorIO does not embed the dependencies\ + into the library file. The needed dependencies must be linked to the consumer + application or shared library that uses static OpenColorIO. + + The following mandatory dependencies MUST be linked to the consumer application or shared library: + expat, yaml-cpp, Imath, pystring, minizip-ng and ZLIB") +endif() + ############################################################################### # Find or install external dependencies @@ -299,6 +308,8 @@ set(OCIO_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets.cmake") set(OCIO_VERSION_CONFIG "${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") set(OCIO_PROJECT_CONFIG "${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake") set(OCIO_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") +set(OCIO_CUSTOM_FIND_MODULE_DIR "${CMAKE_INSTALL_PREFIX}/share/OpenColorIO/cmake/modules") +set(OCIO_CUSTOM_MACROS_MODULE_DIR "${CMAKE_INSTALL_PREFIX}/share/OpenColorIO/cmake/macros") # Version fetched from the top level project() write_basic_package_version_file( @@ -321,6 +332,24 @@ install( FILE ${OCIO_TARGETS_EXPORT_NAME} ) +if (NOT BUILD_SHARED_LIBS) + # Install custom macros used in the find modules. + install(FILES + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/macros/VersionUtils.cmake + DESTINATION ${OCIO_CUSTOM_MACROS_MODULE_DIR} + ) + + # Install custom Find modules. + install(FILES + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/modules/Findexpat.cmake + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/modules/FindImath.cmake + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/modules/Findpystring.cmake + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/modules/Findminizip-ng.cmake + ${CMAKE_CURRENT_LIST_DIR}/share/cmake/modules/Findyaml-cpp.cmake + DESTINATION ${OCIO_CUSTOM_FIND_MODULE_DIR} + ) +endif() + install( FILES "${OCIO_PROJECT_CONFIG}" "${OCIO_VERSION_CONFIG}" DESTINATION "${OCIO_CONFIG_INSTALL_DIR}" diff --git a/share/cmake/modules/FindExtPackages.cmake b/share/cmake/modules/FindExtPackages.cmake index b777e5bb8f..5455a08ce6 100644 --- a/share/cmake/modules/FindExtPackages.cmake +++ b/share/cmake/modules/FindExtPackages.cmake @@ -21,6 +21,17 @@ set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ON CACHE BOOL set(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY ON CACHE BOOL "Disable CMake System Package Registry when finding packages") +if (APPLE) + # Store the previous value of CMAKE_FIND_FRAMEWORK and CMAKE_FIND_APPBUNDLE. + set(_PREVIOUS_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + set(_PREVIOUS_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE}) + + # Prioritize other paths before Frameworks and Appbundle for find_path, find_library and + # find_package. + set(CMAKE_FIND_FRAMEWORK LAST) + set(CMAKE_FIND_APPBUNDLE LAST) +endif() + ############################################################################### ### Packages and versions ### @@ -41,14 +52,93 @@ find_package(pystring 1.1.3 REQUIRED) set(_Imath_ExternalProject_VERSION "3.1.5") find_package(Imath 3.0 REQUIRED) -# ZLIB -# https://github.com/madler/zlib -set(_zlib_ExternalProject_VERSION "1.2.12") -find_package(zlib REQUIRED) +############################################################################### +### ZLIB (https://github.com/madler/zlib) +### +### The following variables can be set: +### ZLIB_ROOT Location of ZLIB library file and includes folder. +### Alternatively, ZLIB_LIBRARY and ZLIB_INCLUDE_DIR can be used. +### +### ZLIB_LIBRARY Location of ZLIB library file. +### ZLIB_INCLUDE_DIR Location of ZLIB includes folder. +### +### ZLIB_VERSION ZLIB Version (CMake 3.26+) +### ZLIB_VERSION_STRING ZLIB Version (CMake < 3.26) +### +############################################################################### +# ZLIB 1.2.13 is used since it fixes a critical vulnerability. +# See https://nvd.nist.gov/vuln/detail/CVE-2022-37434 +# See https://github.com/madler/zlib/releases/tag/v1.2.13 +set(_ZLIB_FIND_VERSION "1.2.13") +set(_ZLIB_ExternalProject_VERSION ${_ZLIB_FIND_VERSION}) + +if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) + # ZLIB_USE_STATIC_LIBS is supported only from CMake 3.24+. + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0") + if (ZLIB_STATIC_LIBRARY) + set(ZLIB_USE_STATIC_LIBS "${ZLIB_STATIC_LIBRARY}") + endif() + else() # For CMake < 3.24 since ZLIB_USE_STATIC_LIBS is not available. + if(NOT ZLIB_LIBRARY) + if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES) + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + else() + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES) + endif() + + if(DEFINED CMAKE_FIND_LIBRARY_SUFFIXES) + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}") + else() + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) + endif() + + # Prefix/suffix for windows. + if(WIN32) + list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a") + endif() + + # Check if static lib is preferred. + if(ZLIB_STATIC_LIBRARY OR ZLIB_USE_STATIC_LIBS) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + endif() + endif() + endif() + endif() + + set(_ZLIB_REQUIRED REQUIRED) + # Override REQUIRED if package can be installed + if(OCIO_INSTALL_EXT_PACKAGES STREQUAL MISSING) + set(_ZLIB_REQUIRED "") + endif() + + find_package(ZLIB ${_ZLIB_FIND_VERSION} ${_ZLIB_REQUIRED}) + + # Restore the original find library ordering + if(DEFINED _ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) + set(CMAKE_FIND_LIBRARY_SUFFIXES "${_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}") + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES) + endif() + + if(DEFINED _ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES) + set(CMAKE_FIND_LIBRARY_PREFIXES "${_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}") + else() + set(CMAKE_FIND_LIBRARY_PREFIXES) + endif() +endif() + +if(NOT ZLIB_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) + include(InstallZLIB) +endif() +############################################################################### # minizip-ng # https://github.com/zlib-ng/minizip-ng -find_package(minizip-ng 3.0.6 REQUIRED) +find_package(minizip-ng 3.0.7 REQUIRED) if(OCIO_BUILD_APPS) @@ -157,3 +247,9 @@ if(OCIO_BUILD_TESTS) message(WARNING "Could NOT find OpenImageIO. Skipping build of the OSL unit tests.") endif() endif() + +if (APPLE) + # Restore CMAKE_FIND_FRAMEWORK and CMAKE_FIND_APPBUNDLE values. + set(CMAKE_FIND_FRAMEWORK ${_PREVIOUS_CMAKE_FIND_FRAMEWORK}) + set(CMAKE_FIND_APPBUNDLE ${_PREVIOUS_CMAKE_FIND_APPBUNDLE}) +endif() diff --git a/share/cmake/modules/FindImath.cmake b/share/cmake/modules/FindImath.cmake index 1510bbdf70..30f5b4e465 100644 --- a/share/cmake/modules/FindImath.cmake +++ b/share/cmake/modules/FindImath.cmake @@ -25,6 +25,15 @@ ############################################################################### ### Try to find package ### +# BUILD_TYPE_DEBUG variable is currently set in one of the OCIO's CMake files. +# Now that some OCIO's find module are installed with the library itself (with static build), +# a consumer app don't have access to the variables set by an OCIO's CMake files. Therefore, some +# OCIO's find modules must detect the build type by itselves. +set(BUILD_TYPE_DEBUG OFF) +if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") + set(BUILD_TYPE_DEBUG ON) +endif() + if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_Imath_REQUIRED_VARS Imath_LIBRARY) set(_Imath_LIB_VER "${Imath_FIND_VERSION_MAJOR}_${Imath_FIND_VERSION_MINOR}") @@ -131,7 +140,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT Imath_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT Imath_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) diff --git a/share/cmake/modules/FindOpenEXR.cmake b/share/cmake/modules/FindOpenEXR.cmake index 8c14635413..a8b8448fd6 100644 --- a/share/cmake/modules/FindOpenEXR.cmake +++ b/share/cmake/modules/FindOpenEXR.cmake @@ -45,6 +45,10 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) if(OpenEXR_FOUND) get_target_property(OpenEXR_LIBRARY OpenEXR::OpenEXR LOCATION) get_target_property(OpenEXR_INCLUDE_DIR OpenEXR::OpenEXR INTERFACE_INCLUDE_DIRECTORIES) + + # IMPORTED_GLOBAL property must be set to TRUE since alisasing a non-global imported target + # is not possible until CMake 3.18+. + set_target_properties(OpenEXR::OpenEXR PROPERTIES IMPORTED_GLOBAL TRUE) endif() # Override REQUIRED if package can be installed @@ -77,7 +81,7 @@ macro(set_target_location target_name) endif() endmacro() -if(NOT OpenEXR_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT OpenEXR_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) @@ -85,13 +89,14 @@ if(NOT OpenEXR_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) set(_EXT_BUILD_ROOT "${CMAKE_BINARY_DIR}/ext/build") # Required dependency - # OCIO custom module to find ZLIB. (Findzlib) - find_package(zlib) if(NOT ZLIB_FOUND) - message(STATUS "ZLib is required to build OpenEXR.") - return() + find_package(ZLIB) + if(NOT ZLIB_FOUND) + message(STATUS "ZLib is required to build OpenEXR.") + return() + endif() endif() - + find_package(Threads) if(NOT Threads_FOUND) message(STATUS "Threads is required to build OpenEXR.") diff --git a/share/cmake/modules/Findexpat.cmake b/share/cmake/modules/Findexpat.cmake index 59e5c2e102..8e23cbba0b 100644 --- a/share/cmake/modules/Findexpat.cmake +++ b/share/cmake/modules/Findexpat.cmake @@ -25,6 +25,15 @@ ############################################################################### ### Try to find package ### +# BUILD_TYPE_DEBUG variable is currently set in one of the OCIO's CMake files. +# Now that some OCIO's find module are installed with the library itself (with static build), +# a consumer app don't have access to the variables set by an OCIO's CMake files. Therefore, some +# OCIO's find modules must detect the build type by itselves. +set(BUILD_TYPE_DEBUG OFF) +if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") + set(BUILD_TYPE_DEBUG ON) +endif() + if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_expat_REQUIRED_VARS expat_LIBRARY) @@ -87,21 +96,58 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) expat/include ) + + # Expat uses prefix "lib" on all platform by default. + # Library name doesn't change in debug. + + # For Windows, see https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt. + # libexpat.lib + # The "w" indicates the UTF-16 version of the library. + # Lib names to search for - set(_expat_LIB_NAMES expat libexpat) + set(_expat_LIB_NAMES libexpat expat) + if(WIN32 AND BUILD_TYPE_DEBUG) - # Prefer Debug lib names (Windows only) - list(INSERT _expat_LIB_NAMES 0 expatd) + # Prefer Debug lib names. The library name changes only on Windows. + list(INSERT _expat_LIB_NAMES 0 libexpatd libexpatwd expatd expatwd) + elseif(WIN32) + # libexpat(w).dll/.lib + list(APPEND _expat_LIB_NAMES libexpatw expatw) endif() if(expat_STATIC_LIBRARY) + # Looking for both "lib" prefix and CMAKE_STATIC_LIBRARY_PREFIX. # Prefer static lib names - set(_expat_STATIC_LIB_NAMES + set(_expat_STATIC_LIB_NAMES + "libexpat${CMAKE_STATIC_LIBRARY_SUFFIX}" "${CMAKE_STATIC_LIBRARY_PREFIX}expat${CMAKE_STATIC_LIBRARY_SUFFIX}") + if(WIN32 AND BUILD_TYPE_DEBUG) - # Prefer static Debug lib names (Windows only) + # Prefer static Debug lib names. The library name changes only on Windows. + list(INSERT _expat_STATIC_LIB_NAMES 0 + "libexpatdMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatdMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatd${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatwdMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatwdMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatwd${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatdMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatdMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatd${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatwdMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatwdMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatwd${CMAKE_STATIC_LIBRARY_SUFFIX}") + elseif (WIN32) list(INSERT _expat_STATIC_LIB_NAMES 0 - "${CMAKE_STATIC_LIBRARY_PREFIX}expatd${CMAKE_STATIC_LIBRARY_SUFFIX}") + "libexpatMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatwMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libexpatwMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatwMD${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}expatwMT${CMAKE_STATIC_LIBRARY_SUFFIX}" + ) endif() endif() @@ -162,7 +208,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT expat_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT expat_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) diff --git a/share/cmake/modules/Findlcms2.cmake b/share/cmake/modules/Findlcms2.cmake index b7049ce4f4..f35fcf14f4 100644 --- a/share/cmake/modules/Findlcms2.cmake +++ b/share/cmake/modules/Findlcms2.cmake @@ -97,7 +97,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT lcms2_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT lcms2_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) set(_EXT_DIST_ROOT "${CMAKE_BINARY_DIR}/ext/dist") diff --git a/share/cmake/modules/Findminizip-ng.cmake b/share/cmake/modules/Findminizip-ng.cmake index 0915ad8b18..b961d1c9ac 100644 --- a/share/cmake/modules/Findminizip-ng.cmake +++ b/share/cmake/modules/Findminizip-ng.cmake @@ -3,12 +3,6 @@ # # Locate or install minizip-ng # -# This module will try to do the following: -# 1) Locate minizip-ng -# 2) If minizip-ng cannot be found, it will try to find minizip (minizip-ng with MZ_COMPAT=ON) -# 3) If minizip-ng with MZ_COMPAT=ON cannot be found, minizip-ng will be downloaded, built and -# installed. -# # Variables defined by this module: # minizip-ng_FOUND - If FALSE, do not try to link to minizip-ng # minizip-ng_LIBRARY - minizip-ng library to link to @@ -32,6 +26,15 @@ ############################################################################### ### Try to find package ### +# BUILD_TYPE_DEBUG variable is currently set in one of the OCIO's CMake files. +# Now that some OCIO's find module are installed with the library itself (with static build), +# a consumer app don't have access to the variables set by an OCIO's CMake files. Therefore, some +# OCIO's find modules must detect the build type by itselves. +set(BUILD_TYPE_DEBUG OFF) +if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") + set(BUILD_TYPE_DEBUG ON) +endif() + if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) if(NOT DEFINED minizip-ng_ROOT) # Search for minizip-ng-config.cmake @@ -106,23 +109,22 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) minizip-ng/include ) - # Lib names to search for - set(_minizip-ng_LIB_NAMES minizip-ng) + # Minizip-ng uses prefix "lib" on all platform by default. + # Library name doesn't change in debug. - if(BUILD_TYPE_DEBUG) - # Prefer Debug lib names (Windows only) - list(INSERT _minizip-ng_LIB_NAMES 0 minizip-ngd) - endif() + # Lib names to search for. + # Search for "minizip" since the library could be named "minizip" if it was built + # with MZ_COMPAT=ON. + set(_minizip-ng_LIB_NAMES libminizip-ng minizip-ng libminizip minizip) if(minizip-ng_STATIC_LIBRARY) - # Prefer static lib names + # Looking for both "lib" prefix and CMAKE_STATIC_LIBRARY_PREFIX. + # Prefer static lib names. set(_minizip-ng_STATIC_LIB_NAMES - "${CMAKE_STATIC_LIBRARY_PREFIX}minizip-ng${CMAKE_STATIC_LIBRARY_SUFFIX}") - if(WIN32 AND BUILD_TYPE_DEBUG) - # Prefer static Debug lib names (Windows only) - list(INSERT _minizip-ng_STATIC_LIB_NAMES 0 - "${CMAKE_STATIC_LIBRARY_PREFIX}minizip-ngd${CMAKE_STATIC_LIBRARY_SUFFIX}") - endif() + "libminizip-ng${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}minizip-ng${CMAKE_STATIC_LIBRARY_SUFFIX}" + "libminizip${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}minizip${CMAKE_STATIC_LIBRARY_SUFFIX}") endif() # Find library @@ -138,7 +140,23 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) ) # Get version from header or pkg-config - set(minizip-ng_VERSION "${minizip-ng_FIND_VERSION}") + if(minizip-ng_INCLUDE_DIR) + list(GET minizip-ng_INCLUDE_DIR 0 _minizip-ng_INCLUDE_DIR) + if(EXISTS "${_minizip-ng_INCLUDE_DIR}/mz.h") + set(_minizip-ng_CONFIG "${_minizip-ng_INCLUDE_DIR}/mz.h") + endif() + endif() + + if(_minizip-ng_CONFIG) + file(STRINGS "${_minizip-ng_CONFIG}" _minizip-ng_VER_SEARCH + REGEX "^[ \t]*#define[ \t]+MZ_VERSION[ \t]+\\(\"[.0-9]+\"\\).*$") + if(_minizip-ng_VER_SEARCH) + string(REGEX REPLACE ".*#define[ \t]+MZ_VERSION[ \t]+\\(\"([.0-9]+)\"\\).*" + "\\1" minizip-ng_VERSION "${_minizip-ng_VER_SEARCH}") + endif() + elseif(PC_minizip-ng_FOUND) + set(minizip-ng_VERSION "${PC_minizip-ng_VERSION}") + endif() endif() # Override REQUIRED if package can be installed @@ -156,128 +174,120 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) ) endif() -if(NOT minizip-ng_FOUND) - # Looking for an external minizip-ng that might be built using MZ_COMPAT=ON. - # But do not download it if it cannot be found. - find_package(minizip ${minizip-ng_FIND_VERSION} REQUIRED) +############################################################################### +### Create target +if(NOT TARGET MINIZIP::minizip-ng) + add_library(MINIZIP::minizip-ng UNKNOWN IMPORTED GLOBAL) + set(_minizip-ng_TARGET_CREATE TRUE) endif() -if(NOT minizip_FOUND AND NOT TARGET MINIZIP::minizip) - ############################################################################### - ### 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 NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) - include(ExternalProject) - include(GNUInstallDirs) - - set(_EXT_DIST_ROOT "${CMAKE_BINARY_DIR}/ext/dist") - set(_EXT_BUILD_ROOT "${CMAKE_BINARY_DIR}/ext/build") - - # Set find_package standard args - set(minizip-ng_FOUND TRUE) - set(minizip-ng_VERSION ${minizip-ng_FIND_VERSION}) - - set(minizip-ng_INCLUDE_DIR "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/minizip-ng") +############################################################################### +### 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 "${CMAKE_BINARY_DIR}/ext/dist") + set(_EXT_BUILD_ROOT "${CMAKE_BINARY_DIR}/ext/build") + + # Set find_package standard args + set(minizip-ng_FOUND TRUE) + set(minizip-ng_VERSION ${minizip-ng_FIND_VERSION}) + + 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 + set(_minizip-ng_LIB_PREFIX "lib") + + 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} + # Since the other modules create a subfolder for the includes by default and since + # minizip-ng does not, a suffix is added to CMAKE_INSTALL_INCLUDEDIR in order to + # install the headers under a subdirectory named "minizip-ng". + # Note that this does not affect external builds for minizip-ng. + -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}/minizip-ng + -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} + ) - # Minizip-ng use a hardcoded lib prefix instead of CMAKE_STATIC_LIBRARY_PREFIX - set(_minizip-ng_LIB_PREFIX "lib") + if(CMAKE_TOOLCHAIN_FILE) + set(minizip-ng_CMAKE_ARGS + ${minizip-ng_CMAKE_ARGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) + 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(APPLE) + string(REPLACE ";" "$" ESCAPED_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - 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} - # Since the other modules create a subfolder for the includes by default and since - # minizip-ng does not, a suffix is added to CMAKE_INSTALL_INCLUDEDIR in order to - # install the headers under a subdirectory named "minizip-ng". - # Note that this does not affect external builds for minizip-ng. - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}/minizip-ng - -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} + -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_OSX_ARCHITECTURES=${ESCAPED_CMAKE_OSX_ARCHITECTURES} ) + endif() - 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() + 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 - ) + # 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 + ) - add_dependencies(MINIZIP::minizip-ng minizip-ng_install) - message(STATUS "Installing minizip-ng: ${minizip-ng_LIBRARY} (version \"${minizip-ng_VERSION}\")") - endif() + add_dependencies(MINIZIP::minizip-ng minizip-ng_install) + message(STATUS "Installing minizip-ng: ${minizip-ng_LIBRARY} (version \"${minizip-ng_VERSION}\")") endif() ############################################################################### diff --git a/share/cmake/modules/Findminizip.cmake b/share/cmake/modules/Findminizip.cmake deleted file mode 100644 index 1a75747177..0000000000 --- a/share/cmake/modules/Findminizip.cmake +++ /dev/null @@ -1,172 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright Contributors to the OpenColorIO Project. -# -# Locate minizip-ng with MZ_COMPAT=ON. -# -# This module DOES NOT install minizip-ng with MZ_COMPAT=ON if it is not found. -# -# Note: This option changes the name for the library file to "libminizip", but it is still -# actually minizip-ng. OCIO uses the API from minizip-ng. -# -# Variables defined by this module: -# minizip_FOUND - If FALSE, do not try to link to minizip -# minizip_LIBRARY - minizip library to link to -# minizip_INCLUDE_DIR - Where to find mz.h and other headers -# minizip_VERSION - The version of the library -# -# This module set the variables below because this is still minizip-ng. The librarie become -# "minizip" because of the cmake option MZ_COMPAT=ON. -# -# minizip-ng_FOUND - If FALSE, do not try to link to minizip-ng -# minizip-ng_LIBRARY - minizip-ng library to link to -# minizip-ng_INCLUDE_DIR - Where to find mz.h and other headers -# minizip-ng_VERSION - The version of the library -# -# Targets defined by this module: -# MINIZIP::minizip-ng - IMPORTED target, if found -# -############################################################################### -### Try to find package ### - -if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - - if(NOT DEFINED minizip_ROOT) - # Search for minizip-config.cmake - find_package(minizip ${minizip_FIND_VERSION} CONFIG QUIET) - endif() - - if (minizip_FOUND) - get_target_property(minizip_INCLUDE_DIR MINIZIP::minizip INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(minizip_LIBRARY MINIZIP::minizip LOCATION) - - if (NOT minizip_LIBRARY) - # Lib names to search for - set(_minizip_LIB_NAMES minizip) - - if(BUILD_TYPE_DEBUG) - # Prefer Debug lib names (Windows only) - list(INSERT _minizip_LIB_NAMES 0 minizipd) - endif() - - if(minizip_STATIC_LIBRARY) - # Prefer static lib names - set(_minizip_STATIC_LIB_NAMES - "${CMAKE_STATIC_LIBRARY_PREFIX}minizip${CMAKE_STATIC_LIBRARY_SUFFIX}") - if(WIN32 AND BUILD_TYPE_DEBUG) - # Prefer static Debug lib names (Windows only) - list(INSERT _minizip_STATIC_LIB_NAMES 0 - "${CMAKE_STATIC_LIBRARY_PREFIX}minizipd${CMAKE_STATIC_LIBRARY_SUFFIX}") - endif() - endif() - - # Find library - find_library(minizip_LIBRARY - NAMES - ${_minizip_STATIC_LIB_NAMES} - ${_minizip_LIB_NAMES} - HINTS - ${minizip_ROOT} - ${PC_minizip_LIBRARY_DIRS} - PATH_SUFFIXES - lib64 lib - ) - endif() - else() - list(APPEND _minizip_REQUIRED_VARS minizip_INCLUDE_DIR) - - # Search for minizip.pc - find_package(PkgConfig QUIET) - pkg_check_modules(PC_minizip QUIET "minizip>=${minizip_FIND_VERSION}") - - # Find include directory - find_path(minizip_INCLUDE_DIR - NAMES - mz.h - HINTS - ${minizip_ROOT} - ${PC_minizip_INCLUDE_DIRS} - PATH_SUFFIXES - include - minizip/include - ) - - # Lib names to search for - set(_minizip_LIB_NAMES minizip) - - if(BUILD_TYPE_DEBUG) - # Prefer Debug lib names (Windows only) - list(INSERT _minizip_LIB_NAMES 0 minizipd) - endif() - - if(minizip_STATIC_LIBRARY) - # Prefer static lib names - set(_minizip_STATIC_LIB_NAMES - "${CMAKE_STATIC_LIBRARY_PREFIX}minizip${CMAKE_STATIC_LIBRARY_SUFFIX}") - if(WIN32 AND BUILD_TYPE_DEBUG) - # Prefer static Debug lib names (Windows only) - list(INSERT _minizip_STATIC_LIB_NAMES 0 - "${CMAKE_STATIC_LIBRARY_PREFIX}minizipd${CMAKE_STATIC_LIBRARY_SUFFIX}") - endif() - endif() - - # Find library - find_library(minizip_LIBRARY - NAMES - ${_minizip_STATIC_LIB_NAMES} - ${_minizip_LIB_NAMES} - HINTS - ${minizip_ROOT} - ${PC_minizip_LIBRARY_DIRS} - PATH_SUFFIXES - lib64 - lib - ) - - # Get version from header or pkg-config - set(minizip_VERSION "${minizip_FIND_VERSION}") - endif() - - # Override REQUIRED if package can be installed - if(OCIO_INSTALL_EXT_PACKAGES STREQUAL MISSING) - set(minizip_FIND_REQUIRED FALSE) - endif() - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(minizip - REQUIRED_VARS - minizip_LIBRARY - minizip_INCLUDE_DIR - VERSION_VAR - minizip_VERSION - ) -endif() - -############################################################################### -### Create target - -if(minizip_FOUND AND NOT TARGET MINIZIP::minizip-ng) - add_library(MINIZIP::minizip-ng UNKNOWN IMPORTED GLOBAL) - set(_minizip_TARGET_CREATE TRUE) -endif() - -############################################################################### - -############################################################################### -### Configure target ### - -if(minizip_FOUND AND _minizip_TARGET_CREATE) - set_target_properties(MINIZIP::minizip-ng PROPERTIES - IMPORTED_LOCATION "${minizip_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${minizip_INCLUDE_DIR}" - ) - - # This is still minizip-ng even though the library is called minizip because of MZ_COMPAT=ON. - set(minizip-ng_LIBRARY ${minizip_LIBRARY}) - set(minizip-ng_INCLUDE_DIR ${minizip_INCLUDE_DIR}) - set(minizip-ng_FOUND ${minizip_FOUND}) - set(minizip-ng_VERSION ${minizip_VERSION}) - - mark_as_advanced(minizip_INCLUDE_DIR minizip_LIBRARY minizip_VERSION) - - target_link_libraries(MINIZIP::minizip-ng INTERFACE ZLIB::ZLIB) -endif() \ No newline at end of file diff --git a/share/cmake/modules/Findopenfx.cmake b/share/cmake/modules/Findopenfx.cmake index f989e0f7ae..8b0eefb344 100644 --- a/share/cmake/modules/Findopenfx.cmake +++ b/share/cmake/modules/Findopenfx.cmake @@ -58,7 +58,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT openfx_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT openfx_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) diff --git a/share/cmake/modules/Findpybind11.cmake b/share/cmake/modules/Findpybind11.cmake index 316496096c..e6c2f35a86 100644 --- a/share/cmake/modules/Findpybind11.cmake +++ b/share/cmake/modules/Findpybind11.cmake @@ -134,7 +134,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT pybind11_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT pybind11_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) diff --git a/share/cmake/modules/Findpystring.cmake b/share/cmake/modules/Findpystring.cmake index 702ac1e812..bbd5e1fd27 100644 --- a/share/cmake/modules/Findpystring.cmake +++ b/share/cmake/modules/Findpystring.cmake @@ -66,7 +66,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT pystring_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT pystring_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) set(_EXT_DIST_ROOT "${CMAKE_BINARY_DIR}/ext/dist") @@ -127,14 +127,6 @@ if(NOT pystring_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) -DANDROID_STL=${ANDROID_STL}) endif() - if(NOT BUILD_SHARED_LIBS) - #TODO: Find a way to merge in the static libs when built with internal pystring - message(WARNING - "Building STATIC libOpenColorIO using the in-built pystring. " - "pystring symbols are NOT included in the output binary!" - ) - endif() - # Hack to let imported target be built from ExternalProject_Add file(MAKE_DIRECTORY ${pystring_INCLUDE_DIR}) diff --git a/share/cmake/modules/Findyaml-cpp.cmake b/share/cmake/modules/Findyaml-cpp.cmake index 023e14fc07..59558ce6a9 100644 --- a/share/cmake/modules/Findyaml-cpp.cmake +++ b/share/cmake/modules/Findyaml-cpp.cmake @@ -25,6 +25,15 @@ ############################################################################### ### Try to find package ### +# BUILD_TYPE_DEBUG variable is currently set in one of the OCIO's CMake files. +# Now that some OCIO's find module are installed with the library itself (with static build), +# a consumer app don't have access to the variables set by an OCIO's CMake files. Therefore, some +# OCIO's find modules must detect the build type by itselves. +set(BUILD_TYPE_DEBUG OFF) +if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") + set(BUILD_TYPE_DEBUG ON) +endif() + if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_yaml-cpp_REQUIRED_VARS yaml-cpp_LIBRARY) @@ -66,22 +75,21 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) # Lib names to search for set(_yaml-cpp_LIB_NAMES yaml-cpp) - if(WIN32 AND BUILD_TYPE_DEBUG AND NOT MINGW) - # Prefer Debug lib names (Windows only) + if(BUILD_TYPE_DEBUG) + # Prefer Debug lib names. list(INSERT _yaml-cpp_LIB_NAMES 0 yaml-cppd) endif() if(yaml-cpp_STATIC_LIBRARY) # Prefer static lib names - if(WIN32 AND NOT MINGW) - set(_yaml-cpp_LIB_SUFFIX "md") - endif() set(_yaml-cpp_STATIC_LIB_NAMES - "libyaml-cpp${_yaml-cpp_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") - if(WIN32 AND BUILD_TYPE_DEBUG AND NOT MINGW) - # Prefer static Debug lib names (Windows only) + "${CMAKE_STATIC_LIBRARY_PREFIX}yaml-cpp${CMAKE_STATIC_LIBRARY_SUFFIX}") + + # Starting from 0.7.0, all platforms uses the suffix "d" for debug. + # See https://github.com/jbeder/yaml-cpp/blob/master/CMakeLists.txt#L141 + if(BUILD_TYPE_DEBUG) list(INSERT _yaml-cpp_STATIC_LIB_NAMES 0 - "libyaml-cpp${_yaml-cpp_LIB_SUFFIX}d${CMAKE_STATIC_LIBRARY_SUFFIX}") + "${CMAKE_STATIC_LIBRARY_PREFIX}yaml-cppd${CMAKE_STATIC_LIBRARY_SUFFIX}") endif() endif() @@ -91,7 +99,7 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) ${_yaml-cpp_STATIC_LIB_NAMES} ${_yaml-cpp_LIB_NAMES} HINTS - ${_yaml-cpp_ROOT} + ${yaml-cpp_ROOT} ${PC_yaml-cpp_LIBRARY_DIRS} PATH_SUFFIXES lib64 @@ -130,7 +138,7 @@ endif() ############################################################################### ### Install package from source ### -if(NOT yaml-cpp_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +if(NOT yaml-cpp_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) include(ExternalProject) include(GNUInstallDirs) @@ -213,14 +221,6 @@ if(NOT yaml-cpp_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) -DANDROID_STL=${ANDROID_STL}) endif() - if(NOT BUILD_SHARED_LIBS) - #TODO: Find a way to merge in the static libs when built with internal yamlcpp - message(WARNING - "Building STATIC libOpenColorIO using the in-built yaml-cpp. " - "yaml-cpp symbols are NOT included in the output binary!" - ) - endif() - set(yaml-cpp_GIT_TAG "yaml-cpp-${yaml-cpp_VERSION}") # Hack to let imported target be built from ExternalProject_Add diff --git a/share/cmake/modules/Findzlib.cmake b/share/cmake/modules/InstallZLIB.cmake similarity index 73% rename from share/cmake/modules/Findzlib.cmake rename to share/cmake/modules/InstallZLIB.cmake index 546cea341a..954563ec4e 100644 --- a/share/cmake/modules/Findzlib.cmake +++ b/share/cmake/modules/InstallZLIB.cmake @@ -1,75 +1,58 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. # -# Locate or install minizip-ng +# 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 - If FALSE, do not try to link to minizip-ng +# ZLIB_FOUND - If FALSE, do not try to link to zlib # ZLIB_LIBRARIES - ZLIB library to link to # ZLIB_INCLUDE_DIRS - Where to find zlib.h and other headers # ZLIB_VERSION - The version of the library # # Targets defined by this module: -# ZLIB::ZLIB - IMPORTED target, if found -# -# This module is named GetZLIB because it is not used with find_package(). -# It must be included using include(). -# -# The reason is that CMake provide a FindZLIB already and the current file is -# using it. +# ZLIB::ZLIB - Properties: +# IMPORTED_LOCATION ${ZLIB_LIBRARIES} +# INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRS} # ############################################################################### -### Try to find package ### - -# Assign the rigtt name for ZLIB depending on the OS. -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() - -if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - set(_ZLIB_REQUIRED_VARS ZLIB_LIBRARIES) - - if(NOT DEFINED ZLIB_ROOT) - # Save old value of CMAKE_MODULE_PATH - set(_ZLIB__CMAKE_MODULE_PATH_OLD_ ${CMAKE_MODULE_PATH}) - # Force find_package to use CMAKE module and not custom modules. - set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules") - - # Use CMake FindZLIB module - find_package(ZLIB ${zlib_FIND_VERSION}) - - # Restore CMAKE_MODULE_PATH - set(CMAKE_MODULE_PATH ${_ZLIB__CMAKE_MODULE_PATH_OLD_}) - endif() -endif() ############################################################################### ### 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 NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) +### 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 "${CMAKE_BINARY_DIR}/ext/dist") set(_EXT_BUILD_ROOT "${CMAKE_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(_zlib_ExternalProject_VERSION) - set(ZLIB_VERSION ${_zlib_ExternalProject_VERSION}) + if(_ZLIB_ExternalProject_VERSION) + set(ZLIB_VERSION ${_ZLIB_ExternalProject_VERSION}) else() - set(ZLIB_VERSION ${zlib_FIND_VERSION}) + 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. @@ -149,22 +132,19 @@ if(NOT ZLIB_FOUND AND NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL NONE) COMMAND ${CMAKE_COMMAND} -E remove -f ${_EXT_DIST_ROOT}/${_ZLIB_INSTALL_LIBDIR}/zlib.lib ${_EXT_DIST_ROOT}/bin/zlib.dll ) - add_library(ZLIB::ZLIB STATIC IMPORTED GLOBAL) add_dependencies(ZLIB::ZLIB ZLIB_install) - set_property(TARGET ZLIB::ZLIB PROPERTY - IMPORTED_LOCATION "${ZLIB_LIBRARIES}" - ) - target_include_directories(ZLIB::ZLIB INTERFACE "${CMAKE_INSTALL_BINDIR}/include") - + + # Setting those variables to follow the same naming as the other OCIO custom find modules. set(ZLIB_LIBRARY ${ZLIB_LIBRARIES}) set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS}) message(STATUS "Installing ZLIB: ${ZLIB_LIBRARIES} (version \"${ZLIB_VERSION}\")") endif() + ############################################################################### ### Configure target ### - +############################################################################### if(_ZLIB_TARGET_CREATE) set_target_properties(ZLIB::ZLIB PROPERTIES IMPORTED_LOCATION ${ZLIB_LIBRARIES} diff --git a/src/cmake/Config.cmake.in b/src/cmake/Config.cmake.in index feabdeb2e3..6a4932a836 100644 --- a/src/cmake/Config.cmake.in +++ b/src/cmake/Config.cmake.in @@ -2,6 +2,129 @@ include(CMakeFindDependencyMacro) +if (NOT @BUILD_SHARED_LIBS@) # NOT @BUILD_SHARED_LIBS@ + if (APPLE) + # Store the previous value of CMAKE_FIND_FRAMEWORK and CMAKE_FIND_APPBUNDLE. + set(_PREVIOUS_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) + set(_PREVIOUS_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE}) + + # Prioritize other paths before Frameworks and Appbundle for find_path, find_library and + # find_package. + set(CMAKE_FIND_FRAMEWORK LAST) + set(CMAKE_FIND_APPBUNDLE LAST) + endif() + + # Get the install directory. + set(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_DIR}") + # Get the install directory. Since the current file is under + # /lib/cmake/OpenColorIO going back three directory. + foreach(i RANGE 1 3) + get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) + if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") + break() + endif() + endforeach() + + # Append OCIO custom find module path. + list(APPEND CMAKE_MODULE_PATH "${_IMPORT_PREFIX}/share/OpenColorIO/cmake/modules") + list(APPEND CMAKE_MODULE_PATH "${_IMPORT_PREFIX}/share/OpenColorIO/cmake/macros") + + ######################## + # Required dependencies + ######################## + + if (NOT expat::expat) + find_dependency(expat @expat_VERSION@) + endif() + + if (NOT Imath::Imath) + find_dependency(Imath @Imath_VERSION@) + endif() + + if (NOT pystring::pystring) + find_dependency(pystring @pystring_VERSION@) + endif() + + if (NOT yaml-cpp) + find_dependency(yaml-cpp @yaml-cpp_VERSION@) + endif() + + if (NOT ZLIB::ZLIB) + # ZLIB_VERSION is available starting CMake 3.26+. + # ZLIB_VERSION_STRING is still available for backward compatibility. + # See https://cmake.org/cmake/help/git-stage/module/FindZLIB.html + + # ZLIB_USE_STATIC_LIBS is supported only from CMake 3.24+. + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0") + if (ZLIB_STATIC_LIBRARY) + set(ZLIB_USE_STATIC_LIBS "${ZLIB_STATIC_LIBRARY}") + endif() + else() # For CMake < 3.24 since ZLIB_USE_STATIC_LIBS is not available. + if(NOT ZLIB_LIBRARY) + if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES) + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + else() + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES) + endif() + + if(DEFINED CMAKE_FIND_LIBRARY_SUFFIXES) + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}") + else() + set(_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) + endif() + + # Prefix/suffix for windows. + if(WIN32) + list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a") + endif() + + # Check if static lib is preferred. + if(ZLIB_STATIC_LIBRARY OR ZLIB_USE_STATIC_LIBS) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + endif() + endif() + endif() + endif() + + if (@ZLIB_VERSION@) # @ZLIB_VERSION@ + find_dependency(ZLIB @ZLIB_VERSION@) + else() + find_dependency(ZLIB @ZLIB_VERSION_STRING@) + endif() + + # Restore the original find library ordering + if(DEFINED _ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) + set(CMAKE_FIND_LIBRARY_SUFFIXES "${_ZLIB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}") + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES) + endif() + + if(DEFINED _ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES) + set(CMAKE_FIND_LIBRARY_PREFIXES "${_ZLIB_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}") + else() + set(CMAKE_FIND_LIBRARY_PREFIXES) + endif() + endif() + + if (NOT MINIZIP::minizip-ng) + find_dependency(minizip-ng @minizip-ng_VERSION@) + endif() + + # Remove OCIO custom find module path. + list(REMOVE_AT CMAKE_MODULE_PATH -1) + + if (APPLE) + # Restore CMAKE_FIND_FRAMEWORK and CMAKE_FIND_APPBUNDLE values. + set(CMAKE_FIND_FRAMEWORK ${_PREVIOUS_CMAKE_FIND_FRAMEWORK}) + set(CMAKE_FIND_APPBUNDLE ${_PREVIOUS_CMAKE_FIND_APPBUNDLE}) + endif() +endif() + include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake) include(FindPackageHandleStandardArgs)