xref: /aosp_15_r20/external/eigen/cmake/FindPTSCOTCH.cmake (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li###
2*bf2c3715SXin Li#
3*bf2c3715SXin Li# @copyright (c) 2009-2014 The University of Tennessee and The University
4*bf2c3715SXin Li#                          of Tennessee Research Foundation.
5*bf2c3715SXin Li#                          All rights reserved.
6*bf2c3715SXin Li# @copyright (c) 2012-2016 Inria. All rights reserved.
7*bf2c3715SXin Li# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
8*bf2c3715SXin Li#
9*bf2c3715SXin Li###
10*bf2c3715SXin Li#
11*bf2c3715SXin Li# - Find PTSCOTCH include dirs and libraries
12*bf2c3715SXin Li# Use this module by invoking find_package with the form:
13*bf2c3715SXin Li#  find_package(PTSCOTCH
14*bf2c3715SXin Li#               [REQUIRED]             # Fail with error if ptscotch is not found
15*bf2c3715SXin Li#               [COMPONENTS <comp1> <comp2> ...] # dependencies
16*bf2c3715SXin Li#              )
17*bf2c3715SXin Li#
18*bf2c3715SXin Li#  PTSCOTCH depends on the following libraries:
19*bf2c3715SXin Li#   - Threads
20*bf2c3715SXin Li#   - MPI
21*bf2c3715SXin Li#
22*bf2c3715SXin Li#  COMPONENTS can be some of the following:
23*bf2c3715SXin Li#   - ESMUMPS: to activate detection of PT-Scotch with the esmumps interface
24*bf2c3715SXin Li#
25*bf2c3715SXin Li# This module finds headers and ptscotch library.
26*bf2c3715SXin Li# Results are reported in variables:
27*bf2c3715SXin Li#  PTSCOTCH_FOUND            - True if headers and requested libraries were found
28*bf2c3715SXin Li#  PTSCOTCH_LINKER_FLAGS     - list of required linker flags (excluding -l and -L)
29*bf2c3715SXin Li#  PTSCOTCH_INCLUDE_DIRS     - ptscotch include directories
30*bf2c3715SXin Li#  PTSCOTCH_LIBRARY_DIRS     - Link directories for ptscotch libraries
31*bf2c3715SXin Li#  PTSCOTCH_LIBRARIES        - ptscotch component libraries to be linked
32*bf2c3715SXin Li#  PTSCOTCH_INCLUDE_DIRS_DEP - ptscotch + dependencies include directories
33*bf2c3715SXin Li#  PTSCOTCH_LIBRARY_DIRS_DEP - ptscotch + dependencies link directories
34*bf2c3715SXin Li#  PTSCOTCH_LIBRARIES_DEP    - ptscotch libraries + dependencies
35*bf2c3715SXin Li#  PTSCOTCH_INTSIZE          - Number of octets occupied by a SCOTCH_Num
36*bf2c3715SXin Li#
37*bf2c3715SXin Li# The user can give specific paths where to find the libraries adding cmake
38*bf2c3715SXin Li# options at configure (ex: cmake path/to/project -DPTSCOTCH=path/to/ptscotch):
39*bf2c3715SXin Li#  PTSCOTCH_DIR              - Where to find the base directory of ptscotch
40*bf2c3715SXin Li#  PTSCOTCH_INCDIR           - Where to find the header files
41*bf2c3715SXin Li#  PTSCOTCH_LIBDIR           - Where to find the library files
42*bf2c3715SXin Li# The module can also look for the following environment variables if paths
43*bf2c3715SXin Li# are not given as cmake variable: PTSCOTCH_DIR, PTSCOTCH_INCDIR, PTSCOTCH_LIBDIR
44*bf2c3715SXin Li
45*bf2c3715SXin Li#=============================================================================
46*bf2c3715SXin Li# Copyright 2012-2013 Inria
47*bf2c3715SXin Li# Copyright 2012-2013 Emmanuel Agullo
48*bf2c3715SXin Li# Copyright 2012-2013 Mathieu Faverge
49*bf2c3715SXin Li# Copyright 2012      Cedric Castagnede
50*bf2c3715SXin Li# Copyright 2013-2016 Florent Pruvost
51*bf2c3715SXin Li#
52*bf2c3715SXin Li# Distributed under the OSI-approved BSD License (the "License");
53*bf2c3715SXin Li# see accompanying file MORSE-Copyright.txt for details.
54*bf2c3715SXin Li#
55*bf2c3715SXin Li# This software is distributed WITHOUT ANY WARRANTY; without even the
56*bf2c3715SXin Li# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
57*bf2c3715SXin Li# See the License for more information.
58*bf2c3715SXin Li#=============================================================================
59*bf2c3715SXin Li# (To distribute this file outside of Morse, substitute the full
60*bf2c3715SXin Li#  License text for the above reference.)
61*bf2c3715SXin Li
62*bf2c3715SXin Liif (NOT PTSCOTCH_FOUND)
63*bf2c3715SXin Li  set(PTSCOTCH_DIR "" CACHE PATH "Installation directory of PTSCOTCH library")
64*bf2c3715SXin Li  if (NOT PTSCOTCH_FIND_QUIETLY)
65*bf2c3715SXin Li    message(STATUS "A cache variable, namely PTSCOTCH_DIR, has been set to specify the install directory of PTSCOTCH")
66*bf2c3715SXin Li  endif()
67*bf2c3715SXin Liendif()
68*bf2c3715SXin Li
69*bf2c3715SXin Li# Set the version to find
70*bf2c3715SXin Liset(PTSCOTCH_LOOK_FOR_ESMUMPS OFF)
71*bf2c3715SXin Li
72*bf2c3715SXin Liif( PTSCOTCH_FIND_COMPONENTS )
73*bf2c3715SXin Li  foreach( component ${PTSCOTCH_FIND_COMPONENTS} )
74*bf2c3715SXin Li    if (${component} STREQUAL "ESMUMPS")
75*bf2c3715SXin Li      # means we look for esmumps library
76*bf2c3715SXin Li      set(PTSCOTCH_LOOK_FOR_ESMUMPS ON)
77*bf2c3715SXin Li    endif()
78*bf2c3715SXin Li  endforeach()
79*bf2c3715SXin Liendif()
80*bf2c3715SXin Li
81*bf2c3715SXin Li# PTSCOTCH depends on Threads, try to find it
82*bf2c3715SXin Liinclude(CMakeFindDependencyMacro)
83*bf2c3715SXin Liif (NOT THREADS_FOUND)
84*bf2c3715SXin Li  if (PTSCOTCH_FIND_REQUIRED)
85*bf2c3715SXin Li    find_dependency(Threads REQUIRED)
86*bf2c3715SXin Li  else()
87*bf2c3715SXin Li    find_dependency(Threads)
88*bf2c3715SXin Li  endif()
89*bf2c3715SXin Liendif()
90*bf2c3715SXin Li
91*bf2c3715SXin Li# PTSCOTCH depends on MPI, try to find it
92*bf2c3715SXin Liif (NOT MPI_FOUND)
93*bf2c3715SXin Li  if (PTSCOTCH_FIND_REQUIRED)
94*bf2c3715SXin Li    find_dependency(MPI REQUIRED)
95*bf2c3715SXin Li  else()
96*bf2c3715SXin Li    find_dependency(MPI)
97*bf2c3715SXin Li  endif()
98*bf2c3715SXin Liendif()
99*bf2c3715SXin Li
100*bf2c3715SXin Li# Looking for include
101*bf2c3715SXin Li# -------------------
102*bf2c3715SXin Li
103*bf2c3715SXin Li# Add system include paths to search include
104*bf2c3715SXin Li# ------------------------------------------
105*bf2c3715SXin Liunset(_inc_env)
106*bf2c3715SXin Liset(ENV_PTSCOTCH_DIR "$ENV{PTSCOTCH_DIR}")
107*bf2c3715SXin Liset(ENV_PTSCOTCH_INCDIR "$ENV{PTSCOTCH_INCDIR}")
108*bf2c3715SXin Liif(ENV_PTSCOTCH_INCDIR)
109*bf2c3715SXin Li  list(APPEND _inc_env "${ENV_PTSCOTCH_INCDIR}")
110*bf2c3715SXin Lielseif(ENV_PTSCOTCH_DIR)
111*bf2c3715SXin Li  list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}")
112*bf2c3715SXin Li  list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}/include")
113*bf2c3715SXin Li  list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}/include/ptscotch")
114*bf2c3715SXin Lielse()
115*bf2c3715SXin Li  if(WIN32)
116*bf2c3715SXin Li    string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}")
117*bf2c3715SXin Li  else()
118*bf2c3715SXin Li    string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}")
119*bf2c3715SXin Li    list(APPEND _inc_env "${_path_env}")
120*bf2c3715SXin Li    string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}")
121*bf2c3715SXin Li    list(APPEND _inc_env "${_path_env}")
122*bf2c3715SXin Li    string(REPLACE ":" ";" _path_env "$ENV{CPATH}")
123*bf2c3715SXin Li    list(APPEND _inc_env "${_path_env}")
124*bf2c3715SXin Li    string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}")
125*bf2c3715SXin Li    list(APPEND _inc_env "${_path_env}")
126*bf2c3715SXin Li  endif()
127*bf2c3715SXin Liendif()
128*bf2c3715SXin Lilist(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}")
129*bf2c3715SXin Lilist(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}")
130*bf2c3715SXin Lilist(REMOVE_DUPLICATES _inc_env)
131*bf2c3715SXin Li
132*bf2c3715SXin Li
133*bf2c3715SXin Li# Try to find the ptscotch header in the given paths
134*bf2c3715SXin Li# -------------------------------------------------
135*bf2c3715SXin Li
136*bf2c3715SXin Liset(PTSCOTCH_hdrs_to_find "ptscotch.h;scotch.h")
137*bf2c3715SXin Li
138*bf2c3715SXin Li# call cmake macro to find the header path
139*bf2c3715SXin Liif(PTSCOTCH_INCDIR)
140*bf2c3715SXin Li  foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
141*bf2c3715SXin Li    set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND")
142*bf2c3715SXin Li    find_path(PTSCOTCH_${ptscotch_hdr}_DIRS
143*bf2c3715SXin Li      NAMES ${ptscotch_hdr}
144*bf2c3715SXin Li      HINTS ${PTSCOTCH_INCDIR})
145*bf2c3715SXin Li    mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS)
146*bf2c3715SXin Li  endforeach()
147*bf2c3715SXin Lielse()
148*bf2c3715SXin Li  if(PTSCOTCH_DIR)
149*bf2c3715SXin Li    foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
150*bf2c3715SXin Li      set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND")
151*bf2c3715SXin Li      find_path(PTSCOTCH_${ptscotch_hdr}_DIRS
152*bf2c3715SXin Li        NAMES ${ptscotch_hdr}
153*bf2c3715SXin Li        HINTS ${PTSCOTCH_DIR}
154*bf2c3715SXin Li        PATH_SUFFIXES "include" "include/scotch")
155*bf2c3715SXin Li      mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS)
156*bf2c3715SXin Li    endforeach()
157*bf2c3715SXin Li  else()
158*bf2c3715SXin Li    foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
159*bf2c3715SXin Li      set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND")
160*bf2c3715SXin Li      find_path(PTSCOTCH_${ptscotch_hdr}_DIRS
161*bf2c3715SXin Li        NAMES ${ptscotch_hdr}
162*bf2c3715SXin Li        HINTS ${_inc_env}
163*bf2c3715SXin Li        PATH_SUFFIXES "scotch")
164*bf2c3715SXin Li      mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS)
165*bf2c3715SXin Li    endforeach()
166*bf2c3715SXin Li  endif()
167*bf2c3715SXin Liendif()
168*bf2c3715SXin Li
169*bf2c3715SXin Li# If found, add path to cmake variable
170*bf2c3715SXin Li# ------------------------------------
171*bf2c3715SXin Liforeach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
172*bf2c3715SXin Li  if (PTSCOTCH_${ptscotch_hdr}_DIRS)
173*bf2c3715SXin Li    list(APPEND PTSCOTCH_INCLUDE_DIRS "${PTSCOTCH_${ptscotch_hdr}_DIRS}")
174*bf2c3715SXin Li  else ()
175*bf2c3715SXin Li    if (NOT PTSCOTCH_FIND_QUIETLY)
176*bf2c3715SXin Li      message(STATUS "Looking for ptscotch -- ${ptscotch_hdr} not found")
177*bf2c3715SXin Li    endif()
178*bf2c3715SXin Li  endif()
179*bf2c3715SXin Liendforeach()
180*bf2c3715SXin Lilist(REMOVE_DUPLICATES PTSCOTCH_INCLUDE_DIRS)
181*bf2c3715SXin Li
182*bf2c3715SXin Li# Looking for lib
183*bf2c3715SXin Li# ---------------
184*bf2c3715SXin Li
185*bf2c3715SXin Li# Add system library paths to search lib
186*bf2c3715SXin Li# --------------------------------------
187*bf2c3715SXin Liunset(_lib_env)
188*bf2c3715SXin Liset(ENV_PTSCOTCH_LIBDIR "$ENV{PTSCOTCH_LIBDIR}")
189*bf2c3715SXin Liif(ENV_PTSCOTCH_LIBDIR)
190*bf2c3715SXin Li  list(APPEND _lib_env "${ENV_PTSCOTCH_LIBDIR}")
191*bf2c3715SXin Lielseif(ENV_PTSCOTCH_DIR)
192*bf2c3715SXin Li  list(APPEND _lib_env "${ENV_PTSCOTCH_DIR}")
193*bf2c3715SXin Li  list(APPEND _lib_env "${ENV_PTSCOTCH_DIR}/lib")
194*bf2c3715SXin Lielse()
195*bf2c3715SXin Li  if(WIN32)
196*bf2c3715SXin Li    string(REPLACE ":" ";" _lib_env "$ENV{LIB}")
197*bf2c3715SXin Li  else()
198*bf2c3715SXin Li    if(APPLE)
199*bf2c3715SXin Li      string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}")
200*bf2c3715SXin Li    else()
201*bf2c3715SXin Li      string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}")
202*bf2c3715SXin Li    endif()
203*bf2c3715SXin Li    list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
204*bf2c3715SXin Li    list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
205*bf2c3715SXin Li  endif()
206*bf2c3715SXin Liendif()
207*bf2c3715SXin Lilist(REMOVE_DUPLICATES _lib_env)
208*bf2c3715SXin Li
209*bf2c3715SXin Li# Try to find the ptscotch lib in the given paths
210*bf2c3715SXin Li# ----------------------------------------------
211*bf2c3715SXin Li
212*bf2c3715SXin Liset(PTSCOTCH_libs_to_find "ptscotch;ptscotcherr")
213*bf2c3715SXin Liif (PTSCOTCH_LOOK_FOR_ESMUMPS)
214*bf2c3715SXin Li  list(INSERT PTSCOTCH_libs_to_find 0 "ptesmumps")
215*bf2c3715SXin Li  list(APPEND PTSCOTCH_libs_to_find   "esmumps"  )
216*bf2c3715SXin Liendif()
217*bf2c3715SXin Lilist(APPEND PTSCOTCH_libs_to_find "scotch;scotcherr")
218*bf2c3715SXin Li
219*bf2c3715SXin Li# call cmake macro to find the lib path
220*bf2c3715SXin Liif(PTSCOTCH_LIBDIR)
221*bf2c3715SXin Li  foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
222*bf2c3715SXin Li    set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND")
223*bf2c3715SXin Li    find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY
224*bf2c3715SXin Li      NAMES ${ptscotch_lib}
225*bf2c3715SXin Li      HINTS ${PTSCOTCH_LIBDIR})
226*bf2c3715SXin Li  endforeach()
227*bf2c3715SXin Lielse()
228*bf2c3715SXin Li  if(PTSCOTCH_DIR)
229*bf2c3715SXin Li    foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
230*bf2c3715SXin Li      set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND")
231*bf2c3715SXin Li      find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY
232*bf2c3715SXin Li        NAMES ${ptscotch_lib}
233*bf2c3715SXin Li        HINTS ${PTSCOTCH_DIR}
234*bf2c3715SXin Li        PATH_SUFFIXES lib lib32 lib64)
235*bf2c3715SXin Li    endforeach()
236*bf2c3715SXin Li  else()
237*bf2c3715SXin Li    foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
238*bf2c3715SXin Li      set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND")
239*bf2c3715SXin Li      find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY
240*bf2c3715SXin Li        NAMES ${ptscotch_lib}
241*bf2c3715SXin Li        HINTS ${_lib_env})
242*bf2c3715SXin Li    endforeach()
243*bf2c3715SXin Li  endif()
244*bf2c3715SXin Liendif()
245*bf2c3715SXin Li
246*bf2c3715SXin Liset(PTSCOTCH_LIBRARIES "")
247*bf2c3715SXin Liset(PTSCOTCH_LIBRARY_DIRS "")
248*bf2c3715SXin Li# If found, add path to cmake variable
249*bf2c3715SXin Li# ------------------------------------
250*bf2c3715SXin Liforeach(ptscotch_lib ${PTSCOTCH_libs_to_find})
251*bf2c3715SXin Li
252*bf2c3715SXin Li  if (PTSCOTCH_${ptscotch_lib}_LIBRARY)
253*bf2c3715SXin Li    get_filename_component(${ptscotch_lib}_lib_path "${PTSCOTCH_${ptscotch_lib}_LIBRARY}" PATH)
254*bf2c3715SXin Li    # set cmake variables
255*bf2c3715SXin Li    list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}")
256*bf2c3715SXin Li    list(APPEND PTSCOTCH_LIBRARY_DIRS "${${ptscotch_lib}_lib_path}")
257*bf2c3715SXin Li  else ()
258*bf2c3715SXin Li    if (NOT PTSCOTCH_FIND_QUIETLY)
259*bf2c3715SXin Li      message(STATUS "Looking for ptscotch -- lib ${ptscotch_lib} not found")
260*bf2c3715SXin Li    endif()
261*bf2c3715SXin Li  endif ()
262*bf2c3715SXin Li
263*bf2c3715SXin Li  mark_as_advanced(PTSCOTCH_${ptscotch_lib}_LIBRARY)
264*bf2c3715SXin Li
265*bf2c3715SXin Liendforeach()
266*bf2c3715SXin Lilist(REMOVE_DUPLICATES PTSCOTCH_LIBRARY_DIRS)
267*bf2c3715SXin Li
268*bf2c3715SXin Li# check a function to validate the find
269*bf2c3715SXin Liif(PTSCOTCH_LIBRARIES)
270*bf2c3715SXin Li
271*bf2c3715SXin Li  set(REQUIRED_LDFLAGS)
272*bf2c3715SXin Li  set(REQUIRED_INCDIRS)
273*bf2c3715SXin Li  set(REQUIRED_LIBDIRS)
274*bf2c3715SXin Li  set(REQUIRED_LIBS)
275*bf2c3715SXin Li
276*bf2c3715SXin Li  # PTSCOTCH
277*bf2c3715SXin Li  if (PTSCOTCH_INCLUDE_DIRS)
278*bf2c3715SXin Li    set(REQUIRED_INCDIRS  "${PTSCOTCH_INCLUDE_DIRS}")
279*bf2c3715SXin Li  endif()
280*bf2c3715SXin Li  if (PTSCOTCH_LIBRARY_DIRS)
281*bf2c3715SXin Li    set(REQUIRED_LIBDIRS "${PTSCOTCH_LIBRARY_DIRS}")
282*bf2c3715SXin Li  endif()
283*bf2c3715SXin Li  set(REQUIRED_LIBS "${PTSCOTCH_LIBRARIES}")
284*bf2c3715SXin Li  # MPI
285*bf2c3715SXin Li  if (MPI_FOUND)
286*bf2c3715SXin Li    if (MPI_C_INCLUDE_PATH)
287*bf2c3715SXin Li      list(APPEND CMAKE_REQUIRED_INCLUDES "${MPI_C_INCLUDE_PATH}")
288*bf2c3715SXin Li    endif()
289*bf2c3715SXin Li    if (MPI_C_LINK_FLAGS)
290*bf2c3715SXin Li      if (${MPI_C_LINK_FLAGS} MATCHES "  -")
291*bf2c3715SXin Li	string(REGEX REPLACE " -" "-" MPI_C_LINK_FLAGS ${MPI_C_LINK_FLAGS})
292*bf2c3715SXin Li      endif()
293*bf2c3715SXin Li      list(APPEND REQUIRED_LDFLAGS "${MPI_C_LINK_FLAGS}")
294*bf2c3715SXin Li    endif()
295*bf2c3715SXin Li    list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}")
296*bf2c3715SXin Li  endif()
297*bf2c3715SXin Li  # THREADS
298*bf2c3715SXin Li  if(CMAKE_THREAD_LIBS_INIT)
299*bf2c3715SXin Li    list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}")
300*bf2c3715SXin Li  endif()
301*bf2c3715SXin Li  set(Z_LIBRARY "Z_LIBRARY-NOTFOUND")
302*bf2c3715SXin Li  find_library(Z_LIBRARY NAMES z)
303*bf2c3715SXin Li  mark_as_advanced(Z_LIBRARY)
304*bf2c3715SXin Li  if(Z_LIBRARY)
305*bf2c3715SXin Li    list(APPEND REQUIRED_LIBS "-lz")
306*bf2c3715SXin Li  endif()
307*bf2c3715SXin Li  set(M_LIBRARY "M_LIBRARY-NOTFOUND")
308*bf2c3715SXin Li  find_library(M_LIBRARY NAMES m)
309*bf2c3715SXin Li  mark_as_advanced(M_LIBRARY)
310*bf2c3715SXin Li  if(M_LIBRARY)
311*bf2c3715SXin Li    list(APPEND REQUIRED_LIBS "-lm")
312*bf2c3715SXin Li  endif()
313*bf2c3715SXin Li  set(RT_LIBRARY "RT_LIBRARY-NOTFOUND")
314*bf2c3715SXin Li  find_library(RT_LIBRARY NAMES rt)
315*bf2c3715SXin Li  mark_as_advanced(RT_LIBRARY)
316*bf2c3715SXin Li  if(RT_LIBRARY)
317*bf2c3715SXin Li    list(APPEND REQUIRED_LIBS "-lrt")
318*bf2c3715SXin Li  endif()
319*bf2c3715SXin Li
320*bf2c3715SXin Li  # set required libraries for link
321*bf2c3715SXin Li  set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}")
322*bf2c3715SXin Li  set(CMAKE_REQUIRED_LIBRARIES)
323*bf2c3715SXin Li  list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}")
324*bf2c3715SXin Li  foreach(lib_dir ${REQUIRED_LIBDIRS})
325*bf2c3715SXin Li    list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}")
326*bf2c3715SXin Li  endforeach()
327*bf2c3715SXin Li  list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}")
328*bf2c3715SXin Li  list(APPEND CMAKE_REQUIRED_FLAGS "${REQUIRED_FLAGS}")
329*bf2c3715SXin Li  string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
330*bf2c3715SXin Li
331*bf2c3715SXin Li  # test link
332*bf2c3715SXin Li  unset(PTSCOTCH_WORKS CACHE)
333*bf2c3715SXin Li  include(CheckFunctionExists)
334*bf2c3715SXin Li  check_function_exists(SCOTCH_dgraphInit PTSCOTCH_WORKS)
335*bf2c3715SXin Li  mark_as_advanced(PTSCOTCH_WORKS)
336*bf2c3715SXin Li
337*bf2c3715SXin Li  if(PTSCOTCH_WORKS)
338*bf2c3715SXin Li    # save link with dependencies
339*bf2c3715SXin Li    set(PTSCOTCH_LIBRARIES_DEP "${REQUIRED_LIBS}")
340*bf2c3715SXin Li    set(PTSCOTCH_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}")
341*bf2c3715SXin Li    set(PTSCOTCH_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}")
342*bf2c3715SXin Li    set(PTSCOTCH_LINKER_FLAGS "${REQUIRED_LDFLAGS}")
343*bf2c3715SXin Li    list(REMOVE_DUPLICATES PTSCOTCH_LIBRARY_DIRS_DEP)
344*bf2c3715SXin Li    list(REMOVE_DUPLICATES PTSCOTCH_INCLUDE_DIRS_DEP)
345*bf2c3715SXin Li    list(REMOVE_DUPLICATES PTSCOTCH_LINKER_FLAGS)
346*bf2c3715SXin Li  else()
347*bf2c3715SXin Li    if(NOT PTSCOTCH_FIND_QUIETLY)
348*bf2c3715SXin Li      message(STATUS "Looking for PTSCOTCH : test of SCOTCH_dgraphInit with PTSCOTCH library fails")
349*bf2c3715SXin Li      message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}")
350*bf2c3715SXin Li      message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}")
351*bf2c3715SXin Li      message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails")
352*bf2c3715SXin Li    endif()
353*bf2c3715SXin Li  endif()
354*bf2c3715SXin Li  set(CMAKE_REQUIRED_INCLUDES)
355*bf2c3715SXin Li  set(CMAKE_REQUIRED_FLAGS)
356*bf2c3715SXin Li  set(CMAKE_REQUIRED_LIBRARIES)
357*bf2c3715SXin Liendif()
358*bf2c3715SXin Li
359*bf2c3715SXin Liif (PTSCOTCH_LIBRARIES)
360*bf2c3715SXin Li  list(GET PTSCOTCH_LIBRARIES 0 first_lib)
361*bf2c3715SXin Li  get_filename_component(first_lib_path "${first_lib}" PATH)
362*bf2c3715SXin Li  if (${first_lib_path} MATCHES "/lib(32|64)?$")
363*bf2c3715SXin Li    string(REGEX REPLACE "/lib(32|64)?$" "" not_cached_dir "${first_lib_path}")
364*bf2c3715SXin Li    set(PTSCOTCH_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of PTSCOTCH library" FORCE)
365*bf2c3715SXin Li  else()
366*bf2c3715SXin Li    set(PTSCOTCH_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of PTSCOTCH library" FORCE)
367*bf2c3715SXin Li  endif()
368*bf2c3715SXin Liendif()
369*bf2c3715SXin Limark_as_advanced(PTSCOTCH_DIR)
370*bf2c3715SXin Limark_as_advanced(PTSCOTCH_DIR_FOUND)
371*bf2c3715SXin Li
372*bf2c3715SXin Li# Check the size of SCOTCH_Num
373*bf2c3715SXin Li# ---------------------------------
374*bf2c3715SXin Liset(CMAKE_REQUIRED_INCLUDES ${PTSCOTCH_INCLUDE_DIRS})
375*bf2c3715SXin Li
376*bf2c3715SXin Liinclude(CheckCSourceRuns)
377*bf2c3715SXin Li#stdio.h and stdint.h should be included by scotch.h directly
378*bf2c3715SXin Liset(PTSCOTCH_C_TEST_SCOTCH_Num_4 "
379*bf2c3715SXin Li#include <stdio.h>
380*bf2c3715SXin Li#include <stdint.h>
381*bf2c3715SXin Li#include <ptscotch.h>
382*bf2c3715SXin Liint main(int argc, char **argv) {
383*bf2c3715SXin Li  if (sizeof(SCOTCH_Num) == 4)
384*bf2c3715SXin Li    return 0;
385*bf2c3715SXin Li  else
386*bf2c3715SXin Li    return 1;
387*bf2c3715SXin Li}
388*bf2c3715SXin Li")
389*bf2c3715SXin Li
390*bf2c3715SXin Liset(PTSCOTCH_C_TEST_SCOTCH_Num_8 "
391*bf2c3715SXin Li#include <stdio.h>
392*bf2c3715SXin Li#include <stdint.h>
393*bf2c3715SXin Li#include <ptscotch.h>
394*bf2c3715SXin Liint main(int argc, char **argv) {
395*bf2c3715SXin Li  if (sizeof(SCOTCH_Num) == 8)
396*bf2c3715SXin Li    return 0;
397*bf2c3715SXin Li  else
398*bf2c3715SXin Li    return 1;
399*bf2c3715SXin Li}
400*bf2c3715SXin Li")
401*bf2c3715SXin Licheck_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_4}" PTSCOTCH_Num_4)
402*bf2c3715SXin Liif(NOT PTSCOTCH_Num_4)
403*bf2c3715SXin Li  check_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_8}" PTSCOTCH_Num_8)
404*bf2c3715SXin Li  if(NOT PTSCOTCH_Num_8)
405*bf2c3715SXin Li    set(PTSCOTCH_INTSIZE -1)
406*bf2c3715SXin Li  else()
407*bf2c3715SXin Li    set(PTSCOTCH_INTSIZE 8)
408*bf2c3715SXin Li  endif()
409*bf2c3715SXin Lielse()
410*bf2c3715SXin Li  set(PTSCOTCH_INTSIZE 4)
411*bf2c3715SXin Liendif()
412*bf2c3715SXin Liset(CMAKE_REQUIRED_INCLUDES "")
413*bf2c3715SXin Li
414*bf2c3715SXin Li# check that PTSCOTCH has been found
415*bf2c3715SXin Li# ---------------------------------
416*bf2c3715SXin Liinclude(FindPackageHandleStandardArgs)
417*bf2c3715SXin Lifind_package_handle_standard_args(PTSCOTCH DEFAULT_MSG
418*bf2c3715SXin Li  PTSCOTCH_LIBRARIES
419*bf2c3715SXin Li  PTSCOTCH_WORKS)
420*bf2c3715SXin Li#
421*bf2c3715SXin Li# TODO: Add possibility to check for specific functions in the library
422*bf2c3715SXin Li#
423