Skip to content

Commit 6d19304

Browse files
authored
Add option to compile c++ libraries with an embedded core library (#2216)
* Add option to compile c++ libraries with an embedded core library Can configure with cmake -DOPENEXR_FORCE_EMBEDDED_CORE=ON This will force symbols to be hidden in the Core library such that when linked into the c++ shared library or other binary, they will be hidden (as if there is no core library). This should not be the default config but is supported for creating custom versions of exr. Signed-off-by: Kimball Thurston <kdt3rd@gmail.com> * Fix bazel build Signed-off-by: Kimball Thurston <kdt3rd@gmail.com> --------- Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
1 parent 3b89eb7 commit 6d19304

File tree

6 files changed

+37
-7
lines changed

6 files changed

+37
-7
lines changed

BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ expand_template(
6262
"@OPENEXR_VERSION_MINOR@": "4",
6363
"@OPENEXR_VERSION_PATCH@": "0",
6464
"#cmakedefine OPENEXR_ENABLE_API_VISIBILITY": "#define OPENEXR_ENABLE_API_VISIBILITY",
65+
"#cmakedefine OPENEXR_CORE_FUNCTIONS_EMBEDDED": "/* #undef OPENEXR_CORE_FUNCTIONS_EMBEDDED */",
6566
"#cmakedefine OPENEXR_HAVE_LARGE_STACK 1": "/* #undef OPENEXR_HAVE_LARGE_STACK */",
6667
},
6768
template = "cmake/OpenEXRConfig.h.in",

cmake/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ if (OPENEXR_USE_DEFAULT_VISIBILITY)
6363
else()
6464
set(OPENEXR_ENABLE_API_VISIBILITY ON)
6565
endif()
66+
if (OPENEXR_FORCE_EMBEDDED_CORE)
67+
set(OPENEXR_CORE_FUNCTIONS_EMBEDDED ON)
68+
else()
69+
set(OPENEXR_CORE_FUNCTIONS_EMBEDDED OFF)
70+
endif()
6671

6772
if (UNIX AND NOT APPLE AND NOT BEOS)
6873
find_library(OPENEXR_EXTRA_MATH_LIB m)

cmake/LibraryDefine.cmake

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# NB: This function has a number of Imath-specific names/variables
55
# in it, so be careful copying...
66
function(OPENEXR_DEFINE_LIBRARY libname)
7-
set(options)
7+
set(options EMBEDDED)
88
set(oneValueArgs PRIV_EXPORT CURDIR CURBINDIR)
99
set(multiValueArgs SOURCES HEADERS DEPENDENCIES PRIVATE_DEPS)
1010
cmake_parse_arguments(OPENEXR_CURLIB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -13,7 +13,12 @@ function(OPENEXR_DEFINE_LIBRARY libname)
1313
set(_openexr_extra_flags "$<$<COMPILE_LANGUAGE:CXX>:/EHsc>" "$<$<COMPILE_LANGUAGE:CXX>:/MP>")
1414
endif()
1515
set(objlib ${libname})
16-
add_library(${objlib}
16+
if(OPENEXR_CURLIB_EMBEDDED)
17+
set(libopts STATIC)
18+
else()
19+
set(libopts)
20+
endif()
21+
add_library(${objlib} ${libopts}
1722
${OPENEXR_CURLIB_HEADERS}
1823
${OPENEXR_CURLIB_SOURCES})
1924

@@ -24,7 +29,9 @@ function(OPENEXR_DEFINE_LIBRARY libname)
2429
PRIVATE cxx_std_${OPENEXR_CXX_STANDARD}
2530
INTERFACE cxx_std_17 )
2631

27-
if(OPENEXR_CURLIB_PRIV_EXPORT AND BUILD_SHARED_LIBS)
32+
if(OPENEXR_CURLIB_EMBEDDED)
33+
set(libopts)
34+
elseif(OPENEXR_CURLIB_PRIV_EXPORT AND BUILD_SHARED_LIBS)
2835
target_compile_definitions(${objlib} PRIVATE ${OPENEXR_CURLIB_PRIV_EXPORT})
2936
if(WIN32)
3037
target_compile_definitions(${objlib} PUBLIC OPENEXR_DLL)
@@ -46,7 +53,7 @@ function(OPENEXR_DEFINE_LIBRARY libname)
4653
CXX_EXTENSIONS OFF
4754
POSITION_INDEPENDENT_CODE ON
4855
)
49-
if (NOT OPENEXR_USE_DEFAULT_VISIBILITY)
56+
if (OPENEXR_CURLIB_EMBEDDED OR NOT OPENEXR_USE_DEFAULT_VISIBILITY)
5057
set_target_properties(${objlib} PROPERTIES
5158
C_VISIBILITY_PRESET hidden
5259
CXX_VISIBILITY_PRESET hidden
@@ -60,7 +67,7 @@ function(OPENEXR_DEFINE_LIBRARY libname)
6067
endif()
6168
set_property(TARGET ${objlib} PROPERTY PUBLIC_HEADER ${OPENEXR_CURLIB_HEADERS})
6269

63-
if(BUILD_SHARED_LIBS)
70+
if(BUILD_SHARED_LIBS AND NOT OPENEXR_CURLIB_EMBEDDED)
6471
set_target_properties(${libname} PROPERTIES
6572
SOVERSION ${OPENEXR_LIB_SOVERSION}
6673
VERSION ${OPENEXR_LIB_VERSION}
@@ -70,7 +77,6 @@ function(OPENEXR_DEFINE_LIBRARY libname)
7077
OUTPUT_NAME "${libname}${OPENEXR_LIB_SUFFIX}"
7178
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
7279
)
73-
add_library(${PROJECT_NAME}::${libname} ALIAS ${libname})
7480

7581
if(OPENEXR_INSTALL)
7682
install(TARGETS ${libname}
@@ -83,7 +89,9 @@ function(OPENEXR_DEFINE_LIBRARY libname)
8389
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${OPENEXR_OUTPUT_SUBDIR}
8490
)
8591
endif()
86-
if(BUILD_SHARED_LIBS AND (NOT "${OPENEXR_LIB_SUFFIX}" STREQUAL "") AND NOT WIN32)
92+
if(OPENEXR_CURLIB_EMBEDDED)
93+
set(libopts)
94+
elseif(BUILD_SHARED_LIBS AND (NOT "${OPENEXR_LIB_SUFFIX}" STREQUAL "") AND NOT WIN32)
8795
string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
8896
set(verlibname ${CMAKE_SHARED_LIBRARY_PREFIX}${libname}${OPENEXR_LIB_SUFFIX}${CMAKE_${uppercase_CMAKE_BUILD_TYPE}_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX})
8997
set(baselibname ${CMAKE_SHARED_LIBRARY_PREFIX}${libname}${CMAKE_${uppercase_CMAKE_BUILD_TYPE}_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX})
@@ -93,4 +101,6 @@ function(OPENEXR_DEFINE_LIBRARY libname)
93101
set(verlibname)
94102
set(baselibname)
95103
endif()
104+
105+
add_library(${PROJECT_NAME}::${libname} ALIAS ${libname})
96106
endfunction()

cmake/OpenEXRConfig.h.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
// tagged
9494
#cmakedefine OPENEXR_ENABLE_API_VISIBILITY
9595

96+
#cmakedefine OPENEXR_CORE_FUNCTIONS_EMBEDDED
97+
9698
/// \defgroup ExportMacros Macros to manage symbol visibility
9799
///
98100
/// See website/SymbolVisibility.rst for more discussion about the

src/lib/OpenEXRCore/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
# SPDX-License-Identifier: BSD-3-Clause
22
# Copyright Contributors to the OpenEXR Project.
33

4+
if (OPENEXR_FORCE_EMBEDDED_CORE)
5+
message(STATUS "Building Core library as an embedded library")
6+
set(coreopts EMBEDDED)
7+
endif()
8+
49
openexr_define_library(OpenEXRCore
10+
${coreopts}
511
PRIV_EXPORT OPENEXRCORE_EXPORTS
612
CURDIR ${CMAKE_CURRENT_SOURCE_DIR}
713
SOURCES

src/lib/OpenEXRCore/openexr_config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
/// \addtogroup ExportMacros
1515
/// @{
1616

17+
#if defined(OPENEXR_CORE_FUNCTIONS_EMBEDDED)
18+
# define EXR_EXPORT OPENEXR_HIDDEN
19+
#else
20+
1721
// are we making a DLL under windows (might be msvc or mingw or others)
1822
#if defined(OPENEXR_DLL)
1923

@@ -32,6 +36,8 @@
3236

3337
#endif
3438

39+
#endif
40+
3541
/*
3642
* MSVC does have printf format checks, but it is not in the form of a
3743
* function attribute, so just skip for non-GCC/clang builds

0 commit comments

Comments
 (0)