FindSWIG.cmake 5.41 KB
Newer Older
1
2
3
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

4
5
6
7
#[=======================================================================[.rst:
FindSWIG
--------

8
Find the Simplified Wrapper and Interface Generator (SWIG_) executable.
9

10
11
12
13
14
15
16
17
18
19
20
This module finds an installed SWIG and determines its version.

.. versionadded:: 3.18
  If a ``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` argument is given to the
  :command:`find_package` command, it will also determine supported target
  languages.

.. versionadded:: 3.19
  When a version is requested, it can be specified as a simple value or as a
  range. For a detailed description of version range usage and capabilities,
  refer to the :command:`find_package` command.
21
22

The module defines the following variables:
23

24
25
26
27
28
29
30
31
32
33
34
``SWIG_FOUND``
  Whether SWIG and any required components were found on the system.
``SWIG_EXECUTABLE``
  Path to the SWIG executable.
``SWIG_DIR``
  Path to the installed SWIG ``Lib`` directory (result of ``swig -swiglib``).
``SWIG_VERSION``
  SWIG executable version (result of ``swig -version``).
``SWIG_<lang>_FOUND``
  If ``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` are requested, each available
  target language ``<lang>`` (lowercase) will be set to TRUE.
35

36
37
38
Any ``COMPONENTS`` given to ``find_package`` should be the names of supported
target languages as provided to the LANGUAGE argument of ``swig_add_library``,
such as ``python`` or ``perl5``. Language names *must* be lowercase.
39

40
All information is collected from the ``SWIG_EXECUTABLE``, so the version
41
to be found can be changed from the command line by means of setting
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
``SWIG_EXECUTABLE``.

Example usage requiring SWIG 4.0 or higher and Python language support, with
optional Fortran support:

.. code-block:: cmake

   find_package(SWIG 4.0 COMPONENTS python OPTIONAL_COMPONENTS fortran)
   if(SWIG_FOUND)
     message("SWIG found: ${SWIG_EXECUTABLE}")
     if(NOT SWIG_fortran_FOUND)
       message(WARNING "SWIG Fortran bindings cannot be generated")
     endif()
   endif()

.. _`SWIG`: http://swig.org

59
#]=======================================================================]
60

61
# compute list of possible names
Marc Chevrier's avatar
Marc Chevrier committed
62
unset (_SWIG_NAMES)
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
if (SWIG_FIND_VERSION_RANGE)
  foreach (_SWIG_MAJOR IN ITEMS 4 3 2)
    if (_SWIG_MAJOR VERSION_GREATER_EQUAL SWIG_FIND_VERSION_MIN_MAJOR
        AND ((SWIG_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND _SWIG_MAJOR VERSION_LESS_EQUAL SWIG_FIND_VERSION_MAX)
        OR (SWIG_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND _SWIG_MAJOR VERSION_LESS SWIG_FIND_VERSION_MAX)))
      list (APPEND _SWIG_NAMES swig${_SWIG_MAJOR}.0)
    endif()
  endforeach()
elseif(SWIG_FIND_VERSION)
  if (SWIG_FIND_VERSION_EXACT)
    set(_SWIG_NAMES swig${SWIG_FIND_VERSION_MAJOR}.0)
  else()
    foreach (_SWIG_MAJOR IN ITEMS 4 3 2)
      if (_SWIG_MAJOR VERSION_GREATER_EQUAL SWIG_FIND_VERSION_MAJOR)
        list (APPEND _SWIG_NAMES swig${_SWIG_MAJOR}.0)
      endif()
Marc Chevrier's avatar
Marc Chevrier committed
79
    endforeach()
80
81
82
83
  endif()
else()
  set (_SWIG_NAMES swig4.0 swig3.0 swig2.0)
endif()
Marc Chevrier's avatar
Marc Chevrier committed
84
85
86
87
if (NOT _SWIG_NAMES)
  # try to find any version
  set (_SWIG_NAMES swig4.0 swig3.0 swig2.0)
endif()
88
89

find_program(SWIG_EXECUTABLE NAMES ${_SWIG_NAMES} swig)
90
unset(_SWIG_NAMES)
91

92
93
if(SWIG_EXECUTABLE AND NOT SWIG_DIR)
  # Find default value for SWIG library directory
94
  execute_process(COMMAND "${SWIG_EXECUTABLE}" -swiglib
95
96
97
    OUTPUT_VARIABLE _swig_output
    ERROR_VARIABLE _swig_error
    RESULT_VARIABLE _swig_result)
98

99
100
  if(_swig_result)
    set(_msg "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${_swig_error}")
101
    if(SWIG_FIND_REQUIRED)
102
      message(SEND_ERROR "${_msg}")
103
    else()
104
      message(STATUS "${_msg}")
105
    endif()
106
    unset(_msg)
107
  else()
108
    string(REGEX REPLACE "[\n\r]+" ";" _SWIG_LIB ${_swig_output})
109
  endif()
110

111
112
113
114
  # Find SWIG library directory
  find_path(SWIG_DIR swig.swg PATHS ${_SWIG_LIB} NO_CMAKE_FIND_ROOT_PATH)
  unset(_SWIG_LIB)
endif()
115
116
117

if(SWIG_EXECUTABLE AND SWIG_DIR AND NOT SWIG_VERSION)
  # Determine SWIG version
118
  execute_process(COMMAND "${SWIG_EXECUTABLE}" -version
119
120
121
122
123
124
125
126
127
    OUTPUT_VARIABLE _swig_output
    ERROR_VARIABLE _swig_output
    RESULT_VARIABLE _swig_result)
  if(_swig_result)
    message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -version\" failed with output:\n${_swig_output}")
  else()
    string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1"
      _swig_output "${_swig_output}")
    set(SWIG_VERSION ${_swig_output} CACHE STRING "Swig version" FORCE)
128
  endif()
129
endif()
130

131
if(SWIG_EXECUTABLE AND SWIG_FIND_COMPONENTS)
132
  execute_process(COMMAND "${SWIG_EXECUTABLE}" -help
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
    OUTPUT_VARIABLE _swig_output
    ERROR_VARIABLE _swig_error
    RESULT_VARIABLE _swig_result)
  if(_swig_result)
    message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -help\" failed with output:\n${_swig_error}")
  else()
    string(REPLACE "\n" ";" _swig_output "${_swig_output}")
    foreach(SWIG_line IN LISTS _swig_output)
      if(SWIG_line MATCHES "-([A-Za-z0-9_]+) +- *Generate.*wrappers")
        set(SWIG_${CMAKE_MATCH_1}_FOUND TRUE)
      endif()
    endforeach()
  endif()
endif()

unset(_swig_output)
unset(_swig_error)
unset(_swig_result)

152
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
153
154
155
find_package_handle_standard_args(
  SWIG HANDLE_COMPONENTS
  REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR
156
157
  VERSION_VAR SWIG_VERSION
  HANDLE_VERSION_RANGE)
158

159
160
161
162
if(SWIG_FOUND)
  set(SWIG_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseSWIG.cmake")
endif()

163
mark_as_advanced(SWIG_DIR SWIG_VERSION SWIG_EXECUTABLE)