2021-06-11 19:24:52 +02:00
#.rst:
# Find Corrade
# ------------
#
# Finds the Corrade library. Basic usage::
#
# find_package(Corrade REQUIRED)
#
# This module tries to find the base Corrade library and then defines the
# following:
#
# Corrade_FOUND - Whether the base library was found
# CORRADE_LIB_SUFFIX_MODULE - Path to CorradeLibSuffix.cmake module
#
# This command will try to find only the base library, not the optional
# components, which are:
#
# Containers - Containers library
2023-08-31 11:52:52 +02:00
# Interconnect - Interconnect library
# Main - Main library
2021-06-11 19:24:52 +02:00
# PluginManager - PluginManager library
# TestSuite - TestSuite library
# Utility - Utility library
# rc - corrade-rc executable
#
# Example usage with specifying additional components is::
#
# find_package(Corrade REQUIRED Utility TestSuite)
#
# For each component is then defined:
#
# Corrade_*_FOUND - Whether the component was found
# Corrade::* - Component imported target
#
# The package is found if either debug or release version of each library is
# found. If both debug and release libraries are found, proper version is
# chosen based on actual build configuration of the project (i.e. Debug build
# is linked to debug libraries, Release build to release libraries).
#
# Corrade conditionally defines ``CORRADE_IS_DEBUG_BUILD`` preprocessor
# variable in case build configuration is ``Debug`` (not Corrade itself, but
# build configuration of the project using it). Useful e.g. for selecting
# proper plugin directory.
#
# Corrade defines the following custom target properties:
#
# CORRADE_CXX_STANDARD - C++ standard to require when compiling given
# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains
# particular standard setting flag or if given target contains
# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17.
# INTERFACE_CORRADE_CXX_STANDARD - C++ standard to require when using given
# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains
# particular standard setting flag or if given target contains
# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17.
# CORRADE_USE_PEDANTIC_FLAGS - Enable additional compiler/linker flags.
# Boolean.
#
# These properties are inherited from directory properties, meaning that if you
# set them on directories, they get implicitly set on all targets in given
# directory (with a possibility to do target-specific overrides). All Corrade
# libraries have the :prop_tgt:`INTERFACE_CORRADE_CXX_STANDARD` property set to
# 11, meaning that you will always have at least C++11 enabled once you link to
# any Corrade library.
#
# Features of found Corrade library are exposed in these variables:
#
2022-03-09 11:04:19 +01:00
# CORRADE_MSVC_COMPATIBILITY - Defined if compiled with compatibility
# mode for MSVC 2019+ without the /permissive- flag set
2021-06-11 19:24:52 +02:00
# CORRADE_MSVC2017_COMPATIBILITY - Defined if compiled with compatibility
# mode for MSVC 2017
# CORRADE_MSVC2015_COMPATIBILITY - Defined if compiled with compatibility
# mode for MSVC 2015
2023-08-31 11:52:52 +02:00
# CORRADE_BUILD_DEPRECATED - Defined if compiled with deprecated features
2021-06-11 19:24:52 +02:00
# included
# CORRADE_BUILD_STATIC - Defined if compiled as static libraries.
# Default are shared libraries.
# CORRADE_BUILD_STATIC_UNIQUE_GLOBALS - Defined if static libraries keep their
# globals unique even across different shared libraries. Enabled by default
# for static builds.
# CORRADE_BUILD_MULTITHREADED - Defined if compiled in a way that makes it
# possible to safely use certain Corrade features simultaneously in multiple
# threads
2023-08-31 11:52:52 +02:00
# CORRADE_BUILD_CPU_RUNTIME_DISPATCH - Defined if built with code paths
# optimized for multiple architectres with the best matching variant selected
# at runtime based on detected CPU features
2021-06-11 19:24:52 +02:00
# CORRADE_TARGET_UNIX - Defined if compiled for some Unix flavor
# (Linux, BSD, macOS)
# CORRADE_TARGET_APPLE - Defined if compiled for Apple platforms
# CORRADE_TARGET_IOS - Defined if compiled for iOS (device or
# simulator)
# CORRADE_TARGET_IOS_SIMULATOR - Defined if compiled for iOS Simulator
# CORRADE_TARGET_WINDOWS - Defined if compiled for Windows
# CORRADE_TARGET_WINDOWS_RT - Defined if compiled for Windows RT
# CORRADE_TARGET_EMSCRIPTEN - Defined if compiled for Emscripten
# CORRADE_TARGET_ANDROID - Defined if compiled for Android
# CORRADE_TARGET_GCC - Defined if compiling with GCC or GCC-
# compatible Clang
# CORRADE_TARGET_CLANG - Defined if compiling with Clang or any of its
# variants
# CORRADE_TARGET_APPLE_CLANG - Defined if compiling with Apple's Clang
# CORRADE_TARGET_CLANG_CL - Defined if compiling with Clang-CL (Clang
# with a MSVC frontend)
# CORRADE_TARGET_MSVC - Defined if compiling with MSVC or Clang with
# a MSVC frontend
# CORRADE_TARGET_MINGW - Defined if compiling under MinGW
2023-08-31 11:52:52 +02:00
# CORRADE_CPU_USE_IFUNC - Defined if GNU IFUNC is allowed to be used
# for runtime dispatch in the Cpu library
2021-06-11 19:24:52 +02:00
# CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT - Defined if PluginManager
# doesn't support dynamic plugin loading due to platform limitations
2022-03-09 11:04:19 +01:00
# CORRADE_TESTSUITE_TARGET_XCTEST - Defined if TestSuite is targeting Xcode
2021-06-11 19:24:52 +02:00
# XCTest
# CORRADE_UTILITY_USE_ANSI_COLORS - Defined if ANSI escape sequences are used
# for colored output with Utility::Debug on Windows
#
# Additionally these variables are defined for internal usage:
#
# CORRADE_INCLUDE_DIR - Root include dir
# CORRADE_*_LIBRARY_DEBUG - Debug version of given library, if found
# CORRADE_*_LIBRARY_RELEASE - Release version of given library, if found
# CORRADE_*_EXECUTABLE - Location of given executable, if found
# CORRADE_USE_MODULE - Path to UseCorrade.cmake module (included
# automatically)
# CORRADE_TESTSUITE_XCTEST_RUNNER - Path to XCTestRunner.mm.in file
# CORRADE_TESTSUITE_ADB_RUNNER - Path to AdbRunner.sh file
2024-04-07 15:50:49 +02:00
# CORRADE_UTILITY_JS - Path to CorradeUtility.js file
2021-06-11 19:24:52 +02:00
# CORRADE_PEDANTIC_COMPILER_OPTIONS - List of pedantic compiler options used
# for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` enabled
# CORRADE_PEDANTIC_COMPILER_DEFINITIONS - List of pedantic compiler
# definitions used for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS`
# enabled
# CORRADE_CXX{11,14,17,20}_STANDARD_FLAG - Compiler flag to use for targeting
# C++11, 14, 17 or 20 in cases where it's not possible to use
# :prop_tgt:`CORRADE_CXX_STANDARD`. Not defined if a standard switch is
# already present in :variable:`CMAKE_CXX_FLAGS`.
#
# Corrade provides these macros and functions:
#
# .. command:: corrade_add_test
#
# Add unit test using Corrade's TestSuite::
#
# corrade_add_test(<test name>
# <sources>...
# [LIBRARIES <libraries>...]
# [FILES <files>...]
# [ARGUMENTS <arguments>...])
#
# Test name is also executable name. You can use ``LIBRARIES`` to specify
# libraries to link with instead of using :command:`target_link_libraries()`.
# The ``Corrade::TestSuite`` target is linked automatically to each test. Note
# that the :command:`enable_testing()` function must be called explicitly.
# Arguments passed after ``ARGUMENTS`` will be appended to the test
# command line. ``ARGUMENTS`` are supported everywhere except when
# ``CORRADE_TESTSUITE_TARGET_XCTEST`` is enabled.
#
# You can list files needed by the test in the ``FILES`` section. If given
# filename is relative, it is treated relatively to `CMAKE_CURRENT_SOURCE_DIR`.
# The files are added to the :prop_test:`REQUIRED_FILES` target property. On
# Emscripten they are bundled to the executable and available in the virtual
# filesystem root. On Android they are copied along the executable to the
# target. In case of Emscripten and Android, if the file is absolute or
# contains ``..``, only the leaf name is used. Alternatively you can have a
# filename formatted as ``<input>@<output>``, in which case the ``<input>`` is
# treated as local filesystem location and ``<output>`` as remote/virtual
# filesystem location. The remote location can't be absolute or contain ``..``
# / ``@`` characters.
#
# Unless :variable:`CORRADE_TESTSUITE_TARGET_XCTEST` is set, test cases on iOS
# targets are created as bundles with bundle identifier set to CMake project
# name by default. Use the cache variable :variable:`CORRADE_TESTSUITE_BUNDLE_IDENTIFIER_PREFIX`
# to change it to something else.
#
# .. command:: corrade_add_resource
#
# Compile data resources into application binary::
#
# corrade_add_resource(<name> <resources.conf>)
#
# Depends on ``Corrade::rc``, which is part of Corrade utilities. This command
# generates resource data using given configuration file in current build
# directory. Argument name is name under which the resources can be explicitly
# loaded. Variable ``<name>`` contains compiled resource filename, which is
# then used for compiling library / executable. On CMake >= 3.1 the
# `resources.conf` file can contain UTF-8-encoded filenames. Example usage::
#
# corrade_add_resource(app_resources resources.conf)
# add_executable(app source1 source2 ... ${app_resources})
#
# .. command:: corrade_add_plugin
#
# Add dynamic plugin::
#
# corrade_add_plugin(<plugin name>
# "<debug binary install dir>;<debug library install dir>"
# "<release binary install dir>;<release library install dir>"
# <metadata file>
# <sources>...)
#
# The macro adds a preprocessor directive ``CORRADE_DYNAMIC_PLUGIN`` when
# compiling ``<sources>``. Additional libraries can be linked in via
# :command:`target_link_libraries(plugin_name ...) <target_link_libraries>`.
# On DLL platforms, the plugin DLLs and metadata files are put into
# ``<debug binary install dir>`` / ``<release binary install dir>`` and the
# ``*.lib`` files into ``<debug library install dir>`` /
# ``<release library install dir>``. On non-DLL platforms everything is put
# into ``<debug library install dir>`` / ``<release library install dir>``.
#
# If the plugin interface disables plugin metadata files, the
# ``<metadata file>`` can be set to ``""``, in which case no metadata file is
# copied anywhere. Otherwise the metadata file is copied and renamed to
# ``<plugin name>``, retaining its original extension.
#
# corrade_add_plugin(<plugin name>
# <debug install dir>
# <release install dir>
# <metadata file>
# <sources>...)
#
2023-08-31 11:52:52 +02:00
# Unlike the above version this puts everything into ``<debug install dir>`` on
2021-06-11 19:24:52 +02:00
# both DLL and non-DLL platforms. If ``<debug install dir>`` is set to
# :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for testing purposes), the files
# are copied directly, without the need to perform install step. Note that the
# files are actually put into configuration-based subdirectory, i.e.
# ``${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}``. See documentation of
# :variable:`CMAKE_CFG_INTDIR` variable for more information.
#
# .. command:: corrade_add_static_plugin
#
# Add static plugin::
#
# corrade_add_static_plugin(<plugin name>
# "<binary install dir>;<library install dir>"
# <metadata file>
# <sources>...)
#
# The macro adds a preprocessor directive ``CORRADE_STATIC_PLUGIN`` when
# compiling ``<sources>``. Additional libraries can be linked in via
# :command:`target_link_libraries(plugin_name ...) <target_link_libraries>`.
# The ``<binary install dir>`` is ignored and included just for compatibility
# with the :command:`corrade_add_plugin` command, everything is installed into
# ``<library install dir>``. Note that plugins built in debug configuration
# (e.g. with :variable:`CMAKE_BUILD_TYPE` set to ``Debug``) have ``"-d"``
# suffix to make it possible to have both debug and release plugins installed
# alongside each other.
#
# If the plugin interface disables plugin metadata files, the
# ``<metadata file>`` can be set to ``""``, in which case no metadata file is
# used. Otherwise the metadata file is bundled and renamed to
# ``<plugin name>``, retaining its original extension.
#
# corrade_add_static_plugin(<plugin name>
# <install dir>
# <metadata file>
# <sources>...)
#
# Equivalent to the above with ``<library install dir>`` set to ``<install dir>``.
# If ``<install dir>`` is set to :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for
# testing purposes), no installation rules are added.
#
# .. command:: corrade_find_dlls_for_libs
#
# Find corresponding DLLs for library files::
#
# corrade_find_dlls_for_libs(<output variable> <libs>...)
#
# Available only on Windows, for all ``*.lib`` files tries to find
# corresponding DLL file. Useful for bundling dependencies for e.g. WinRT
# packages.
#
#
# This file is part of Corrade.
#
# Copyright © 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
2023-08-31 11:52:52 +02:00
# 2017, 2018, 2019, 2020, 2021, 2022, 2023
2021-06-11 19:24:52 +02:00
# Vladimír Vondruš <mosra@centrum.cz>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
# Root include dir
find_path ( CORRADE_INCLUDE_DIR
N A M E S C o r r a d e / C o r r a d e . h )
mark_as_advanced ( CORRADE_INCLUDE_DIR )
# Configuration file
find_file ( _CORRADE_CONFIGURE_FILE configure.h
H I N T S $ { C O R R A D E _ I N C L U D E _ D I R } / C o r r a d e / )
mark_as_advanced ( _CORRADE_CONFIGURE_FILE )
# We need to open configure.h file from CORRADE_INCLUDE_DIR before we check for
# the components. Bail out with proper error message if it wasn't found. The
# complete check with all components is further below.
if ( NOT CORRADE_INCLUDE_DIR )
include ( FindPackageHandleStandardArgs )
find_package_handle_standard_args ( Corrade
R E Q U I R E D _ V A R S C O R R A D E _ I N C L U D E _ D I R _ C O R R A D E _ C O N F I G U R E _ F I L E )
endif ( )
# Read flags from configuration
file ( READ ${ _CORRADE_CONFIGURE_FILE } _corradeConfigure )
string ( REGEX REPLACE ";" "\\\\;" _corradeConfigure "${_corradeConfigure}" )
string ( REGEX REPLACE "\n" ";" _corradeConfigure "${_corradeConfigure}" )
set ( _corradeFlags
M S V C 2 0 1 5 _ C O M P A T I B I L I T Y
M S V C 2 0 1 7 _ C O M P A T I B I L I T Y
2022-03-09 11:04:19 +01:00
M S V C _ C O M P A T I B I L I T Y
2021-06-11 19:24:52 +02:00
B U I L D _ D E P R E C A T E D
B U I L D _ S T A T I C
B U I L D _ S T A T I C _ U N I Q U E _ G L O B A L S
B U I L D _ M U L T I T H R E A D E D
2023-08-31 11:52:52 +02:00
B U I L D _ C P U _ R U N T I M E _ D I S P A T C H
2021-06-11 19:24:52 +02:00
T A R G E T _ U N I X
T A R G E T _ A P P L E
T A R G E T _ I O S
T A R G E T _ I O S _ S I M U L A T O R
T A R G E T _ W I N D O W S
T A R G E T _ W I N D O W S _ R T
T A R G E T _ E M S C R I P T E N
T A R G E T _ A N D R O I D
2023-08-31 11:52:52 +02:00
# TARGET_X86 etc, TARGET_32BIT, TARGET_BIG_ENDIAN and TARGET_LIBCXX etc.
# are not exposed to CMake as the meaning is unclear on platforms with
# multi-arch binaries or when mixing different STL implementations.
# TARGET_GCC etc are figured out via UseCorrade.cmake, as the compiler can
# be different when compiling the lib & when using it.
C P U _ U S E _ I F U N C
2021-06-11 19:24:52 +02:00
P L U G I N M A N A G E R _ N O _ D Y N A M I C _ P L U G I N _ S U P P O R T
T E S T S U I T E _ T A R G E T _ X C T E S T
U T I L I T Y _ U S E _ A N S I _ C O L O R S )
foreach ( _corradeFlag ${ _corradeFlags } )
list ( FIND _corradeConfigure "#define CORRADE_${_corradeFlag}" _corrade_ ${ _corradeFlag } )
if ( NOT _corrade_ ${ _corradeFlag } EQUAL -1 )
set ( CORRADE_ ${ _corradeFlag } 1 )
endif ( )
endforeach ( )
# CMake module dir
find_path ( _CORRADE_MODULE_DIR
N A M E S U s e C o r r a d e . c m a k e C o r r a d e L i b S u f f i x . c m a k e
P A T H _ S U F F I X E S s h a r e / c m a k e / C o r r a d e )
mark_as_advanced ( _CORRADE_MODULE_DIR )
set ( CORRADE_USE_MODULE ${ _CORRADE_MODULE_DIR } /UseCorrade.cmake )
set ( CORRADE_LIB_SUFFIX_MODULE ${ _CORRADE_MODULE_DIR } /CorradeLibSuffix.cmake )
# Component distinction (listing them explicitly to avoid mistakes with finding
# unknown components)
set ( _CORRADE_LIBRARY_COMPONENTS
C o n t a i n e r s I n t e r c o n n e c t M a i n P l u g i n M a n a g e r T e s t S u i t e U t i l i t y )
set ( _CORRADE_HEADER_ONLY_COMPONENTS Containers )
if ( NOT CORRADE_TARGET_WINDOWS )
# CorradeMain is a real library only on windows, a dummy target elsewhere
list ( APPEND _CORRADE_HEADER_ONLY_COMPONENTS Main )
endif ( )
set ( _CORRADE_EXECUTABLE_COMPONENTS rc )
# Currently everything is enabled implicitly. Keep in sync with Corrade's root
# CMakeLists.txt.
set ( _CORRADE_IMPLICITLY_ENABLED_COMPONENTS
C o n t a i n e r s I n t e r c o n n e c t M a i n P l u g i n M a n a g e r T e s t S u i t e U t i l i t y r c )
# Inter-component dependencies
set ( _CORRADE_Containers_DEPENDENCIES Utility )
set ( _CORRADE_Interconnect_DEPENDENCIES Containers Utility )
set ( _CORRADE_PluginManager_DEPENDENCIES Containers Utility rc )
set ( _CORRADE_TestSuite_DEPENDENCIES Containers Utility Main ) # see below
set ( _CORRADE_Utility_DEPENDENCIES Containers rc )
# Ensure that all inter-component dependencies are specified as well
foreach ( _component ${ Corrade_FIND_COMPONENTS } )
# Mark the dependencies as required if the component is also required
if ( Corrade_FIND_REQUIRED_ ${ _component } )
foreach ( _dependency ${ _CORRADE_${_component } _DEPENDENCIES} )
set ( Corrade_FIND_REQUIRED_ ${ _dependency } TRUE )
endforeach ( )
endif ( )
list ( APPEND _CORRADE_ADDITIONAL_COMPONENTS ${ _CORRADE_${_component } _DEPENDENCIES} )
endforeach ( )
# Main is linked only in corrade_add_test(), not to everything that depends on
# TestSuite, so remove it from the list again once we filled the above
# variables
set ( _CORRADE_TestSuite_DEPENDENCIES Containers Utility )
# Join the lists, remove duplicate components
set ( _CORRADE_ORIGINAL_FIND_COMPONENTS ${ Corrade_FIND_COMPONENTS } )
if ( _CORRADE_ADDITIONAL_COMPONENTS )
list ( INSERT Corrade_FIND_COMPONENTS 0 ${ _CORRADE_ADDITIONAL_COMPONENTS } )
endif ( )
if ( Corrade_FIND_COMPONENTS )
list ( REMOVE_DUPLICATES Corrade_FIND_COMPONENTS )
endif ( )
# Find all components
foreach ( _component ${ Corrade_FIND_COMPONENTS } )
string ( TOUPPER ${ _component } _COMPONENT )
# Create imported target in case the library is found. If the project is
# added as subproject to CMake, the target already exists and all the
# required setup is already done from the build tree.
if ( TARGET Corrade:: ${ _component } )
set ( Corrade_ ${ _component } _FOUND TRUE )
else ( )
2023-08-31 11:52:52 +02:00
unset ( Corrade_ ${ _component } _FOUND )
2021-06-11 19:24:52 +02:00
# Library (and not header-only) components
if ( _component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND NOT _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS )
add_library ( Corrade:: ${ _component } UNKNOWN IMPORTED )
# Try to find both debug and release version
find_library ( CORRADE_ ${ _COMPONENT } _LIBRARY_DEBUG Corrade ${ _component } -d )
find_library ( CORRADE_ ${ _COMPONENT } _LIBRARY_RELEASE Corrade ${ _component } )
mark_as_advanced ( CORRADE_ ${ _COMPONENT } _LIBRARY_DEBUG
C O R R A D E _ $ { _ C O M P O N E N T } _ L I B R A R Y _ R E L E A S E )
if ( CORRADE_ ${ _COMPONENT } _LIBRARY_RELEASE )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I M P O R T E D _ C O N F I G U R A T I O N S R E L E A S E )
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I M P O R T E D _ L O C A T I O N _ R E L E A S E $ { C O R R A D E _ $ { _ C O M P O N E N T } _ L I B R A R Y _ R E L E A S E } )
endif ( )
if ( CORRADE_ ${ _COMPONENT } _LIBRARY_DEBUG )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I M P O R T E D _ C O N F I G U R A T I O N S D E B U G )
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I M P O R T E D _ L O C A T I O N _ D E B U G $ { C O R R A D E _ $ { _ C O M P O N E N T } _ L I B R A R Y _ D E B U G } )
endif ( )
endif ( )
# Header-only library components
if ( _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS )
add_library ( Corrade:: ${ _component } INTERFACE IMPORTED )
endif ( )
# Default include path names to look for for library / header-only
# components
if ( _component IN_LIST _CORRADE_LIBRARY_COMPONENTS )
set ( _CORRADE_ ${ _COMPONENT } _INCLUDE_PATH_SUFFIX Corrade/ ${ _component } )
set ( _CORRADE_ ${ _COMPONENT } _INCLUDE_PATH_NAMES ${ _component } .h )
endif ( )
# Executable components
if ( _component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS )
add_executable ( Corrade:: ${ _component } IMPORTED )
find_program ( CORRADE_ ${ _COMPONENT } _EXECUTABLE corrade- ${ _component } )
mark_as_advanced ( CORRADE_ ${ _COMPONENT } _EXECUTABLE )
if ( CORRADE_ ${ _COMPONENT } _EXECUTABLE )
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I M P O R T E D _ L O C A T I O N $ { C O R R A D E _ $ { _ C O M P O N E N T } _ E X E C U T A B L E } )
endif ( )
endif ( )
# No special setup for Containers library
# Interconnect library
if ( _component STREQUAL Interconnect )
# Disable /OPT:ICF on MSVC, which merges functions with identical
2024-04-07 15:50:49 +02:00
# contents and thus breaks signal comparison. Same case is for
# clang-cl which uses the MSVC linker by default.
if ( CORRADE_TARGET_WINDOWS AND ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" ) )
2021-06-11 19:24:52 +02:00
if ( CMAKE_VERSION VERSION_LESS 3.13 )
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S " - O P T : N O I C F , R E F " )
else ( )
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I N T E R F A C E _ L I N K _ O P T I O N S " / O P T : N O I C F , R E F " )
endif ( )
endif ( )
# Main library
elseif ( _component STREQUAL Main )
set ( _CORRADE_ ${ _COMPONENT } _INCLUDE_PATH_SUFFIX Corrade )
set ( _CORRADE_ ${ _COMPONENT } _INCLUDE_PATH_NAMES Corrade.h )
if ( CORRADE_TARGET_WINDOWS )
if ( NOT MINGW )
# Abusing INTERFACE_LINK_LIBRARIES because
# INTERFACE_LINK_OPTIONS is only since 3.13. They treat
# things with `-` in front as linker flags and fortunately
# I can use `-ENTRY` instead of `/ENTRY`.
# https://gitlab.kitware.com/cmake/cmake/issues/16543
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S " - E N T R Y : $ < $ < N O T : $ < B O O L : $ < T A R G E T _ P R O P E R T Y : W I N 3 2 _ E X E C U T A B L E > > > : w m a i n C R T S t a r t u p > $ < $ < B O O L : $ < T A R G E T _ P R O P E R T Y : W I N 3 2 _ E X E C U T A B L E > > : w W i n M a i n C R T S t a r t u p > " )
else ( )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S " - m u n i c o d e " )
endif ( )
endif ( )
# PluginManager library
elseif ( _component STREQUAL PluginManager )
# -ldl is handled by Utility now
2023-08-31 11:52:52 +02:00
# TestSuite library has some additional files. If those are not found,
# set the component _FOUND variable to false so it works properly both
# when the component is required and when it's optional.
2021-06-11 19:24:52 +02:00
elseif ( _component STREQUAL TestSuite )
# XCTest runner file
if ( CORRADE_TESTSUITE_TARGET_XCTEST )
find_file ( CORRADE_TESTSUITE_XCTEST_RUNNER XCTestRunner.mm.in
P A T H _ S U F F I X E S s h a r e / c o r r a d e / T e s t S u i t e )
2023-08-31 11:52:52 +02:00
if ( NOT CORRADE_TESTSUITE_XCTEST_RUNNER )
set ( Corrade_ ${ _component } _FOUND FALSE )
endif ( )
2021-06-11 19:24:52 +02:00
# ADB runner file
elseif ( CORRADE_TARGET_ANDROID )
find_file ( CORRADE_TESTSUITE_ADB_RUNNER AdbRunner.sh
P A T H _ S U F F I X E S s h a r e / c o r r a d e / T e s t S u i t e )
2023-08-31 11:52:52 +02:00
if ( NOT CORRADE_TESTSUITE_ADB_RUNNER )
set ( Corrade_ ${ _component } _FOUND FALSE )
endif ( )
2021-06-11 19:24:52 +02:00
# Emscripten runner file
elseif ( CORRADE_TARGET_EMSCRIPTEN )
find_file ( CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER EmscriptenRunner.html.in
P A T H _ S U F F I X E S s h a r e / c o r r a d e / T e s t S u i t e )
2023-08-31 11:52:52 +02:00
if ( NOT CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER )
set ( Corrade_ ${ _component } _FOUND FALSE )
endif ( )
2021-06-11 19:24:52 +02:00
endif ( )
# Utility library (contains all setup that is used by others)
elseif ( _component STREQUAL Utility )
# Top-level include directory
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S $ { C O R R A D E _ I N C L U D E _ D I R } )
# Require (at least) C++11 for users
set_property ( TARGET Corrade:: ${ _component } PROPERTY
I N T E R F A C E _ C O R R A D E _ C X X _ S T A N D A R D 1 1 )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
C O M P A T I B L E _ I N T E R F A C E _ N U M B E R _ M A X C O R R A D E _ C X X _ S T A N D A R D )
2022-03-09 11:04:19 +01:00
# Path::libraryLocation() needs this
2021-06-11 19:24:52 +02:00
if ( CORRADE_TARGET_UNIX )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S $ { C M A K E _ D L _ L I B S } )
endif ( )
# AndroidLogStreamBuffer class needs to be linked to log library
if ( CORRADE_TARGET_ANDROID )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S " l o g " )
endif ( )
2024-04-07 15:50:49 +02:00
# Emscripten has various stuff implemented in JS
if ( CORRADE_TARGET_EMSCRIPTEN )
find_file ( CORRADE_UTILITY_JS CorradeUtility.js
P A T H _ S U F F I X E S l i b )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
# TODO switch to INTERFACE_LINK_OPTIONS and SHELL: once we
# require CMake 3.13 unconditionally
I N T E R F A C E _ L I N K _ L I B R A R I E S " - - j s - l i b r a r y $ { C O R R A D E _ U T I L I T Y _ J S } " )
endif ( )
2021-06-11 19:24:52 +02:00
endif ( )
# Find library includes
if ( _component IN_LIST _CORRADE_LIBRARY_COMPONENTS )
find_path ( _CORRADE_ ${ _COMPONENT } _INCLUDE_DIR
N A M E S $ { _ C O R R A D E _ $ { _ C O M P O N E N T } _ I N C L U D E _ P A T H _ N A M E S }
H I N T S $ { C O R R A D E _ I N C L U D E _ D I R } / $ { _ C O R R A D E _ $ { _ C O M P O N E N T } _ I N C L U D E _ P A T H _ S U F F I X } )
mark_as_advanced ( _CORRADE_ ${ _COMPONENT } _INCLUDE_DIR )
endif ( )
# Add inter-library dependencies
if ( _component IN_LIST _CORRADE_LIBRARY_COMPONENTS OR _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS )
foreach ( _dependency ${ _CORRADE_${_component } _DEPENDENCIES} )
if ( _dependency IN_LIST _CORRADE_LIBRARY_COMPONENTS OR _dependency IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS )
set_property ( TARGET Corrade:: ${ _component } APPEND PROPERTY
I N T E R F A C E _ L I N K _ L I B R A R I E S C o r r a d e : : $ { _ d e p e n d e n c y } )
endif ( )
endforeach ( )
endif ( )
2023-08-31 11:52:52 +02:00
# Decide if the component was found, unless the _FOUND is already set
# by something above.
if ( NOT DEFINED Corrade_ ${ _component } _FOUND )
if ( ( _component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND _CORRADE_ ${ _COMPONENT } _INCLUDE_DIR AND ( _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS OR CORRADE_ ${ _COMPONENT } _LIBRARY_RELEASE OR CORRADE_ ${ _COMPONENT } _LIBRARY_DEBUG ) ) OR ( _component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS AND CORRADE_ ${ _COMPONENT } _EXECUTABLE ) )
set ( Corrade_ ${ _component } _FOUND TRUE )
else ( )
set ( Corrade_ ${ _component } _FOUND FALSE )
endif ( )
2021-06-11 19:24:52 +02:00
endif ( )
endif ( )
endforeach ( )
# For CMake 3.16+ with REASON_FAILURE_MESSAGE, provide additional potentially
# useful info about the failed components.
if ( NOT CMAKE_VERSION VERSION_LESS 3.16 )
set ( _CORRADE_REASON_FAILURE_MESSAGE )
# Go only through the originally specified find_package() components, not
# the dependencies added by us afterwards
foreach ( _component ${ _CORRADE_ORIGINAL_FIND_COMPONENTS } )
if ( Corrade_ ${ _component } _FOUND )
continue ( )
endif ( )
# If it's not known at all, tell the user -- it might be a new library
# and an old Find module, or something platform-specific.
if ( NOT _component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND NOT _component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS )
list ( APPEND _CORRADE_REASON_FAILURE_MESSAGE "${_component} is not a known component on this platform." )
# Otherwise, if it's not among implicitly built components, hint that
# the user may need to enable it.
# TODO: currently, the _FOUND variable doesn't reflect if dependencies
# were found. When it will, this needs to be updated to avoid
# misleading messages.
elseif ( NOT _component IN_LIST _CORRADE_IMPLICITLY_ENABLED_COMPONENTS )
string ( TOUPPER ${ _component } _COMPONENT )
2023-08-31 11:52:52 +02:00
list ( APPEND _CORRADE_REASON_FAILURE_MESSAGE "${_component} is not built by default. Make sure you enabled CORRADE_WITH_${_COMPONENT} when building Corrade." )
2021-06-11 19:24:52 +02:00
# Otherwise we have no idea. Better be silent than to print something
# misleading.
else ( )
endif ( )
endforeach ( )
string ( REPLACE ";" " " _CORRADE_REASON_FAILURE_MESSAGE "${_CORRADE_REASON_FAILURE_MESSAGE}" )
set ( _CORRADE_REASON_FAILURE_MESSAGE REASON_FAILURE_MESSAGE "${_CORRADE_REASON_FAILURE_MESSAGE}" )
endif ( )
include ( FindPackageHandleStandardArgs )
find_package_handle_standard_args ( Corrade REQUIRED_VARS
C O R R A D E _ I N C L U D E _ D I R
_ C O R R A D E _ M O D U L E _ D I R
_ C O R R A D E _ C O N F I G U R E _ F I L E
H A N D L E _ C O M P O N E N T S
$ { _ C O R R A D E _ R E A S O N _ F A I L U R E _ M E S S A G E } )
# Finalize the finding process
include ( ${ CORRADE_USE_MODULE } )
set ( CORRADE_INCLUDE_INSTALL_DIR include/Corrade )
if ( CORRADE_BUILD_DEPRECATED AND CORRADE_INCLUDE_INSTALL_PREFIX AND NOT CORRADE_INCLUDE_INSTALL_PREFIX STREQUAL "." )
message ( DEPRECATION "CORRADE_INCLUDE_INSTALL_PREFIX is obsolete as its primary use was for old Android NDK versions. Please switch to the NDK r19+ layout instead of using this variable and recreate your build directory to get rid of this warning." )
set ( CORRADE_INCLUDE_INSTALL_DIR ${ CORRADE_INCLUDE_INSTALL_PREFIX } / ${ CORRADE_INCLUDE_INSTALL_DIR } )
endif ( )