From 71e519963d8eafd0a275f9a38ca34677779de957 Mon Sep 17 00:00:00 2001 From: grdanny Date: Sun, 12 Oct 2025 17:56:40 -0700 Subject: [PATCH 1/4] cmake file to d/l and install openjpeg dependency Signed-off-by: grdanny --- .github/workflows/ci.yml | 1 - src/cmake/build_OpenJPEG.cmake | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/cmake/build_OpenJPEG.cmake diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e57351446c..a2eda36bd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -544,7 +544,6 @@ jobs: setenvs: export OpenImageIO_BUILD_LOCAL_DEPS=all OpenImageIO_DEPENDENCY_BUILD_VERBOSE=ON LIBRAW_VERSION=0.21.4 - OPENJPEG_VERSION=v2.5.4 PTEX_VERSION=v2.4.2 PUGIXML_VERSION=v1.14 WEBP_VERSION=v1.4.0 diff --git a/src/cmake/build_OpenJPEG.cmake b/src/cmake/build_OpenJPEG.cmake new file mode 100644 index 0000000000..4d6defb558 --- /dev/null +++ b/src/cmake/build_OpenJPEG.cmake @@ -0,0 +1,33 @@ +# Copyright Contributors to the OpenImageIO project. +# SPDX-License-Identifier: Apache-2.0 +# https://github.com/Academ SoftwareFoundation/OpenImageIO + +set_cache (OpenJPEG_BUILD_VERSION 2.5.4 "OpenJPEG version for local builds") +set (OpenJPEG_GIT_REPOSITORY "https://github.com/uclouvain/openjpeg.git") +set (OpenJPEG_GIT_TAG "v${OpenJPEG_BUILD_VERSION}") +set_cache (OpenJPEG_BUILD_SHARED_LIBS ${LOCAL_BUILD_SHARED_LIBS_DEFAULT} + DOC "Should a local OpenJPEG build, if necessary, build shared libraries" ADVANCED) + + +string (MAKE_C_IDENTIFIER ${OpenJPEG_BUILD_VERSION} OpenJPEG_VERSION_IDENT) + +build_dependency_with_cmake(OpenJPEG + VERSION ${OpenJPEG_BUILD_VERSION} + GIT_REPOSITORY ${OpenJPEG_GIT_REPOSITORY} + GIT_TAG ${OpenJPEG_GIT_TAG} + CMAKE_ARGS + -D BUILD_CODEC=OFF + + + ) +# Set some things up that we'll need for a subsequent find_package to work +set (OpenJPEG_ROOT ${OpenJPEG_LOCAL_INSTALL_DIR}) + + +# Signal to caller that we need to find again at the installed location +set (OpenJPEG_REFIND TRUE) +set (OpenJPEG_REFIND_ARGS CONFIG) + +if (OpenJPEG_BUILD_SHARED_LIBS) + install_local_dependency_libs (OpenJPEG openjp2) +endif () From 58aada79389777f4889436df0022e5c7dec503bc Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Mon, 13 Oct 2025 13:58:09 -0700 Subject: [PATCH 2/4] Prefer static OpenJPEG if possible Signed-off-by: Larry Gritz --- src/cmake/build_OpenJPEG.cmake | 3 +-- src/cmake/externalpackages.cmake | 3 ++- src/cmake/modules/FindOpenJPEG.cmake | 9 +++++++++ src/jpeg2000.imageio/CMakeLists.txt | 15 ++++++++++++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/cmake/build_OpenJPEG.cmake b/src/cmake/build_OpenJPEG.cmake index 4d6defb558..5e4b890b8a 100644 --- a/src/cmake/build_OpenJPEG.cmake +++ b/src/cmake/build_OpenJPEG.cmake @@ -17,8 +17,7 @@ build_dependency_with_cmake(OpenJPEG GIT_TAG ${OpenJPEG_GIT_TAG} CMAKE_ARGS -D BUILD_CODEC=OFF - - + -D CMAKE_POSITION_INDEPENDENT_CODE=ON ) # Set some things up that we'll need for a subsequent find_package to work set (OpenJPEG_ROOT ${OpenJPEG_LOCAL_INSTALL_DIR}) diff --git a/src/cmake/externalpackages.cmake b/src/cmake/externalpackages.cmake index fc9cfc48dc..12467ae6b6 100644 --- a/src/cmake/externalpackages.cmake +++ b/src/cmake/externalpackages.cmake @@ -172,7 +172,8 @@ checked_find_package (LibRaw checked_find_package (OpenJPEG VERSION_MIN 2.0 RECOMMEND_MIN 2.2 - RECOMMEND_MIN_REASON "for multithreading support") + RECOMMEND_MIN_REASON "for multithreading support" + PREFER_CONFIG) # Note: Recent OpenJPEG versions have exported cmake configs, but we don't # find them reliable at all, so we stick to our FindOpenJPEG.cmake module. diff --git a/src/cmake/modules/FindOpenJPEG.cmake b/src/cmake/modules/FindOpenJPEG.cmake index 3c89609089..53cbebe901 100644 --- a/src/cmake/modules/FindOpenJPEG.cmake +++ b/src/cmake/modules/FindOpenJPEG.cmake @@ -174,6 +174,15 @@ if (OPENJPEG_FOUND) foreach (tmplib ${OpenJpeg_libvars}) list (APPEND OPENJPEG_LIBRARIES ${${tmplib}}) endforeach () + + if (NOT TARGET openjp2) + add_library(openjp2 UNKNOWN IMPORTED) + set_target_properties(openjp2 PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPENJPEG_INCLUDES}") + set_property(TARGET openjp2 APPEND PROPERTY + IMPORTED_LOCATION "${OPENJPEG_LIBRARIES}") + endif() + if (NOT OpenJpeg_FIND_QUIETLY) FIND_PACKAGE_MESSAGE (OPENJPEG "Found OpenJpeg: v${OPENJPEG_VERSION} ${OPENJPEG_LIBRARIES}" diff --git a/src/jpeg2000.imageio/CMakeLists.txt b/src/jpeg2000.imageio/CMakeLists.txt index a989e48495..a60f472a8f 100644 --- a/src/jpeg2000.imageio/CMakeLists.txt +++ b/src/jpeg2000.imageio/CMakeLists.txt @@ -3,9 +3,17 @@ # https://github.com/AcademySoftwareFoundation/OpenImageIO if (OPENJPEG_FOUND) - set(_jpeg2000_includes ${OPENJPEG_INCLUDES}) - set(_jpeg2000_lib_dirs ${OPENJPEG_LIBRARY_DIRS}) - set(_jpeg2000_libs ${OPENJPEG_LIBRARIES}) + if (TARGET openjp2_static AND (LINKSTATIC OR NOT TARGET openjp2)) + # Use static OpenJPEG library for LINKSTATIC situations, or if + # no dynamic library is available. + set (OPENJPEG_TARGET openjp2_static) + elseif (TARGET openjp2) + set (OPENJPEG_TARGET openjp2) + else () + set(_jpeg2000_includes ${OPENJPEG_INCLUDES}) + set(_jpeg2000_lib_dirs ${OPENJPEG_LIBRARY_DIRS}) + set(_jpeg2000_libs ${OPENJPEG_LIBRARIES}) + endif () set(_jpeg2000_defs "USE_OPENJPEG") if (openjph_FOUND) @@ -16,6 +24,7 @@ if (OPENJPEG_FOUND) INCLUDE_DIRS ${_jpeg2000_includes} LINK_DIRECTORIES ${_jpeg2000_lib_dirs} LINK_LIBRARIES ${_jpeg2000_libs} + ${OPENJPEG_TARGET} $ DEFINITIONS ${_jpeg2000_defs} ) From 49d758aa149a7b5ec658bc7f605a5bce39903c5d Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Tue, 14 Oct 2025 11:06:37 -0700 Subject: [PATCH 3/4] Adjust build_OpenJPEG.bash to use PIC and optionally not build shared libs. Signed-off-by: Larry Gritz --- src/build-scripts/build_OpenJPEG.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/build-scripts/build_OpenJPEG.bash b/src/build-scripts/build_OpenJPEG.bash index f2bc23f70f..531e48da0a 100755 --- a/src/build-scripts/build_OpenJPEG.bash +++ b/src/build-scripts/build_OpenJPEG.bash @@ -45,6 +45,8 @@ if [[ -z $DEP_DOWNLOAD_ONLY ]]; then -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=${OPENJPEG_INSTALL_DIR} \ -DBUILD_CODEC=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DBUILD_SHARED_LIBS=${OPENJPEG_BUILD_SHARED_LIBS:-ON} \ ${OPENJPEG_CONFIG_OPTS} time cmake --build ${OPENJPEG_BUILD_DIR} --config Release --target install fi From dfbf7290143603041444d8d4368d35a36e872242 Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Tue, 14 Oct 2025 13:38:18 -0700 Subject: [PATCH 4/4] More care linking static OpenJPEG when built from source Signed-off-by: Larry Gritz --- src/cmake/build_OpenJPEG.cmake | 1 + src/cmake/set_utils.cmake | 10 ++++++++++ src/jpeg2000.imageio/CMakeLists.txt | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cmake/build_OpenJPEG.cmake b/src/cmake/build_OpenJPEG.cmake index 5e4b890b8a..4371b79791 100644 --- a/src/cmake/build_OpenJPEG.cmake +++ b/src/cmake/build_OpenJPEG.cmake @@ -26,6 +26,7 @@ set (OpenJPEG_ROOT ${OpenJPEG_LOCAL_INSTALL_DIR}) # Signal to caller that we need to find again at the installed location set (OpenJPEG_REFIND TRUE) set (OpenJPEG_REFIND_ARGS CONFIG) +set_invert (OpenJPEG_LINKSTATIC ${OpenJPEG_BUILD_SHARED_LIBS}) if (OpenJPEG_BUILD_SHARED_LIBS) install_local_dependency_libs (OpenJPEG openjp2) diff --git a/src/cmake/set_utils.cmake b/src/cmake/set_utils.cmake index 982c243a6e..24b39dd65b 100644 --- a/src/cmake/set_utils.cmake +++ b/src/cmake/set_utils.cmake @@ -20,6 +20,16 @@ macro (set_replace_if_nonempty var replacement) endmacro () +# Set a variable to the inverse of whether `value` was true or false. +macro (set_invert var value) + if (${value}) + set (${var} FALSE ${ARGN}) + else () + set (${var} TRUE ${ARGN}) + endif () +endmacro () + + # Set a cmake variable `var` from an environment variable, if it is not # already defined (or if the FORCE flag is used). By default, the env var is diff --git a/src/jpeg2000.imageio/CMakeLists.txt b/src/jpeg2000.imageio/CMakeLists.txt index a60f472a8f..c8bdf53907 100644 --- a/src/jpeg2000.imageio/CMakeLists.txt +++ b/src/jpeg2000.imageio/CMakeLists.txt @@ -3,7 +3,8 @@ # https://github.com/AcademySoftwareFoundation/OpenImageIO if (OPENJPEG_FOUND) - if (TARGET openjp2_static AND (LINKSTATIC OR NOT TARGET openjp2)) + if (TARGET openjp2_static AND (NOT TARGET openjp2 OR + LINKSTATIC OR OpenJPEG_LINKSTATIC)) # Use static OpenJPEG library for LINKSTATIC situations, or if # no dynamic library is available. set (OPENJPEG_TARGET openjp2_static) @@ -14,6 +15,7 @@ if (OPENJPEG_FOUND) set(_jpeg2000_lib_dirs ${OPENJPEG_LIBRARY_DIRS}) set(_jpeg2000_libs ${OPENJPEG_LIBRARIES}) endif () + message (VERBOSE "OPENJPEG_TARGET=${OPENJPEG_TARGET}") set(_jpeg2000_defs "USE_OPENJPEG") if (openjph_FOUND)