1# Helper functions for generating a nicely formatted igraph.pc file from
2# igraph.pc.in
3
4include(JoinPaths)
5include(CheckCXXSymbolExists)
6
7# Converts the name of a library file (or framework on macOS) into an
8# appropriate linker flag (-lsomething or -framework something.framework).
9# Returns the input intact if its extension does not look like a shared or
10# static library extension.
11function(convert_library_file_to_flags output_variable input)
12  get_filename_component(input_filename ${input} NAME_WE)
13  get_filename_component(input_extension ${input} LAST_EXT)
14  if(input_extension STREQUAL ${CMAKE_SHARED_LIBRARY_SUFFIX} OR input_extension STREQUAL ${CMAKE_STATIC_LIBRARY_SUFFIX})
15    string(REGEX REPLACE "^${CMAKE_SHARED_LIBRARY_PREFIX}" "" input_stripped ${input_filename})
16    set("${output_variable}" "-l${input_stripped}" PARENT_SCOPE)
17  elseif(APPLE AND input_extension STREQUAL ".framework")
18    set("${output_variable}" "-framework ${input_filename}" PARENT_SCOPE)
19  else()
20    set("${output_variable}" "${input}" PARENT_SCOPE)
21  endif()
22endfunction()
23
24if(MATH_LIBRARY)
25  set(PKGCONFIG_LIBS_PRIVATE "-lm")
26else()
27  set(PKGCONFIG_LIBS_PRIVATE "")
28endif()
29
30if(NOT MSVC)
31  check_cxx_symbol_exists(_LIBCPP_VERSION "vector" USING_LIBCXX)
32  check_cxx_symbol_exists(__GLIBCXX__ "vector" USING_LIBSTDCXX)
33  if(USING_LIBCXX)
34    set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lc++")
35  elseif(USING_LIBSTDCXX)
36    set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lstdc++")
37  endif()
38endif()
39
40if(IGRAPH_GRAPHML_SUPPORT)
41  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lxml2 -lz")
42endif()
43if(NOT IGRAPH_USE_INTERNAL_GMP)
44  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lgmp")
45endif()
46if(NOT IGRAPH_USE_INTERNAL_BLAS)
47  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lblas")
48endif()
49if(NOT IGRAPH_USE_INTERNAL_CXSPARSE)
50  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lcxsparse")
51endif()
52if(IGRAPH_GLPK_SUPPORT AND NOT IGRAPH_USE_INTERNAL_GLPK)
53  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -lglpk")
54endif()
55if(NOT IGRAPH_USE_INTERNAL_LAPACK)
56  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -llapack")
57endif()
58if(NOT IGRAPH_USE_INTERNAL_ARPACK)
59  set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} -larpack")
60endif()
61if(IGRAPH_OPENMP_SUPPORT AND OpenMP_FOUND)
62  foreach(CURRENT_LIB ${OpenMP_C_LIB_NAMES})
63    convert_library_file_to_flags(CURRENT_LIB "${OpenMP_${CURRENT_LIB}_LIBRARY}")
64    set(PKGCONFIG_LIBS_PRIVATE "${PKGCONFIG_LIBS_PRIVATE} ${CURRENT_LIB}")
65  endforeach()
66endif()
67
68join_paths(PKGCONFIG_LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
69join_paths(PKGCONFIG_INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
70configure_file(
71  ${PROJECT_SOURCE_DIR}/igraph.pc.in
72  ${PROJECT_BINARY_DIR}/igraph.pc
73  @ONLY
74)
75