找到一些实现
https://graphics.rwth-aachen.de:9000/OpenFlipper-Free/OpenFlipper-Free/blob/ps/cmake/FindGMP.cmake
https://gitlab.inria.fr/batsim/batsched/blob/master/cmake/Modules/FindGMP.cmake
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360004135300-How-to-use-GMP-with-Cmake-on-CLion-
https://www.reddit.com/r/cmake/comments/4qozat/how_to_use_gmp/
https://github.com/rhalstea/p4c/blob/052f00935b72c106dbc87c1be1dabd19e6844d1d/cmake/FindLibGmp.cmake
然后参考 FindSQLite3.cmake 自己写了一个
最后的用法
find_package(GMP REQUIRED)
target_link_libraries(guile GMP::GMP)
实现代码
见:https://github.com/PikachuHy/guile/blob/1.8-cmake/cmake/FindGMP.cmake
#[=======================================================================[.rst:
FindGMP
-----------
Find the GMP libraries
IMPORTED targets
^^^^^^^^^^^^^^^^
This module defines the following :prop_tgt:`IMPORTED` target:
``GMP::GMP``
Result variables
^^^^^^^^^^^^^^^^
This module will set the following variables if found:
``GMP_INCLUDE_DIRS``
where to find gmp.h, etc.
``GMP_LIBRARIES``
the libraries to link against to use GMP.
``GMP_VERSION``
version of the GMP library found
``GMP_FOUND``
TRUE if found
#]=======================================================================]
# Look for the necessary header
find_path(GMP_INCLUDE_DIR NAMES gmp.h)
mark_as_advanced(GMP_INCLUDE_DIR)
# Look for the necessary library
find_library(GMP_LIBRARY NAMES gmp libgmp)
mark_as_advanced(GMP_LIBRARY)
if(GMP_INCLUDE_DIR)
file(STRINGS ${GMP_INCLUDE_DIR}/gmp.h __GNU_MP_VERSION_ver_line
REGEX "^#define __GNU_MP_VERSION *[0-9]"
LIMIT_COUNT 1)
file(STRINGS ${GMP_INCLUDE_DIR}/gmp.h __GNU_MP_VERSION_MINOR_ver_line
REGEX "^#define __GNU_MP_VERSION_MINOR *[0-9]"
LIMIT_COUNT 1)
file(STRINGS ${GMP_INCLUDE_DIR}/gmp.h __GNU_MP_VERSION_PATCHLEVEL_ver_line
REGEX "^#define __GNU_MP_VERSION_PATCHLEVEL *[0-9]"
LIMIT_COUNT 1)
string(REGEX MATCH "[0-9]" GMP_VERSION_MAJOR "${__GNU_MP_VERSION_ver_line}")
string(REGEX MATCH "[0-9]" GMP_VERSION_MINOR "${__GNU_MP_VERSION_MINOR_ver_line}")
string(REGEX MATCH "[0-9]" GMP_VERSION_PATCH "${__GNU_MP_VERSION_PATCHLEVEL_ver_line}")
set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GMP
REQUIRED_VARS GMP_INCLUDE_DIR GMP_LIBRARY
VERSION_VAR GMP_VERSION)
# Create the imported target
if(GMP_FOUND)
set(GMP_INCLUDE_DIRS ${GMP_INCLUDE_DIR})
set(GMP_LIBRARIES ${GMP_LIBRARY})
if(NOT TARGET GMP::GMP)
add_library(GMP::GMP UNKNOWN IMPORTED)
set_target_properties(GMP::GMP PROPERTIES
IMPORTED_LOCATION "${GMP_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${GMP_INCLUDE_DIR}")
endif()
endif()
参考
https://gitlab.com/graphviz/graphviz/blob/master/cmake/FindLTDL.cmake
https://cmake.org/pipermail/cmake/2010-June/037579.html
https://github.com/nest/nest-simulator/blob/master/cmake/FindLTDL.cmake
https://github.com/fzi-forschungszentrum-informatik/schunk_svh_driver/blob/master/icmaker/CMakeModules/FindLtdl.cmake
Usage
find_package(Math REQUIRED)
find_package(LTDL REQUIRED)
target_link_libraries(guile Math::Math LTDL::LTDL)
code:
https://github.com/PikachuHy/guile/blob/1.8-cmake/cmake/FindLTDL.cmake
https://github.com/PikachuHy/guile/blob/1.8-cmake/cmake/FindMath.cmake
#[=======================================================================[.rst:
FindLTDL
-----------
Find the LTDL libraries
IMPORTED targets
^^^^^^^^^^^^^^^^
This module defines the following :prop_tgt:`IMPORTED` target:
``LTDL::LTDL``
Result variables
^^^^^^^^^^^^^^^^
This module will set the following variables if found:
``LTDL_INCLUDE_DIRS``
where to find ltdl.h, etc.
``LTDL_LIBRARIES``
the libraries to link against to use ltdl.
``LTDL_VERSION``
version of the ltdl library found
``LTDL_FOUND``
TRUE if found
#]=======================================================================]
# Look for the necessary header
find_path(LTDL_INCLUDE_DIR NAMES ltdl.h)
mark_as_advanced(LTDL_INCLUDE_DIR)
# Look for the necessary library
find_library(LTDL_LIBRARY NAMES ltdl)
mark_as_advanced(LTDL_LIBRARY)
find_program(LIBTOOL_EXECUTABLE
NAMES glibtool libtool libtoolize
)
if ( NOT LIBTOOL_EXECUTABLE STREQUAL "LIBTOOL_EXECUTABLE-NOTFOUND" )
execute_process(
COMMAND ${LIBTOOL_EXECUTABLE} --version
RESULT_VARIABLE RESULT
OUTPUT_VARIABLE LTDL_VAR_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if ( RESULT EQUAL 0 )
string( REGEX REPLACE ".* ([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
LTDL_VERSION ${LTDL_VAR_OUTPUT} )
endif ()
endif ()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LTDL
REQUIRED_VARS LTDL_INCLUDE_DIR LTDL_LIBRARY
VERSION_VAR LTDL_VERSION)
# Create the imported target
if(LTDL_FOUND)
set(LTDL_INCLUDE_DIRS ${LTDL_INCLUDE_DIR})
set(LTDL_LIBRARIES ${LTDL_LIBRARY})
if(NOT TARGET LTDL::LTDL)
add_library(LTDL::LTDL UNKNOWN IMPORTED)
set_target_properties(LTDL::LTDL PROPERTIES
IMPORTED_LOCATION "${LTDL_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${LTDL_INCLUDE_DIR}")
endif()
endif()
# https://android.googlesource.com/platform/external/eigen/+/master/cmake/FindStandardMathLibrary.cmake
# Look for the necessary library
# Look for the necessary header
find_path(MATH_INCLUDE_DIR NAMES math.h)
mark_as_advanced(MATH_INCLUDE_DIR)
# Look for the necessary library
find_library(MATH_LIBRARY NAMES m libm)
mark_as_advanced(MATH_LIBRARY)
include(CheckCSourceCompiles)
set(find_math_library_test_program
"#include<math.h>
int main() { sin(0.0); log(0.0f); }")
set(CMAKE_REQUIRED_FLAGS "")
set(CMAKE_REQUIRED_LIBRARIES "m")
check_c_source_compiles(
"${find_math_library_test_program}"
math_library_linked_to_as_m)
if(math_library_linked_to_as_m)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Math REQUIRED_VARS MATH_LIBRARY)
endif()
# Create the imported target
if(Math_FOUND)
set(MATH_LIBRARIES ${MATH_LIBRARY})
if(NOT TARGET Math::Math)
add_library(Math::Math UNKNOWN IMPORTED)
set_target_properties(Math::Math PROPERTIES
IMPORTED_LOCATION "${MATH_LIBRARY}")
endif()
endif()