Skip to content

Commit 74c58e5

Browse files
committed
Clarify #include policy and make usage consistent
This explains the OpenEXR policy regarding the "OpenEXR/" subdirectory for include files: headers are installed under the "OpenEXR" subdirectory, and the library supports application code that uses either the bare header or the "OpenEXR subdirectory, i.e either one of: #include <ImfHeader.h> #include <OpenEXR/ImfHeader.h> Both cmake config and pkg-config add -I$include and -I$include/OpenEXR as compilation args. This policy is explained for users in the "Header Layout and #include Policy" section in website/install.rst. Internally, all library and tool source includes bare headers, without the "OpenEXR" since the source tree maintains headers local to each library, not in a common OpenEXR directory. The only exception is code in the source tree that is expected to mimic example application code. Internally, all library and tool source includes files via quotes "" when the header in question is either in the local directory or is one of the public headers installed in the OpenEXR. Others are included via brackets <>. Previously, this was inconsistent. Imath headers are included via <> because they come from another project. Signed-off-by: Cary Phillips <cary@ilm.com>
1 parent 574289d commit 74c58e5

203 files changed

Lines changed: 1300 additions & 1181 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmake/CMakeLists.txt

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,22 @@ configure_file(IexConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/IexConfig.h)
124124
configure_file(IexConfigInternal.h.in ${CMAKE_CURRENT_BINARY_DIR}/IexConfigInternal.h)
125125
configure_file(IlmThreadConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/IlmThreadConfig.h)
126126

127+
# Mirror installed layout: include/${OPENEXR_OUTPUT_SUBDIR}/OpenEXRConfig.h etc.
128+
if(OPENEXR_IS_SUBPROJECT)
129+
foreach(_hdr IN ITEMS OpenEXRConfig.h IexConfig.h IlmThreadConfig.h)
130+
set(_cfg_src "${CMAKE_CURRENT_BINARY_DIR}/${_hdr}")
131+
set(_cfg_dst "${OPENEXR_BUILD_INTERFACE_UNIFIED}/${OPENEXR_OUTPUT_SUBDIR}/${_hdr}")
132+
if(EXISTS "${_cfg_src}")
133+
file(REMOVE "${_cfg_dst}")
134+
if(CMAKE_HOST_UNIX)
135+
file(CREATE_LINK "${_cfg_src}" "${_cfg_dst}" SYMBOLIC)
136+
else()
137+
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_cfg_src}" "${_cfg_dst}")
138+
endif()
139+
endif()
140+
endforeach()
141+
endif()
142+
127143
###################################################
128144
####### Install public config headers
129145

@@ -143,7 +159,12 @@ endif()
143159

144160
add_library(OpenEXRConfig INTERFACE)
145161
target_include_directories(OpenEXRConfig INTERFACE
146-
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
162+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
163+
if(OPENEXR_IS_SUBPROJECT)
164+
target_include_directories(OpenEXRConfig INTERFACE
165+
$<BUILD_INTERFACE:${OPENEXR_BUILD_INTERFACE_UNIFIED}>)
166+
endif()
167+
target_include_directories(OpenEXRConfig INTERFACE
147168
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
148169
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${OPENEXR_OUTPUT_SUBDIR}>)
149170

@@ -154,7 +175,12 @@ add_library(${PROJECT_NAME}::Config ALIAS OpenEXRConfig)
154175

155176
add_library(IexConfig INTERFACE)
156177
target_include_directories(IexConfig INTERFACE
157-
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
178+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
179+
if(OPENEXR_IS_SUBPROJECT)
180+
target_include_directories(IexConfig INTERFACE
181+
$<BUILD_INTERFACE:${OPENEXR_BUILD_INTERFACE_UNIFIED}>)
182+
endif()
183+
target_include_directories(IexConfig INTERFACE
158184
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
159185
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${OPENEXR_OUTPUT_SUBDIR}>)
160186

@@ -165,7 +191,12 @@ add_library(Iex::Config ALIAS IexConfig)
165191

166192
add_library(IlmThreadConfig INTERFACE)
167193
target_include_directories(IlmThreadConfig INTERFACE
168-
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
194+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
195+
if(OPENEXR_IS_SUBPROJECT)
196+
target_include_directories(IlmThreadConfig INTERFACE
197+
$<BUILD_INTERFACE:${OPENEXR_BUILD_INTERFACE_UNIFIED}>)
198+
endif()
199+
target_include_directories(IlmThreadConfig INTERFACE
169200
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
170201
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${OPENEXR_OUTPUT_SUBDIR}>)
171202

cmake/LibraryDefine.cmake

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,45 @@ function(OPENEXR_DEFINE_LIBRARY libname)
4040

4141
if(OPENEXR_CURLIB_CURDIR)
4242
target_include_directories(${objlib} INTERFACE $<BUILD_INTERFACE:${OPENEXR_CURLIB_CURDIR}>)
43+
44+
# When an application builds against OpenEXR via
45+
# add_subdirector(OpenEXR), if should still recognize include
46+
# statements with the OpenEXR subdirectory, ie. #include
47+
# <OpenEXR/ImfHeader.h>, altough in that configuration, there is
48+
# no OpenEXR subdirectory, since it is the install step that
49+
# places headers there; for an in-tree build, the headers are in
50+
# each library. To allow such an application to use the #include
51+
# <OpenEXR/...> construct, create a directory in the build root
52+
# with symbolic links to the headers in the library directories.
53+
#
54+
# We detect this condition via the OPENEXR_IS_SUBPROJECT setting,
55+
# which is set in OpenEXRSetup.cmake when CMAKE_PROJECT_NAME is
56+
# not "OpenEXR".
57+
58+
if(OPENEXR_IS_SUBPROJECT AND OPENEXR_CURLIB_HEADERS)
59+
foreach(_hdr IN LISTS OPENEXR_CURLIB_HEADERS)
60+
if(IS_ABSOLUTE "${_hdr}")
61+
set(_hdr_src "${_hdr}")
62+
else()
63+
set(_hdr_src "${OPENEXR_CURLIB_CURDIR}/${_hdr}")
64+
endif()
65+
get_filename_component(_hdr_name "${_hdr}" NAME)
66+
set(_hdr_dst "${OPENEXR_BUILD_INTERFACE_UNIFIED}/${OPENEXR_OUTPUT_SUBDIR}/${_hdr_name}")
67+
if(EXISTS "${_hdr_src}")
68+
file(REMOVE "${_hdr_dst}")
69+
if(CMAKE_HOST_UNIX)
70+
file(CREATE_LINK "${_hdr_src}" "${_hdr_dst}" SYMBOLIC)
71+
else()
72+
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_hdr_src}" "${_hdr_dst}")
73+
endif()
74+
else()
75+
message(WARNING "OpenEXR build-interface include: missing public header ${_hdr_src}")
76+
endif()
77+
endforeach()
78+
endif()
79+
if(OPENEXR_IS_SUBPROJECT)
80+
target_include_directories(${objlib} INTERFACE $<BUILD_INTERFACE:${OPENEXR_BUILD_INTERFACE_UNIFIED}>)
81+
endif()
4382
endif()
4483
if(OPENEXR_CURLIB_CURBINDIR)
4584
target_include_directories(${objlib} PRIVATE $<BUILD_INTERFACE:${OPENEXR_CURLIB_CURBINDIR}>)

cmake/OpenEXRSetup.cmake

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ option(OPENEXR_TEST_PYTHON "Run python binding tests" ON)
9393
# probably assume this is OpenEXR
9494
set(OPENEXR_OUTPUT_SUBDIR OpenEXR CACHE STRING "Destination sub-folder of the include path for install")
9595

96+
# When OpenEXR is pulled in via add_subdirectory(), mirror installed layout under
97+
# BUILD_INTERFACE so consumers can use #include <OpenEXR/...>. Not used for a normal
98+
# top-level OpenEXR build (clears legacy cache entry from older CMake revisions).
99+
if(OPENEXR_IS_SUBPROJECT)
100+
set(OPENEXR_BUILD_INTERFACE_UNIFIED "${CMAKE_BINARY_DIR}/OpenEXR_build_interface_include")
101+
file(MAKE_DIRECTORY "${OPENEXR_BUILD_INTERFACE_UNIFIED}/${OPENEXR_OUTPUT_SUBDIR}")
102+
else()
103+
unset(OPENEXR_BUILD_INTERFACE_UNIFIED CACHE)
104+
unset(OPENEXR_BUILD_INTERFACE_UNIFIED)
105+
endif()
106+
96107
# This does not seem to be available as a per-target property,
97108
# but is pretty harmless to set globally
98109
set(CMAKE_INCLUDE_CURRENT_DIR ON)

src/bin/exr2aces/main.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010
//
1111
//-----------------------------------------------------------------------------
1212

13-
#include <ImfAcesFile.h>
14-
#include <ImfArray.h>
15-
#include <ImfRgbaFile.h>
16-
#include <ImfMisc.h>
17-
#include <OpenEXRConfig.h>
13+
#include "ImfAcesFile.h"
14+
#include "ImfArray.h"
15+
#include "ImfRgbaFile.h"
16+
#include "ImfMisc.h"
17+
#include "OpenEXRConfig.h"
1818
#include <exception>
1919
#include <iostream>
2020
#include <stdlib.h>
2121
#include <string.h>
2222
#include <string>
2323

24-
#include <OpenEXRConfig.h>
24+
#include "OpenEXRConfig.h"
2525
using namespace OPENEXR_IMF_NAMESPACE;
2626
using namespace IMATH_NAMESPACE;
2727
using namespace std;

src/bin/exrcheck/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// SPDX-License-Identifier: BSD-3-Clause
22
// Copyright (c) Contributors to the OpenEXR Project.
33

4-
#include <ImathConfig.h>
5-
#include <ImfCheckFile.h>
6-
#include <ImfMisc.h>
7-
#include <OpenEXRConfig.h>
4+
#include "ImathConfig.h"
5+
#include "ImfCheckFile.h"
6+
#include "ImfMisc.h"
7+
#include "OpenEXRConfig.h"
88

99
#include <cstdint>
1010
#include <fstream>

src/bin/exrenvmap/EnvmapImage.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
#include "namespaceAlias.h"
1616

1717
#include <ImathBox.h>
18-
#include <ImfArray.h>
19-
#include <ImfEnvmap.h>
20-
#include <ImfRgba.h>
18+
#include "ImfArray.h"
19+
#include "ImfEnvmap.h"
20+
#include "ImfRgba.h"
2121

2222
class EnvmapImage
2323
{

src/bin/exrenvmap/blurImage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <algorithm>
1818
#include <cstring>
1919
#include <iostream>
20-
#include <resizeImage.h>
20+
#include "resizeImage.h"
2121
#include <string.h>
2222

2323
using namespace IMF;

src/bin/exrenvmap/blurImage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
//
1919
//-----------------------------------------------------------------------------
2020

21-
#include <readInputImage.h>
21+
#include "readInputImage.h"
2222

2323
void blurImage (EnvmapImage& image, bool verbose);
2424

src/bin/exrenvmap/main.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
//
1010
//-----------------------------------------------------------------------------
1111

12-
#include <EnvmapImage.h>
13-
#include <ImfEnvmap.h>
14-
#include <ImfHeader.h>
15-
#include <ImfMisc.h>
16-
#include <OpenEXRConfig.h>
17-
18-
#include <blurImage.h>
19-
#include <makeCubeMap.h>
20-
#include <makeLatLongMap.h>
12+
#include "EnvmapImage.h"
13+
#include "ImfEnvmap.h"
14+
#include "ImfHeader.h"
15+
#include "ImfMisc.h"
16+
#include "OpenEXRConfig.h"
17+
18+
#include "blurImage.h"
19+
#include "makeCubeMap.h"
20+
#include "makeLatLongMap.h"
2121

2222
#include <stdexcept>
2323
#include <iostream>

src/bin/exrenvmap/makeCubeMap.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
//
1010
//-----------------------------------------------------------------------------
1111

12-
#include <makeCubeMap.h>
12+
#include "makeCubeMap.h"
1313

1414
#include "Iex.h"
15-
#include <ImfRgbaFile.h>
16-
#include <ImfStandardAttributes.h>
17-
#include <ImfTiledRgbaFile.h>
15+
#include "ImfRgbaFile.h"
16+
#include "ImfStandardAttributes.h"
17+
#include "ImfTiledRgbaFile.h"
1818
#include <algorithm>
1919
#include <iostream>
20-
#include <resizeImage.h>
20+
#include "resizeImage.h"
2121
#include <string.h>
2222
#include <string>
2323

0 commit comments

Comments
 (0)