Skip to content

Commit 1921787

Browse files
authored
Changes to make it easier to hide the Imath dependency (#3322)
* `OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY` is a new CMake cache variable at OIIO build time that controls whether the Imath library dependencies will be declared as PUBLIC (default) or PRIVATE target dependencies of libOpenImageIO and libOpenImageIO_Util. * For *downstream projects* that consume OIIO's exported cmake config files, setting CMake variable `OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH` to true will skip the find_depencency() calls for Imath and OpenEXR. To clarify, this is not a variable that has any effect when building OIIO, it's something set in the downstream project itself. * Add a `OIIO_IMATH_H_INCLUDED` header guard in OpenImageIO/Imath.h, which allows something downstream to pre-define it to prevent OIIO headers it needs to read from using the contents of that header. Most builders of OIIO won't care and shouldn't change the defaults or use any of these. But here's the specific case it addresses: If you are building OIIO against static libraries of Imath & OpenEXR, but the libOpenImageIO will be consumed by a downstream project that wants to use a different Imath version, this can help you avoid some build-time conflicts in the downstream project.
1 parent 5dd4cb2 commit 1921787

File tree

5 files changed

+52
-49
lines changed

5 files changed

+52
-49
lines changed

src/cmake/Config.cmake.in

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33
include(CMakeFindDependencyMacro)
44

55
# add here all the find_dependency() whenever switching to config based dependencies
6-
if (@OpenEXR_VERSION@ VERSION_GREATER_EQUAL 3.0)
7-
find_dependency(Imath @Imath_VERSION@
8-
HINTS @Imath_DIR@)
9-
elseif (@OpenEXR_VERSION@ VERSION_GREATER_EQUAL 2.4 AND @FOUND_OPENEXR_WITH_CONFIG@)
10-
find_dependency(IlmBase @OpenEXR_VERSION@
11-
HINTS @IlmBase_DIR@ @OpenEXR_DIR@)
12-
find_dependency(OpenEXR @OpenEXR_VERSION@
13-
HINTS @OpenEXR_DIR@)
14-
find_dependency(ZLIB @ZLIB_VERSION@) # Because OpenEXR doesn't do it
15-
find_dependency(Threads) # Because OpenEXR doesn't do it
6+
if (NOT OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH)
7+
if (@OpenEXR_VERSION@ VERSION_GREATER_EQUAL 3.0)
8+
find_dependency(Imath @Imath_VERSION@
9+
HINTS @Imath_DIR@)
10+
elseif (@OpenEXR_VERSION@ VERSION_GREATER_EQUAL 2.4 AND @FOUND_OPENEXR_WITH_CONFIG@)
11+
find_dependency(IlmBase @OpenEXR_VERSION@
12+
HINTS @IlmBase_DIR@ @OpenEXR_DIR@)
13+
find_dependency(OpenEXR @OpenEXR_VERSION@
14+
HINTS @OpenEXR_DIR@)
15+
find_dependency(ZLIB @ZLIB_VERSION@) # Because OpenEXR doesn't do it
16+
find_dependency(Threads) # Because OpenEXR doesn't do it
17+
endif ()
1618
endif ()
1719

1820
# Compute the installation prefix relative to this file

src/cmake/externalpackages.cmake

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ include (ExternalProject)
2929

3030
option (BUILD_MISSING_DEPS "Try to download and build any missing dependencies" OFF)
3131

32+
include (FindThreads)
33+
3234

3335
###########################################################################
3436
# Boost setup
@@ -106,13 +108,32 @@ include_directories(BEFORE ${IMATH_INCLUDES} ${OPENEXR_INCLUDES})
106108
if (MSVC AND NOT LINKSTATIC)
107109
add_definitions (-DOPENEXR_DLL) # Is this needed for new versions?
108110
endif ()
109-
110111
if (OPENEXR_VERSION VERSION_GREATER_EQUAL 3.0)
111112
set (OIIO_USING_IMATH 3)
112113
else ()
113114
set (OIIO_USING_IMATH 2)
114115
endif ()
115-
116+
set (OPENIMAGEIO_IMATH_TARGETS
117+
# For OpenEXR/Imath 3.x:
118+
$<TARGET_NAME_IF_EXISTS:Imath::Imath>
119+
$<TARGET_NAME_IF_EXISTS:Imath::Half>
120+
# For OpenEXR >= 2.4/2.5 with reliable exported targets
121+
$<TARGET_NAME_IF_EXISTS:IlmBase::Imath>
122+
$<TARGET_NAME_IF_EXISTS:IlmBase::Half>
123+
$<TARGET_NAME_IF_EXISTS:IlmBase::Iex>
124+
# For OpenEXR <= 2.3:
125+
${ILMBASE_LIBRARIES} )
126+
set (OPENIMAGEIO_OPENEXR_TARGETS
127+
# For OpenEXR/Imath 3.x:
128+
$<TARGET_NAME_IF_EXISTS:OpenEXR::OpenEXR>
129+
# For OpenEXR >= 2.4/2.5 with reliable exported targets
130+
$<TARGET_NAME_IF_EXISTS:OpenEXR::IlmImf>
131+
$<TARGET_NAME_IF_EXISTS:IlmBase::IlmThread>
132+
$<TARGET_NAME_IF_EXISTS:IlmBase::Iex>
133+
# For OpenEXR <= 2.3:
134+
${OPENEXR_LIBRARIES} )
135+
set (OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY "PUBLIC" CACHE STRING
136+
"Should we expose Imath library dependency as PUBLIC or PRIVATE")
116137

117138
# JPEG -- prefer Turbo-JPEG to regular libjpeg
118139
checked_find_package (JPEGTurbo

src/include/OpenImageIO/Imath.h.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
// clang-format off
66

77
#pragma once
8-
8+
#ifndef OIIO_IMATH_H_INCLUDED
9+
#define OIIO_IMATH_H_INCLUDED 1
910

1011
// Determine which Imath we're dealing with and include the appropriate
1112
// headers.
@@ -23,3 +24,5 @@
2324
# include <OpenEXR/ImathVec.h>
2425
# include <OpenEXR/half.h>
2526
#endif
27+
28+
#endif // !defined(OIIO_IMATH_H_INCLUDED)

src/libOpenImageIO/CMakeLists.txt

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -126,24 +126,10 @@ target_compile_features (OpenImageIO
126126
target_link_libraries (OpenImageIO
127127
PUBLIC
128128
OpenImageIO_Util
129-
# For OpenEXR/Imath 3.x:
130-
$<TARGET_NAME_IF_EXISTS:Imath::Imath>
131-
$<TARGET_NAME_IF_EXISTS:Imath::Half>
132-
# For OpenEXR >= 2.4/2.5 with reliable exported targets
133-
$<TARGET_NAME_IF_EXISTS:IlmBase::Imath>
134-
$<TARGET_NAME_IF_EXISTS:IlmBase::Half>
135-
# For OpenEXR <= 2.3:
136-
${ILMBASE_LIBRARIES}
137-
${GCC_ATOMIC_LIBRARIES}
129+
${OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY}
130+
${OPENIMAGEIO_IMATH_TARGETS}
138131
PRIVATE
139-
# For OpenEXR/Imath 3.x:
140-
$<TARGET_NAME_IF_EXISTS:OpenEXR::OpenEXR>
141-
# For OpenEXR >= 2.4/2.5 with reliable exported targets
142-
$<TARGET_NAME_IF_EXISTS:OpenEXR::IlmImf>
143-
$<TARGET_NAME_IF_EXISTS:IlmBase::IlmThread>
144-
$<TARGET_NAME_IF_EXISTS:IlmBase::Iex>
145-
# For OpenEXR <= 2.3:
146-
${OPENEXR_LIBRARIES}
132+
${OPENIMAGEIO_OPENEXR_TARGETS}
147133
${OpenCV_LIBRARIES}
148134
${SANITIZE_LIBRARIES}
149135
${format_plugin_libs} # Add all the target link libraries from the plugins

src/libutil/CMakeLists.txt

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,10 @@ target_include_directories (OpenImageIO_Util
1212
)
1313
target_link_libraries (OpenImageIO_Util
1414
PUBLIC
15-
# For OpenEXR/Imath 3.x:
16-
$<TARGET_NAME_IF_EXISTS:Imath::Imath>
17-
$<TARGET_NAME_IF_EXISTS:Imath::Half>
18-
# For OpenEXR >= 2.4/2.5 with reliable exported targets
19-
$<TARGET_NAME_IF_EXISTS:IlmBase::Imath>
20-
$<TARGET_NAME_IF_EXISTS:IlmBase::Half>
21-
$<TARGET_NAME_IF_EXISTS:IlmBase::IlmThread>
22-
$<TARGET_NAME_IF_EXISTS:IlmBase::Iex>
23-
# For OpenEXR <= 2.3:
24-
${ILMBASE_LIBRARIES}
15+
$<TARGET_NAME_IF_EXISTS:Threads::Threads>
2516
${GCC_ATOMIC_LIBRARIES}
17+
${OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY}
18+
${OPENIMAGEIO_IMATH_TARGETS}
2619
PRIVATE
2720
Boost::filesystem
2821
Boost::system
@@ -106,7 +99,8 @@ if (OIIO_BUILD_TESTS)
10699
add_test (unit_strutil ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/strutil_test)
107100

108101
add_executable (fmath_test fmath_test.cpp)
109-
target_link_libraries (fmath_test PRIVATE OpenImageIO_Util)
102+
target_link_libraries (fmath_test PRIVATE OpenImageIO_Util
103+
${OPENIMAGEIO_IMATH_TARGETS})
110104
set_target_properties (fmath_test PROPERTIES FOLDER "Unit Tests")
111105
add_test (unit_fmath ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/fmath_test)
112106

@@ -141,7 +135,8 @@ if (OIIO_BUILD_TESTS)
141135
add_test (unit_thread ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thread_test)
142136

143137
add_executable (simd_test simd_test.cpp)
144-
target_link_libraries (simd_test PRIVATE OpenImageIO)
138+
target_link_libraries (simd_test PRIVATE OpenImageIO
139+
${OPENIMAGEIO_IMATH_TARGETS})
145140
set_target_properties (simd_test PROPERTIES FOLDER "Unit Tests")
146141
add_test (unit_simd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/simd_test)
147142

@@ -151,7 +146,8 @@ if (OIIO_BUILD_TESTS)
151146
add_test (unit_filter ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter_test)
152147

153148
add_executable (paramlist_test paramlist_test.cpp)
154-
target_link_libraries (paramlist_test PRIVATE OpenImageIO)
149+
target_link_libraries (paramlist_test PRIVATE OpenImageIO
150+
${OPENIMAGEIO_IMATH_TARGETS})
155151
set_target_properties (paramlist_test PROPERTIES FOLDER "Unit Tests")
156152
add_test (unit_paramlist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/paramlist_test)
157153

@@ -162,12 +158,7 @@ if (OIIO_BUILD_TESTS)
162158

163159
add_executable (typedesc_test typedesc_test.cpp)
164160
target_link_libraries (typedesc_test PRIVATE OpenImageIO_Util
165-
# For OpenEXR/Imath 3.x:
166-
$<TARGET_NAME_IF_EXISTS:OpenEXR::OpenEXR>
167-
# For OpenEXR >= 2.4/2.5 with reliable exported targets
168-
$<TARGET_NAME_IF_EXISTS:OpenEXR::IlmImf>
169-
# For OpenEXR <= 2.3:
170-
${OPENEXR_LIBRARIES})
161+
${OPENIMAGEIO_OPENEXR_TARGETS})
171162
set_target_properties (typedesc_test PROPERTIES FOLDER "Unit Tests")
172163
add_test (unit_typedesc ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/typedesc_test)
173164

0 commit comments

Comments
 (0)