mirror of
https://github.com/jmcnamara/libxlsxwriter
synced 2025-03-28 21:13:14 +00:00
184 lines
4.8 KiB
CMake
184 lines
4.8 KiB
CMake
# :copyright: (c) 2017 Alex Huszagh.
|
|
# :license: FreeBSD, see LICENSE.txt for more details.
|
|
|
|
# FindPackage
|
|
# -----------
|
|
#
|
|
# Macros and functions to help find packages. Do not invoke this module
|
|
# directly, it merely provides library definitions to be invoked
|
|
# by other find utilities.
|
|
|
|
include(CheckCXXSourceCompiles)
|
|
|
|
|
|
# Return if the package name has previously been found
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# ReturnFound(Iconv)
|
|
#
|
|
macro(ReturnFound packageName)
|
|
if(${packageName}_FOUND)
|
|
return()
|
|
endif()
|
|
endmacro(ReturnFound)
|
|
|
|
|
|
# Set the library extensions for a given package dependent on whether
|
|
# to search for static or dynamic libraries.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# SetSuffixes(IConv)
|
|
#
|
|
macro(SetSuffixes packageName)
|
|
if(${packageName}_USE_STATIC_LIBS)
|
|
if(MSVC)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
|
else()
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
endif()
|
|
else()
|
|
if(WIN32)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".dll" ".lib" ".a")
|
|
else()
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
|
|
endif()
|
|
endif()
|
|
endmacro(SetSuffixes)
|
|
|
|
|
|
# Check if the package was found.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# CheckFound(IConv)
|
|
#
|
|
macro(CheckFound packageName)
|
|
if(${packageName}_INCLUDE_DIRS AND ${packageName}_LIBRARIES)
|
|
set(${packageName}_FOUND TRUE)
|
|
endif()
|
|
endmacro(CheckFound)
|
|
|
|
|
|
# Replace a dynamic library with a `.dll.a` extension with the corresponding
|
|
# library removing the `.dll`.
|
|
#
|
|
# Args:
|
|
# libraryName Variable name for path to found library
|
|
#
|
|
# Example:
|
|
# ReplaceDynamic(/mingw64/lib/libiconv.dll.a)
|
|
#
|
|
macro(ReplaceDynamic libraryName)
|
|
if(${libraryName} MATCHES ".dll.a")
|
|
string(REPLACE ".dll.a" ".a" static ${${libraryName}})
|
|
if(EXISTS ${static})
|
|
set(${libraryName} ${static})
|
|
endif()
|
|
endif()
|
|
endmacro(ReplaceDynamic)
|
|
|
|
|
|
# Replace a dynamic libraries with the static variants, with integrity
|
|
# checks for the package.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# FindStaticLibs(IConv)
|
|
#
|
|
macro(FindStaticLibs packageName)
|
|
if(${packageName}_USE_STATIC_LIBS AND MSYS)
|
|
# convert `.dll.a` to `.a`
|
|
set(${packageName}_LIBRARY_SOURCE ${${packageName}_LIBRARIES})
|
|
set(${packageName}_LIBRARIES "")
|
|
foreach(library ${${packageName}_LIBRARY_SOURCE})
|
|
# replace each dynamic library with a single one
|
|
set(static_library ${library})
|
|
ReplaceDynamic(static_library)
|
|
list(APPEND ${packageName}_LIBRARIES ${static_library})
|
|
endforeach(library)
|
|
endif()
|
|
endmacro(FindStaticLibs)
|
|
|
|
|
|
# Checks if a suitable version for the found library was identified,
|
|
# if provided. The library can either force exact or inexact matching.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# MatchVersion(ICU)
|
|
#
|
|
macro(MatchVersion packageName)
|
|
if(${packageName}_FOUND AND ${packageName}_FIND_VERSION)
|
|
# MATCH VERSION
|
|
if(${packageName}_FIND_VERSION_EXACT)
|
|
# EXACT VERSION
|
|
if(${packageName}_FIND_VERSION VERSION_EQUAL ${packageName}_VERSION)
|
|
else()
|
|
set(${packageName}_FOUND FALSE)
|
|
endif()
|
|
else()
|
|
# GREATER THAN VERSION
|
|
if(${packageName}_VERSION VERSION_LESS ${packageName}_FIND_VERSION)
|
|
set(${packageName}_FOUND FALSE)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endmacro(MatchVersion)
|
|
|
|
|
|
# Check if a sample program compiles, if not, set the library to not found.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
# code String of simple program depending on the library
|
|
#
|
|
# Example:
|
|
# set(IConv_CODE "int main(int argc, char **argv){ return 0; }")
|
|
# CheckCompiles(IConv)
|
|
#
|
|
macro(CheckCompiles packageName)
|
|
# FLAGS
|
|
set(CMAKE_REQUIRED_INCLUDES ${${packageName}_INCLUDE_DIRS})
|
|
set(CMAKE_REQUIRED_LIBRARIES ${${packageName}_LIBRARIES})
|
|
|
|
# COMPILATION
|
|
check_cxx_source_compiles("${${packageName}_CODE}" ${packageName}_COMPILES)
|
|
if(NOT ${${packageName}_COMPILES})
|
|
set(${packageName}_FOUND FALSE)
|
|
message(SEND_ERROR "Cannot compile a simple ${packageName} program.")
|
|
endif()
|
|
|
|
endmacro(CheckCompiles)
|
|
|
|
|
|
# Send an error if a required package was not found. Otherwise, if the
|
|
# package is found, report to the user it was identified.
|
|
#
|
|
# Args:
|
|
# packageName Name of the package
|
|
#
|
|
# Example:
|
|
# RequiredPackageFound(ICU)
|
|
#
|
|
macro(RequiredPackageFound packageName)
|
|
if(${packageName}_FOUND)
|
|
message("Found ${packageName}.")
|
|
else()
|
|
if(${packageName}_FIND_REQUIRED)
|
|
message(SEND_ERROR "Unable to find requested ${packageName} libraries.")
|
|
endif()
|
|
endif()
|
|
endmacro(RequiredPackageFound)
|