| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- # file LICENSE.rst or https://cmake.org/licensing for details.
- #[=======================================================================[.rst:
- GenerateExportHeader
- --------------------
- This module provides commands for generating a header file containing
- preprocessor macro definitions to control C/C++ symbol visibility.
- Load this module in CMake project with:
- .. code-block:: cmake
- include(GenerateExportHeader)
- .. versionadded:: 3.12
- Support for C projects. Previous versions supported C++ projects only.
- When developing C or C++ projects, especially for cross-platform use, symbol
- visibility determines which functions, classes, global variables, templates,
- and other symbols are made visible to users of the library.
- For example, on Windows, symbols must be explicitly marked with
- ``__declspec(dllexport)`` when building a shared library, and
- ``__declspec(dllimport)`` when using it. Other platforms may use attributes
- like ``__attribute__((visibility("default")))``.
- This module simplifies the creation and usage of preprocessor macros to
- manage these requirements, avoiding repetitive and error-prone ``#ifdef``
- blocks in source code.
- Some symbol visibility can also be controlled with compiler options. In
- CMake, target properties such as :prop_tgt:`<LANG>_VISIBILITY_PRESET` and
- :prop_tgt:`VISIBILITY_INLINES_HIDDEN` enable compiler visibility flags,
- where appropriate. See also related convenience variables
- :variable:`CMAKE_<LANG>_VISIBILITY_PRESET` and
- :variable:`CMAKE_VISIBILITY_INLINES_HIDDEN` to enable it for all targets in
- current scope. These are commonly used in combination with this module to
- further simplify C/C++ code, removing the need for some of the preprocessor
- macros in the source code.
- Commands
- ^^^^^^^^
- This module provides the following commands:
- Generating Export Header
- """"""""""""""""""""""""
- .. command:: generate_export_header
- Generates a header file suitable for inclusion in source code, containing
- preprocessor *export* macros for controlling the visibility of symbols:
- .. code-block:: cmake
- generate_export_header(
- <target>
- [BASE_NAME <base-name>]
- [EXPORT_FILE_NAME <export-file-name>]
- [EXPORT_MACRO_NAME <export-macro-name>]
- [NO_EXPORT_MACRO_NAME <no-export-macro-name>]
- [DEPRECATED_MACRO_NAME <deprecated-macro-name>]
- [DEFINE_NO_DEPRECATED]
- [NO_DEPRECATED_MACRO_NAME <no-deprecated-macro-name>]
- [STATIC_DEFINE <static-define>]
- [PREFIX_NAME <prefix>]
- [CUSTOM_CONTENT_FROM_VARIABLE <variable>]
- [INCLUDE_GUARD_NAME <include-guard-name>]
- )
- By default, this command generates a header file named
- ``<target-name-lowercase>_export.h`` in the current binary directory
- (:variable:`CMAKE_CURRENT_BINARY_DIR`). This header defines a set of
- preprocessor macros used to mark API symbols as exported, hidden, or
- deprecated across different platforms and build types (e.g., static or
- shared builds), and is intended to be installed along with the library's
- public headers, because it affects public API declarations:
- * ``<MACRO>_EXPORT``: Marks symbols for export or import, making them
- visible as part of the public API when building or consuming a shared
- library.
- * ``<MACRO>_NO_EXPORT``: Marks symbols that should not be exported.
- If the :prop_tgt:`<LANG>_VISIBILITY_PRESET` target property is set to
- ``hidden``, using this macro in source code is typically redundant.
- * ``<MACRO>_DEPRECATED``: Marks symbols as deprecated. When such symbols
- are used, the compiler emits a warning at compile-time.
- * ``<MACRO>_DEPRECATED_EXPORT``: Combines export/import and deprecation
- markers for a symbol that is both part of the public API and deprecated.
- * ``<MACRO>_DEPRECATED_NO_EXPORT``: Marks a deprecated symbol that should
- not be exported (internal and deprecated).
- * ``<MACRO>_NO_DEPRECATED``: A macro that can be used in source code to
- conditionally exclude deprecated code parts from the build via
- preprocessor logic.
- The ``<MACRO>`` part is derived by default from the uppercase name of the
- target or the explicitly provided ``<base-name>``. All macro names can be
- customized using the optional arguments.
- .. rubric:: The arguments are:
- ``<target>``
- Name of a target for which the export header will be generated.
- Supported target types:
- * ``STATIC`` library (in this case, export-related macros are defined
- without values)
- * ``SHARED`` library
- * ``MODULE`` library
- * .. versionadded:: 3.1
- ``OBJECT`` library
- ``BASE_NAME <base-name>``
- If specified, it overrides the default file name and macro names.
- ``EXPORT_FILE_NAME <export-file-name>``
- If specified, it overrides the full path and the name of the generated
- export header file (``<base-name-lowercase>_export.h``) to
- ``<export-file-name>``. If given as a relative path, it will be
- interpreted relative to the current binary directory
- (:variable:`CMAKE_CURRENT_BINARY_DIR`).
- ``EXPORT_MACRO_NAME <export-macro-name>``
- If specified, it overrides the default macro name for the export
- directive.
- ``NO_EXPORT_MACRO_NAME <no-export-macro-name>``
- If specified, the ``<no-export-macro-name>`` will be used for the macro
- name that designates the attribute for items that shouldn't be exported.
- ``DEPRECATED_MACRO_NAME <deprecated-macro-name>``
- If specified, the following names will be used:
- * ``<deprecated-macro-name>`` (macro for marking deprecated symbols)
- * ``<deprecated-macro-name>_EXPORT`` (macro for deprecated symbols with
- export markers)
- * ``<deprecated-macro-name>_NO_EXPORT`` (macro for deprecated symbols
- with no-export markers)
- instead of the default names in format of
- ``<MACRO>_DEPRECATED{,_EXPORT,_NO_EXPORT}``.
- ``DEFINE_NO_DEPRECATED``
- If specified, this will define a macro named ``<MACRO>_NO_DEPRECATED``.
- ``NO_DEPRECATED_MACRO_NAME <no-deprecated-macro-name>``
- Used in combination with ``DEFINE_NO_DEPRECATED`` option. If specified,
- then a macro named ``<no-deprecated-macro-name>`` is used instead of the
- default ``<MACRO>_NO_DEPRECATED``.
- ``STATIC_DEFINE <static-define>``
- If specified, the ``<static-define>`` macro name will be used instead
- of the default ``<MACRO>_STATIC_DEFINE``. This macro controls the
- symbol export behavior in the generated header for static libraries.
- It is typically used when building both shared and static variants of a
- library from the same sources using a single generated export header.
- When this macro is defined for static library, the export-related macros
- will expand to nothing. This is important also on Windows, where symbol
- decoration is required only for shared libraries, not for static ones.
- ``PREFIX_NAME <prefix>``
- If specified, the additional ``<prefix>`` is prepended to all generated
- macro names.
- ``CUSTOM_CONTENT_FROM_VARIABLE <variable>``
- .. versionadded:: 3.7
- If specified, the content from the ``<variable>`` value is appended to
- the generated header file content after the preprocessor macros
- definitions.
- ``INCLUDE_GUARD_NAME <include-guard-name>``
- .. versionadded:: 3.11
- If specified, the ``<include-guard-name>`` is used as the preprocessor
- macro name to guard multiple inclusions of the generated header instead
- of the default name ``<export-macro-name>_H``.
- .. code-block:: c++
- :caption: ``<base-name-lowercase>_export.h``
- #ifndef <include-guard-name>
- #define <include-guard-name>
- // ...
- #endif /* <include-guard-name> */
- Deprecated Command
- """"""""""""""""""
- .. command:: add_compiler_export_flags
- .. deprecated:: 3.0
- Set the target properties
- :prop_tgt:`CXX_VISIBILITY_PRESET <<LANG>_VISIBILITY_PRESET>` and
- :prop_tgt:`VISIBILITY_INLINES_HIDDEN` instead.
- Adds C++ compiler options ``-fvisibility=hidden`` (and
- ``-fvisibility-inlines-hidden``, if supported) to hide all symbols by
- default to either :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>`
- variable or to a specified variable:
- .. code-block:: cmake
- add_compiler_export_flags([<output_variable>])
- This command is a no-op on Windows which does not need extra compiler flags
- for exporting support.
- ``<output-variable>``
- Optional variable name that will be populated with a string of
- space-separated C++ compile options required to enable visibility
- support for the compiler/architecture in use. If this argument is
- specified, the :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` variable
- will not be modified.
- Examples
- ^^^^^^^^
- Example: Generating Export Header
- """""""""""""""""""""""""""""""""
- The following example demonstrates how to use this module to generate an
- export header in the current binary directory (``example_export.h``) and use
- it in a C++ library named ``example`` to control symbols visibility. The
- generated header defines the preprocessor macros ``EXAMPLE_EXPORT``,
- ``EXAMPLE_NO_EXPORT``, ``EXAMPLE_DEPRECATED``, ``EXAMPLE_DEPRECATED_EXPORT``,
- and ``EXAMPLE_DEPRECATED_NO_EXPORT``, and is installed along with the
- library's other public headers:
- .. code-block:: cmake
- :caption: ``CMakeLists.txt``
- :emphasize-lines: 10,11
- cmake_minimum_required(VERSION 3.24)
- project(GenerateExportHeaderExample)
- # Set default visibility of all symbols to hidden
- set(CMAKE_CXX_VISIBILITY_PRESET "hidden")
- set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
- add_library(example)
- include(GenerateExportHeader)
- generate_export_header(example)
- target_sources(
- example
- PRIVATE example.cxx
- PUBLIC
- FILE_SET HEADERS
- FILES example.h
- FILE_SET generated_headers
- TYPE HEADERS
- BASE_DIRS $<TARGET_PROPERTY:example,BINARY_DIR>
- FILES ${CMAKE_CURRENT_BINARY_DIR}/example_export.h
- )
- target_include_directories(example PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- install(
- TARGETS example
- FILE_SET HEADERS
- FILE_SET generated_headers
- )
- And in the ABI header files:
- .. code-block:: c++
- :caption: ``example.h``
- #include "example_export.h"
- // This class is part of the public API and is exported
- class EXAMPLE_EXPORT SomeClass
- {
- public:
- SomeClass();
- void doSomething();
- // This method is deprecated
- EXAMPLE_DEPRECATED void legacyMethod();
- };
- // This function is exported and deprecated
- EXAMPLE_DEPRECATED_EXPORT void legacyPublicFunction();
- // This function is deprecated but not exported
- EXAMPLE_DEPRECATED void legacyInternalFunction();
- .. code-block:: c++
- :caption: ``example.cxx``
- #include <iostream>
- #include "example.h"
- SomeClass::SomeClass() = default;
- void SomeClass::doSomething()
- {
- std::cout << "SomeClass::doSomething() called" << std::endl;
- }
- void SomeClass::legacyMethod()
- {
- std::cout << "SomeClass::legacyMethod() is deprecated" << std::endl;
- }
- void legacyPublicFunction()
- {
- std::cout << "legacyPublicFunction() is deprecated" << std::endl;
- }
- void internalLegacyFunction()
- {
- std::cout << "legacyInternalFunction() is deprecated" << std::endl;
- }
- Examples: Customizing Generated Header
- """"""""""""""""""""""""""""""""""""""
- The ``BASE_NAME`` argument can be used to override the generated file name
- and the names used for the macros. The following will generate a file
- named ``other_name_export.h`` containing export-related macros such as
- ``OTHER_NAME_EXPORT``, ``OTHER_NAME_NO_EXPORT``, ``OTHER_NAME_DEPRECATED``,
- etc.
- .. code-block:: cmake
- add_library(example example.cxx)
- include(GenerateExportHeader)
- generate_export_header(example BASE_NAME "other_name")
- The ``BASE_NAME`` may be overridden by specifying other command options.
- For example, the following creates a macro ``OTHER_NAME_EXPORT`` instead of
- ``EXAMPLE_EXPORT``, but other macros and the generated header file name are
- set to their default values:
- .. code-block:: cmake
- add_library(example example.cxx)
- include(GenerateExportHeader)
- generate_export_header(example EXPORT_MACRO_NAME "OTHER_NAME_EXPORT")
- The following example creates ``KDE_DEPRECATED`` macro instead of
- default ``EXAMPLE_DEPRECATED``:
- .. code-block:: cmake
- add_library(example example.cxx)
- include(GenerateExportHeader)
- generate_export_header(example DEPRECATED_MACRO_NAME "KDE_DEPRECATED")
- The ``DEFINE_NO_DEPRECATED`` option can be used to define a macro which can
- be used to remove deprecated code from preprocessor output:
- .. code-block:: cmake
- option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library")
- if(EXCLUDE_DEPRECATED)
- set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED)
- endif()
- include(GenerateExportHeader)
- generate_export_header(example ${NO_BUILD_DEPRECATED})
- .. code-block:: c++
- :caption: ``example.h``
- class EXAMPLE_EXPORT SomeClass
- {
- public:
- #ifndef EXAMPLE_NO_DEPRECATED
- EXAMPLE_DEPRECATED void legacyMethod();
- #endif
- };
- .. code-block:: c++
- :caption: ``example.cxx``
- #ifndef EXAMPLE_NO_DEPRECATED
- void SomeClass::legacyMethod() { }
- #endif
- The ``PREFIX_NAME`` argument can be used to prepend all generated macro names
- with some prefix. For example, the following will generate macros such as
- ``VTK_SOMELIB_EXPORT``, etc.
- .. code-block:: cmake
- include(GenerateExportHeader)
- generate_export_header(somelib PREFIX_NAME "VTK_")
- Appending additional content to generated header can be done with the
- ``CUSTOM_CONTENT_FROM_VARIABLE`` argument:
- .. code-block:: cmake
- include(GenerateExportHeader)
- set(content [[#include "project_api.h"]])
- generate_export_header(example CUSTOM_CONTENT_FROM_VARIABLE content)
- Example: Building Shared and Static Library
- """""""""""""""""""""""""""""""""""""""""""
- In the following example both a shared and a static library are built from
- the same sources, and the ``<MACRO>_STATIC_DEFINE`` macro compile definition
- is defined to ensure the same generated export header works for both:
- .. code-block:: cmake
- add_library(example_shared SHARED example.cxx)
- add_library(example_static STATIC example.cxx)
- include(GenerateExportHeader)
- generate_export_header(example_shared BASE_NAME "example")
- # Define macro to disable export attributes for static build
- target_compile_definitions(example_static PRIVATE EXAMPLE_STATIC_DEFINE)
- Example: Upgrading Deprecated Command
- """""""""""""""""""""""""""""""""""""
- In earlier versions of CMake, ``add_compiler_export_flags()`` command was
- used to add symbol visibility compile options:
- .. code-block:: cmake
- :caption: ``CMakeLists.txt``
- add_library(example example.cxx)
- include(GenerateExportHeader)
- add_compiler_export_flags(flags)
- string(REPLACE " " ";" flags "${flags}")
- set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS "${flags}")
- generate_export_header(example)
- In new code, the following target properties are used to achieve the same
- functionality:
- .. code-block:: cmake
- :caption: ``CMakeLists.txt``
- add_library(example example.cxx)
- include(GenerateExportHeader)
- set_target_properties(
- example
- PROPERTIES
- CXX_VISIBILITY_PRESET hidden
- VISIBILITY_INLINES_HIDDEN TRUE
- )
- generate_export_header(example)
- See Also
- ^^^^^^^^
- * The :prop_tgt:`DEFINE_SYMBOL` target property to customize the preprocessor
- macro name used by the generated header. This macro determines whether
- the library header is being included during the library's own compilation
- or when it is used by another project (e.g., after installation).
- * The :prop_tgt:`ENABLE_EXPORTS` target property.
- * The :prop_tgt:`WINDOWS_EXPORT_ALL_SYMBOLS` target property.
- #]=======================================================================]
- include(CheckCompilerFlag)
- include(CheckSourceCompiles)
- # TODO: Install this macro separately?
- macro(_check_cxx_compiler_attribute _ATTRIBUTE _RESULT)
- check_source_compiles(CXX "${_ATTRIBUTE} int somefunc() { return 0; }
- int main() { return somefunc();}" ${_RESULT}
- )
- endmacro()
- # TODO: Install this macro separately?
- macro(_check_c_compiler_attribute _ATTRIBUTE _RESULT)
- check_source_compiles(C "${_ATTRIBUTE} int somefunc(void) { return 0; }
- int main(void) { return somefunc();}" ${_RESULT}
- )
- endmacro()
- macro(_test_compiler_hidden_visibility)
- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
- AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.2")
- set(GCC_TOO_OLD TRUE)
- elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU"
- AND CMAKE_C_COMPILER_VERSION VERSION_LESS "4.2")
- set(GCC_TOO_OLD TRUE)
- elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "12.0")
- set(_INTEL_TOO_OLD TRUE)
- endif()
- # Exclude XL here because it misinterprets -fvisibility=hidden even though
- # the check_compiler_flag passes
- if(NOT GCC_TOO_OLD
- AND NOT _INTEL_TOO_OLD
- AND NOT WIN32
- AND NOT CYGWIN
- AND NOT CMAKE_CXX_COMPILER_ID MATCHES "^(IBMClang|XLClang|XL)$"
- AND NOT CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$"
- AND NOT CMAKE_CXX_COMPILER_ID MATCHES Watcom)
- if (CMAKE_CXX_COMPILER_LOADED)
- check_compiler_flag(CXX -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
- check_compiler_flag(CXX -fvisibility-inlines-hidden
- COMPILER_HAS_HIDDEN_INLINE_VISIBILITY)
- else()
- check_compiler_flag(C -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
- check_compiler_flag(C -fvisibility-inlines-hidden
- COMPILER_HAS_HIDDEN_INLINE_VISIBILITY)
- endif()
- endif()
- endmacro()
- macro(_test_compiler_has_deprecated)
- # NOTE: Some Embarcadero compilers silently compile __declspec(deprecated)
- # without error, but this is not a documented feature and the attribute does
- # not actually generate any warnings.
- if(CMAKE_CXX_COMPILER_ID MATCHES Borland
- OR CMAKE_CXX_COMPILER_ID MATCHES Embarcadero
- OR CMAKE_CXX_COMPILER_ID MATCHES HP
- OR GCC_TOO_OLD
- OR CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$"
- OR CMAKE_CXX_COMPILER_ID MATCHES Watcom)
- set(COMPILER_HAS_DEPRECATED "" CACHE INTERNAL
- "Compiler support for a deprecated attribute")
- else()
- if (CMAKE_CXX_COMPILER_LOADED)
- _check_cxx_compiler_attribute("__attribute__((__deprecated__))"
- COMPILER_HAS_DEPRECATED_ATTR)
- if(COMPILER_HAS_DEPRECATED_ATTR)
- set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}"
- CACHE INTERNAL "Compiler support for a deprecated attribute")
- else()
- _check_cxx_compiler_attribute("__declspec(deprecated)"
- COMPILER_HAS_DEPRECATED)
- endif()
- else()
- _check_c_compiler_attribute("__attribute__((__deprecated__))"
- COMPILER_HAS_DEPRECATED_ATTR)
- if(COMPILER_HAS_DEPRECATED_ATTR)
- set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED_ATTR}"
- CACHE INTERNAL "Compiler support for a deprecated attribute")
- else()
- _check_c_compiler_attribute("__declspec(deprecated)"
- COMPILER_HAS_DEPRECATED)
- endif()
- endif()
- endif()
- endmacro()
- get_filename_component(_GENERATE_EXPORT_HEADER_MODULE_DIR
- "${CMAKE_CURRENT_LIST_FILE}" PATH)
- macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY)
- set(DEFINE_DEPRECATED)
- set(DEFINE_EXPORT)
- set(DEFINE_IMPORT)
- set(DEFINE_NO_EXPORT)
- if (COMPILER_HAS_DEPRECATED_ATTR AND NOT WIN32)
- set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))")
- elseif(COMPILER_HAS_DEPRECATED)
- set(DEFINE_DEPRECATED "__declspec(deprecated)")
- endif()
- get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE)
- if(NOT ${type} STREQUAL "STATIC_LIBRARY")
- if(WIN32 OR CYGWIN)
- set(DEFINE_EXPORT "__declspec(dllexport)")
- set(DEFINE_IMPORT "__declspec(dllimport)")
- elseif(COMPILER_HAS_HIDDEN_VISIBILITY)
- set(DEFINE_EXPORT "__attribute__((visibility(\"default\")))")
- set(DEFINE_IMPORT "__attribute__((visibility(\"default\")))")
- set(DEFINE_NO_EXPORT "__attribute__((visibility(\"hidden\")))")
- endif()
- endif()
- endmacro()
- macro(_DO_GENERATE_EXPORT_HEADER TARGET_LIBRARY)
- # Option overrides
- set(options DEFINE_NO_DEPRECATED)
- set(oneValueArgs PREFIX_NAME BASE_NAME EXPORT_MACRO_NAME EXPORT_FILE_NAME
- DEPRECATED_MACRO_NAME NO_EXPORT_MACRO_NAME STATIC_DEFINE
- NO_DEPRECATED_MACRO_NAME CUSTOM_CONTENT_FROM_VARIABLE INCLUDE_GUARD_NAME)
- set(multiValueArgs)
- cmake_parse_arguments(_GEH "${options}" "${oneValueArgs}" "${multiValueArgs}"
- ${ARGN})
- set(BASE_NAME "${TARGET_LIBRARY}")
- if(_GEH_BASE_NAME)
- set(BASE_NAME ${_GEH_BASE_NAME})
- endif()
- string(TOUPPER ${BASE_NAME} BASE_NAME_UPPER)
- string(TOLOWER ${BASE_NAME} BASE_NAME_LOWER)
- # Default options
- set(EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_EXPORT")
- set(NO_EXPORT_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_EXPORT")
- set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME_LOWER}_export.h")
- set(DEPRECATED_MACRO_NAME "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_DEPRECATED")
- set(STATIC_DEFINE "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_STATIC_DEFINE")
- set(NO_DEPRECATED_MACRO_NAME
- "${_GEH_PREFIX_NAME}${BASE_NAME_UPPER}_NO_DEPRECATED")
- if(_GEH_UNPARSED_ARGUMENTS)
- message(FATAL_ERROR "Unknown keywords given to generate_export_header(): \"${_GEH_UNPARSED_ARGUMENTS}\"")
- endif()
- if(_GEH_EXPORT_MACRO_NAME)
- set(EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_EXPORT_MACRO_NAME})
- endif()
- string(MAKE_C_IDENTIFIER ${EXPORT_MACRO_NAME} EXPORT_MACRO_NAME)
- if(_GEH_EXPORT_FILE_NAME)
- if(IS_ABSOLUTE ${_GEH_EXPORT_FILE_NAME})
- set(EXPORT_FILE_NAME ${_GEH_EXPORT_FILE_NAME})
- else()
- set(EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${_GEH_EXPORT_FILE_NAME}")
- endif()
- endif()
- if(_GEH_DEPRECATED_MACRO_NAME)
- set(DEPRECATED_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_DEPRECATED_MACRO_NAME})
- endif()
- string(MAKE_C_IDENTIFIER ${DEPRECATED_MACRO_NAME} DEPRECATED_MACRO_NAME)
- if(_GEH_NO_EXPORT_MACRO_NAME)
- set(NO_EXPORT_MACRO_NAME ${_GEH_PREFIX_NAME}${_GEH_NO_EXPORT_MACRO_NAME})
- endif()
- string(MAKE_C_IDENTIFIER ${NO_EXPORT_MACRO_NAME} NO_EXPORT_MACRO_NAME)
- if(_GEH_STATIC_DEFINE)
- set(STATIC_DEFINE ${_GEH_PREFIX_NAME}${_GEH_STATIC_DEFINE})
- endif()
- string(MAKE_C_IDENTIFIER ${STATIC_DEFINE} STATIC_DEFINE)
- if(_GEH_DEFINE_NO_DEPRECATED)
- set(DEFINE_NO_DEPRECATED 1)
- else()
- set(DEFINE_NO_DEPRECATED 0)
- endif()
- if(_GEH_NO_DEPRECATED_MACRO_NAME)
- set(NO_DEPRECATED_MACRO_NAME
- ${_GEH_PREFIX_NAME}${_GEH_NO_DEPRECATED_MACRO_NAME})
- endif()
- string(MAKE_C_IDENTIFIER ${NO_DEPRECATED_MACRO_NAME} NO_DEPRECATED_MACRO_NAME)
- if(_GEH_INCLUDE_GUARD_NAME)
- set(INCLUDE_GUARD_NAME ${_GEH_INCLUDE_GUARD_NAME})
- else()
- set(INCLUDE_GUARD_NAME "${EXPORT_MACRO_NAME}_H")
- endif()
- get_target_property(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY} DEFINE_SYMBOL)
- if(NOT EXPORT_IMPORT_CONDITION)
- set(EXPORT_IMPORT_CONDITION ${TARGET_LIBRARY}_EXPORTS)
- endif()
- string(MAKE_C_IDENTIFIER ${EXPORT_IMPORT_CONDITION} EXPORT_IMPORT_CONDITION)
- if(_GEH_CUSTOM_CONTENT_FROM_VARIABLE)
- if(DEFINED "${_GEH_CUSTOM_CONTENT_FROM_VARIABLE}")
- set(CUSTOM_CONTENT "${${_GEH_CUSTOM_CONTENT_FROM_VARIABLE}}")
- else()
- set(CUSTOM_CONTENT "")
- endif()
- endif()
- configure_file("${_GENERATE_EXPORT_HEADER_MODULE_DIR}/exportheader.cmake.in"
- "${EXPORT_FILE_NAME}" @ONLY)
- endmacro()
- function(GENERATE_EXPORT_HEADER TARGET_LIBRARY)
- get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE)
- if(NOT ${type} STREQUAL "STATIC_LIBRARY"
- AND NOT ${type} STREQUAL "SHARED_LIBRARY"
- AND NOT ${type} STREQUAL "OBJECT_LIBRARY"
- AND NOT ${type} STREQUAL "MODULE_LIBRARY")
- message(WARNING "This macro can only be used with libraries")
- return()
- endif()
- _test_compiler_hidden_visibility()
- _test_compiler_has_deprecated()
- _do_set_macro_values(${TARGET_LIBRARY})
- _do_generate_export_header(${TARGET_LIBRARY} ${ARGN})
- endfunction()
- function(add_compiler_export_flags)
- if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.12)
- message(DEPRECATION "The add_compiler_export_flags function is obsolete. Use the CXX_VISIBILITY_PRESET and VISIBILITY_INLINES_HIDDEN target properties instead.")
- endif()
- _test_compiler_hidden_visibility()
- _test_compiler_has_deprecated()
- option(USE_COMPILER_HIDDEN_VISIBILITY
- "Use HIDDEN visibility support if available." ON)
- mark_as_advanced(USE_COMPILER_HIDDEN_VISIBILITY)
- if(NOT (USE_COMPILER_HIDDEN_VISIBILITY AND COMPILER_HAS_HIDDEN_VISIBILITY))
- # Just return if there are no flags to add.
- return()
- endif()
- set (EXTRA_FLAGS "-fvisibility=hidden")
- if(COMPILER_HAS_HIDDEN_INLINE_VISIBILITY)
- set (EXTRA_FLAGS "${EXTRA_FLAGS} -fvisibility-inlines-hidden")
- endif()
- # Either return the extra flags needed in the supplied argument, or to the
- # CMAKE_CXX_FLAGS if no argument is supplied.
- if(ARGC GREATER 0)
- set(${ARGV0} "${EXTRA_FLAGS}" PARENT_SCOPE)
- else()
- string(APPEND CMAKE_CXX_FLAGS " ${EXTRA_FLAGS}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
- endif()
- endfunction()
- # FIXME(#24994): The following module(s) are included only for compatibility
- # with projects that accidentally relied on them with CMake 3.26 and below.
- include(CheckCCompilerFlag)
- include(CheckCXXCompilerFlag)
|