File: FindParMETIS.cmake

package info (click to toggle)
dune-common 2.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,112 kB
  • sloc: cpp: 44,714; python: 3,480; sh: 1,590; makefile: 17
file content (129 lines) | stat: -rw-r--r-- 4,140 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
# SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception

#[=======================================================================[.rst:
FindParMETIS
------------

Find Parallel Graph Partitioning library
`ParMETIS <http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview>`_

Imported targets
^^^^^^^^^^^^^^^^

This module defines the following `IMPORTED`_ target:

``ParMETIS::ParMETIS``
  The libraries, flags, and includes to use for ParMETIS, if found.

.. _IMPORTED: https://cmake.org/cmake/help/latest/command/add_library.html#id5

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``ParMETIS_FOUND``
  The ParMETIS library with all its dependencies is found

Cache Variables
^^^^^^^^^^^^^^^

The following variables may be set to influence this module's behavior:

``PARMETIS_INCLUDE_DIR``
  Include directory where the parmetis.h is found.

``PARMETIS_LIBRARY``
  Full path to the ParMETIS library

#]=======================================================================]

# text for feature summary
include(FeatureSummary)
set_package_properties("ParMETIS" PROPERTIES
  DESCRIPTION "Parallel Graph Partitioning"
  URL "http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview"
)

find_path(PARMETIS_INCLUDE_DIR parmetis.h
  PATH_SUFFIXES parmetis)

# determine version of ParMETIS installation
find_file(PARMETIS_HEADER_FILE parmetis.h
  PATHS ${PARMETIS_INCLUDE_DIR}
  NO_DEFAULT_PATH)
if(PARMETIS_HEADER_FILE)
  file(READ "${PARMETIS_HEADER_FILE}" parmetisheader)
  string(REGEX REPLACE ".*#define PARMETIS_MAJOR_VERSION[ ]+([0-9]+).*" "\\1"
    ParMETIS_MAJOR_VERSION "${parmetisheader}")
  string(REGEX REPLACE ".*#define PARMETIS_MINOR_VERSION[ ]+([0-9]+).*" "\\1"
    ParMETIS_MINOR_VERSION "${parmetisheader}")
  if(ParMETIS_MAJOR_VERSION GREATER_EQUAL 0 AND ParMETIS_MINOR_VERSION GREATER_EQUAL 0)
    set(ParMETIS_VERSION "${ParMETIS_MAJOR_VERSION}.${ParMETIS_MINOR_VERSION}")
  endif()

  # test whether header file is actually the ptscotch-parmetis header
  string(FIND "${parmetisheader}" "SCOTCH_METIS_PREFIX" IS_PTSCOTCH_PARMETIS_HEADER)
  if(IS_PTSCOTCH_PARMETIS_HEADER EQUAL "-1")
    set(IS_PTSCOTCH_PARMETIS_HEADER FALSE)
  else()
    set(IS_PTSCOTCH_PARMETIS_HEADER TRUE)
  endif()
endif()
unset(PARMETIS_HEADER_FILE CACHE)


# search ParMETIS library
if(IS_PTSCOTCH_PARMETIS_HEADER)
  find_library(PARMETIS_LIBRARY ptscotchparmetis)
else()
  find_library(PARMETIS_LIBRARY parmetis)
endif()

mark_as_advanced(PARMETIS_INCLUDE_DIR PARMETIS_LIBRARY)

# minimal requires METIS version 5.0 for ParMETIS >= 4.0
if(ParMETIS_VERSION VERSION_GREATER_EQUAL "4.0")
  set(METIS_MIN_VERSION "5.0")
endif()

# find package dependencies first
find_package(METIS ${METIS_MIN_VERSION})
find_package(MPI COMPONENTS C)

# set a list of required dependencies for ParMETIS
set(PARMETIS_DEPENDENCIES METIS_FOUND MPI_FOUND)

# If ptscotch-parmetis is requested, find package PTScotch
if(IS_PTSCOTCH_PARMETIS_HEADER)
  find_package(PTScotch)
  set(HAVE_PTSCOTCH_PARMETIS ${PTScotch_PTSCOTCH_FOUND})
  list(APPEND PARMETIS_DEPENDENCIES PTScotch_PTSCOTCH_FOUND)
endif()

# behave like a CMake module is supposed to behave
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args("ParMETIS"
  REQUIRED_VARS
    PARMETIS_LIBRARY PARMETIS_INCLUDE_DIR ${PARMETIS_DEPENDENCIES}
  VERSION_VAR
    ParMETIS_VERSION
)

# create imported target ParMETIS::ParMETIS
if(PARMETIS_FOUND AND NOT TARGET ParMETIS::ParMETIS)
  add_library(ParMETIS::ParMETIS UNKNOWN IMPORTED)
  set_target_properties(ParMETIS::ParMETIS PROPERTIES
    IMPORTED_LOCATION ${PARMETIS_LIBRARY}
    INTERFACE_INCLUDE_DIRECTORIES ${PARMETIS_INCLUDE_DIR}
    INTERFACE_LINK_LIBRARIES "METIS::METIS;MPI::MPI_C"
    INTERFACE_COMPILE_DEFINITIONS "MPICH_SKIP_MPICXX;OMPI_SKIP_MPICXX"
  )

  # link against PTScotch if needed
  if(IS_PTSCOTCH_PARMETIS_HEADER AND PTScotch_PTSCOTCH_FOUND)
    set_property(TARGET ParMETIS::ParMETIS APPEND PROPERTY
      INTERFACE_LINK_LIBRARIES PTScotch::PTScotch)
  endif()
endif()