Warning, /graphics/krita/cmake/modules/FindGSL.cmake is written in an unsupported language. File is not indexed.

0001 # SPDX-FileCopyrightText: 2000-2023 Kitware, Inc. and Contributors
0002 # SPDX-FileCopyrightText: 2023 L. E. Segovia <amy@amyspark.me>
0003 # SPDX-License-Ref: BSD-3-Clause
0004 
0005 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
0006 # file Copyright.txt or https://cmake.org/licensing for details.
0007 
0008 #[=======================================================================[.rst:
0009 FindGSL
0010 --------
0011 
0012 .. versionadded:: 3.2
0013 
0014 Find the native GNU Scientific Library (GSL) includes and libraries.
0015 
0016 The GNU Scientific Library (GSL) is a numerical library for C and C++
0017 programmers. It is free software under the GNU General Public
0018 License.
0019 
0020 Imported Targets
0021 ^^^^^^^^^^^^^^^^
0022 
0023 If GSL is found, this module defines the following :prop_tgt:`IMPORTED`
0024 targets::
0025 
0026  GSL::gsl      - The main GSL library.
0027  GSL::gslcblas - The CBLAS support library used by GSL.
0028 
0029 Result Variables
0030 ^^^^^^^^^^^^^^^^
0031 
0032 This module will set the following variables in your project::
0033 
0034  GSL_FOUND          - True if GSL found on the local system
0035  GSL_INCLUDE_DIRS   - Location of GSL header files.
0036  GSL_LIBRARIES      - The GSL libraries.
0037  GSL_VERSION        - The version of the discovered GSL install.
0038 
0039 Hints
0040 ^^^^^
0041 
0042 Set ``GSL_ROOT_DIR`` to a directory that contains a GSL installation.
0043 
0044 This script expects to find libraries at ``$GSL_ROOT_DIR/lib`` and the GSL
0045 headers at ``$GSL_ROOT_DIR/include/gsl``.  The library directory may
0046 optionally provide Release and Debug folders. If available, the libraries
0047 named ``gsld``, ``gslblasd`` or ``cblasd`` are recognized as debug libraries.
0048 For Unix-like systems, this script will use ``$GSL_ROOT_DIR/bin/gsl-config``
0049 (if found) to aid in the discovery of GSL.
0050 
0051 Cache Variables
0052 ^^^^^^^^^^^^^^^
0053 
0054 This module may set the following variables depending on platform and type
0055 of GSL installation discovered.  These variables may optionally be set to
0056 help this module find the correct files::
0057 
0058  GSL_CBLAS_LIBRARY       - Location of the GSL CBLAS library.
0059  GSL_CBLAS_LIBRARY_DEBUG - Location of the debug GSL CBLAS library (if any).
0060  GSL_CONFIG_EXECUTABLE   - Location of the ``gsl-config`` script (if any).
0061  GSL_LIBRARY             - Location of the GSL library.
0062  GSL_LIBRARY_DEBUG       - Location of the debug GSL library (if any).
0063 
0064 #]=======================================================================]
0065 
0066 include(FindPackageHandleStandardArgs)
0067 
0068 #=============================================================================
0069 # If the user has provided ``GSL_ROOT_DIR``, use it!  Choose items found
0070 # at this location over system locations.
0071 if( EXISTS "$ENV{GSL_ROOT_DIR}" )
0072   file( TO_CMAKE_PATH "$ENV{GSL_ROOT_DIR}" GSL_ROOT_DIR )
0073   set( GSL_ROOT_DIR "${GSL_ROOT_DIR}" CACHE PATH "Prefix for GSL installation." )
0074 endif()
0075 if( NOT EXISTS "${GSL_ROOT_DIR}" )
0076   set( GSL_USE_PKGCONFIG ON )
0077 endif()
0078 
0079 #=============================================================================
0080 # As a first try, use the PkgConfig module.  This will work on many
0081 # *NIX systems.  See :module:`findpkgconfig`
0082 # This will return ``GSL_INCLUDEDIR`` and ``GSL_LIBDIR`` used below.
0083 if( GSL_USE_PKGCONFIG )
0084   find_package(PkgConfig QUIET)
0085   pkg_check_modules( GSL QUIET gsl )
0086 
0087   if( EXISTS "${GSL_INCLUDEDIR}" )
0088     get_filename_component( GSL_ROOT_DIR "${GSL_INCLUDEDIR}" DIRECTORY CACHE)
0089   endif()
0090 endif()
0091 
0092 #=============================================================================
0093 # Set GSL_INCLUDE_DIRS and GSL_LIBRARIES. If we skipped the PkgConfig step, try
0094 # to find the libraries at $GSL_ROOT_DIR (if provided) or in standard system
0095 # locations.  These find_library and find_path calls will prefer custom
0096 # locations over standard locations (HINTS).  If the requested file is not found
0097 # at the HINTS location, standard system locations will be still be searched
0098 # (/usr/lib64 (Redhat), lib/i386-linux-gnu (Debian)).
0099 
0100 find_path( GSL_INCLUDE_DIR
0101   NAMES gsl/gsl_sf.h
0102   HINTS ${GSL_ROOT_DIR}/include ${GSL_INCLUDEDIR}
0103 )
0104 find_library( GSL_LIBRARY
0105   NAMES gsl
0106   HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
0107   PATH_SUFFIXES Release Debug
0108 )
0109 find_library( GSL_CBLAS_LIBRARY
0110   NAMES gslcblas cblas
0111   HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
0112   PATH_SUFFIXES Release Debug
0113 )
0114 # Do we also have debug versions?
0115 find_library( GSL_LIBRARY_DEBUG
0116   NAMES gsld gsl
0117   HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
0118   PATH_SUFFIXES Debug
0119 )
0120 find_library( GSL_CBLAS_LIBRARY_DEBUG
0121   NAMES gslcblasd cblasd gslcblas cblas
0122   HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
0123   PATH_SUFFIXES Debug
0124 )
0125 set( GSL_INCLUDE_DIRS ${GSL_INCLUDE_DIR} )
0126 set( GSL_LIBRARIES ${GSL_LIBRARY} ${GSL_CBLAS_LIBRARY} )
0127 
0128 # If we didn't use PkgConfig, try to find the version via gsl-config or by
0129 # reading gsl_version.h.
0130 if( NOT GSL_VERSION )
0131   # 1. If gsl-config exists, query for the version.
0132   find_program( GSL_CONFIG_EXECUTABLE
0133     NAMES gsl-config
0134     HINTS "${GSL_ROOT_DIR}/bin"
0135     )
0136   if( EXISTS "${GSL_CONFIG_EXECUTABLE}" )
0137     execute_process(
0138       COMMAND "${GSL_CONFIG_EXECUTABLE}" --version
0139       OUTPUT_VARIABLE GSL_VERSION
0140       OUTPUT_STRIP_TRAILING_WHITESPACE )
0141   endif()
0142 
0143   # 2. If gsl-config is not available, try looking in gsl/gsl_version.h
0144   if( NOT GSL_VERSION AND EXISTS "${GSL_INCLUDE_DIRS}/gsl/gsl_version.h" )
0145     file( STRINGS "${GSL_INCLUDE_DIRS}/gsl/gsl_version.h" gsl_version_h_contents REGEX "define GSL_VERSION" )
0146     string( REGEX REPLACE ".*define[ ]+GSL_VERSION[ ]+\"([^\"]*)\".*" "\\1" GSL_VERSION ${gsl_version_h_contents} )
0147   endif()
0148 
0149   # might also try scraping the directory name for a regex match "gsl-X.X"
0150 endif()
0151 
0152 #=============================================================================
0153 # handle the QUIETLY and REQUIRED arguments and set GSL_FOUND to TRUE if all
0154 # listed variables are TRUE
0155 find_package_handle_standard_args( GSL
0156   FOUND_VAR
0157     GSL_FOUND
0158   REQUIRED_VARS
0159     GSL_INCLUDE_DIR
0160     GSL_LIBRARY
0161     GSL_CBLAS_LIBRARY
0162   VERSION_VAR
0163     GSL_VERSION
0164     )
0165 
0166 mark_as_advanced( GSL_ROOT_DIR GSL_VERSION GSL_LIBRARY GSL_INCLUDE_DIR
0167   GSL_CBLAS_LIBRARY GSL_LIBRARY_DEBUG GSL_CBLAS_LIBRARY_DEBUG
0168   GSL_USE_PKGCONFIG GSL_CONFIG )
0169 
0170 #=============================================================================
0171 # Register imported libraries:
0172 # 1. If we can find a Windows .dll file (or if we can find both Debug and
0173 #    Release libraries), we will set appropriate target properties for these.
0174 # 2. However, for most systems, we will only register the import location and
0175 #    include directory.
0176 
0177 # Look for dlls, or Release and Debug libraries.
0178 # XXX: CMake's logic here is wrong, it assumes Windows == MSVC *and*
0179 # that the library will always be built dynamically
0180 # if(WIN32)
0181 #   string( REPLACE ".lib" ".dll" GSL_LIBRARY_DLL       "${GSL_LIBRARY}" )
0182 #   string( REPLACE ".lib" ".dll" GSL_CBLAS_LIBRARY_DLL "${GSL_CBLAS_LIBRARY}" )
0183 #   string( REPLACE ".lib" ".dll" GSL_LIBRARY_DEBUG_DLL "${GSL_LIBRARY_DEBUG}" )
0184 #   string( REPLACE ".lib" ".dll" GSL_CBLAS_LIBRARY_DEBUG_DLL "${GSL_CBLAS_LIBRARY_DEBUG}" )
0185 # endif()
0186 if(WIN32)
0187   if (MSVC)
0188     string( REGEX REPLACE ".lib$" ".dll" GSL_LIBRARY_DLL       "${GSL_LIBRARY}" )
0189     string( REGEX REPLACE ".lib$" ".dll" GSL_CBLAS_LIBRARY_DLL "${GSL_CBLAS_LIBRARY}" )
0190     string( REGEX REPLACE ".lib$" ".dll" GSL_LIBRARY_DEBUG_DLL "${GSL_LIBRARY_DEBUG}" )
0191     string( REGEX REPLACE ".lib$" ".dll" GSL_CBLAS_LIBRARY_DEBUG_DLL "${GSL_CBLAS_LIBRARY_DEBUG}" )
0192   elseif ("${GSL_LIBRARY}" MATCHES "\.dll\.a$")
0193     string( REGEX REPLACE ".a$" "" GSL_LIBRARY_DLL       "${GSL_LIBRARY}" )
0194     string( REGEX REPLACE ".a$" "" GSL_CBLAS_LIBRARY_DLL "${GSL_CBLAS_LIBRARY}" )
0195     string( REGEX REPLACE ".a$" "" GSL_LIBRARY_DEBUG_DLL "${GSL_LIBRARY_DEBUG}" )
0196     string( REGEX REPLACE ".a$" "" GSL_CBLAS_LIBRARY_DEBUG_DLL "${GSL_CBLAS_LIBRARY_DEBUG}" )
0197   else()
0198     string( REGEX REPLACE ".a$" ".dll" GSL_LIBRARY_DLL       "${GSL_LIBRARY}" )
0199     string( REGEX REPLACE ".a$" ".dll" GSL_CBLAS_LIBRARY_DLL "${GSL_CBLAS_LIBRARY}" )
0200     string( REGEX REPLACE ".a$" ".dll" GSL_LIBRARY_DEBUG_DLL "${GSL_LIBRARY_DEBUG}" )
0201     string( REGEX REPLACE ".a$" ".dll" GSL_CBLAS_LIBRARY_DEBUG_DLL "${GSL_CBLAS_LIBRARY_DEBUG}" )
0202   endif()
0203 endif()
0204 
0205 if( GSL_FOUND AND NOT TARGET GSL::gsl )
0206   if( EXISTS "${GSL_LIBRARY_DLL}" AND EXISTS "${GSL_CBLAS_LIBRARY_DLL}")
0207 
0208     # Windows systems with dll libraries.
0209     add_library( GSL::gsl      SHARED IMPORTED )
0210     add_library( GSL::gslcblas SHARED IMPORTED )
0211 
0212     # Windows with dlls, but only Release libraries.
0213     set_target_properties( GSL::gslcblas PROPERTIES
0214       IMPORTED_LOCATION_RELEASE         "${GSL_CBLAS_LIBRARY_DLL}"
0215       IMPORTED_IMPLIB                   "${GSL_CBLAS_LIBRARY}"
0216       INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
0217       IMPORTED_CONFIGURATIONS           Release
0218       IMPORTED_LINK_INTERFACE_LANGUAGES "C" )
0219     set_target_properties( GSL::gsl PROPERTIES
0220       IMPORTED_LOCATION_RELEASE         "${GSL_LIBRARY_DLL}"
0221       IMPORTED_IMPLIB                   "${GSL_LIBRARY}"
0222       INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
0223       IMPORTED_CONFIGURATIONS           Release
0224       IMPORTED_LINK_INTERFACE_LANGUAGES "C"
0225       INTERFACE_LINK_LIBRARIES          GSL::gslcblas )
0226 
0227     # If we have both Debug and Release libraries
0228     if( EXISTS "${GSL_LIBRARY_DEBUG_DLL}" AND EXISTS "${GSL_CBLAS_LIBRARY_DEBUG_DLL}")
0229       set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
0230       set_target_properties( GSL::gslcblas PROPERTIES
0231         IMPORTED_LOCATION_DEBUG           "${GSL_CBLAS_LIBRARY_DEBUG_DLL}"
0232         IMPORTED_IMPLIB_DEBUG             "${GSL_CBLAS_LIBRARY_DEBUG}" )
0233       set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
0234       set_target_properties( GSL::gsl PROPERTIES
0235         IMPORTED_LOCATION_DEBUG           "${GSL_LIBRARY_DEBUG_DLL}"
0236         IMPORTED_IMPLIB_DEBUG             "${GSL_LIBRARY_DEBUG}" )
0237     endif()
0238 
0239   else()
0240 
0241     # For all other environments (ones without dll libraries), create
0242     # the imported library targets.
0243     add_library( GSL::gsl      UNKNOWN IMPORTED )
0244     add_library( GSL::gslcblas UNKNOWN IMPORTED )
0245     set_target_properties( GSL::gslcblas PROPERTIES
0246       IMPORTED_LOCATION                 "${GSL_CBLAS_LIBRARY}"
0247       INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
0248       IMPORTED_LINK_INTERFACE_LANGUAGES "C" )
0249     set_target_properties( GSL::gsl PROPERTIES
0250       IMPORTED_LOCATION                 "${GSL_LIBRARY}"
0251       INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
0252       IMPORTED_LINK_INTERFACE_LANGUAGES "C"
0253       INTERFACE_LINK_LIBRARIES          GSL::gslcblas )
0254   endif()
0255 endif()