Skip to content

Commit da1c8d3

Browse files
authored
Hide most of non-public symbols by default (#984)
* Export YAML::detail::node::m_amount The internal header node/detail/node.h is included by public headers; YAML::detail::node is implemented in the header itself, and thus it gets inlined... except for its static m_amount class member, which is instantiated in the library only. Right now all the symbols of yaml-cpp are exported (nothing is hidden), so the linker will find node::m_amount in the yaml-cpp library. As solution/workaround, explicitly export YAML::detail::node::m_amount. * CMake: use GenerateExportHeader Make use of the GenerateExportHeader CMake module to generate the dll.h header with export macros. While the produced dll.h is different, the result should be the same, i.e. nothing changes for yaml-cpp or its users. * CMake: hide all the symbols by default Hide all the symbols that are not explicitly exported with YAML_CPP_API. This way the ABI will be way smaller, and only actually exposing the public classes/functions.
1 parent 6308112 commit da1c8d3

File tree

3 files changed

+16
-34
lines changed

3 files changed

+16
-34
lines changed

CMakeLists.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ include(CMakeDependentOption)
1414
include(CheckCXXCompilerFlag)
1515
include(GNUInstallDirs)
1616
include(CTest)
17+
include(GenerateExportHeader)
18+
19+
set(CMAKE_C_VISIBILITY_PRESET hidden)
20+
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
21+
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
1722

1823
find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format)
1924

@@ -81,6 +86,7 @@ set_property(TARGET yaml-cpp
8186
target_include_directories(yaml-cpp
8287
PUBLIC
8388
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
89+
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
8490
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
8591
PRIVATE
8692
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
@@ -136,6 +142,12 @@ write_basic_package_version_file(
136142
"${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
137143
COMPATIBILITY AnyNewerVersion)
138144

145+
generate_export_header(yaml-cpp
146+
BASE_NAME YAML_CPP
147+
EXPORT_FILE_NAME "${PROJECT_BINARY_DIR}/include/yaml-cpp/dll.h"
148+
EXPORT_MACRO_NAME YAML_CPP_API
149+
)
150+
139151
configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY)
140152

141153
if (YAML_CPP_INSTALL)
@@ -145,6 +157,9 @@ if (YAML_CPP_INSTALL)
145157
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
146158
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
147159
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
160+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
161+
FILES_MATCHING PATTERN "*.h")
162+
install(DIRECTORY ${PROJECT_BINARY_DIR}/include/
148163
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
149164
FILES_MATCHING PATTERN "*.h")
150165
install(EXPORT yaml-cpp-targets

include/yaml-cpp/dll.h

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/node_data.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
namespace YAML {
1515
namespace detail {
16-
std::atomic<size_t> node::m_amount{0};
16+
YAML_CPP_API std::atomic<size_t> node::m_amount{0};
1717

1818
const std::string& node_data::empty_scalar() {
1919
static const std::string svalue;

0 commit comments

Comments
 (0)