File: CheckSourceCompiles.cmake

package info (click to toggle)
cmake 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 147,284 kB
  • sloc: ansic: 403,915; cpp: 290,772; sh: 4,102; python: 3,357; yacc: 3,106; lex: 1,189; f90: 532; asm: 471; lisp: 375; cs: 270; java: 266; fortran: 230; perl: 217; objc: 215; xml: 198; makefile: 97; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22
file content (206 lines) | stat: -rw-r--r-- 5,797 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.


#[=======================================================================[.rst:
CheckSourceCompiles
----------------------

.. versionadded:: 3.19

This module provides a command that checks whether a source code can be
built for a given language.

Load this module in a CMake project with:

.. code-block:: cmake

  include(CheckSourceCompiles)

Commands
^^^^^^^^

This module provides the following command:

.. command:: check_source_compiles

  Checks once whether the given source code can be built for the given
  language:

  .. code-block:: cmake

    check_source_compiles(
      <lang>
      <code>
      <variable>
      [FAIL_REGEX <regexes>...]
      [SRC_EXT <extension>]
    )

  This command checks once that the source supplied in ``<code>`` can be
  compiled (and linked into an executable) for code language ``<lang>``.
  The result of the check is stored in the internal cache variable specified
  by ``<variable>``.

  The arguments are:

  ``<lang>``
    Language of the source code to check.  Supported languages are:
    ``C``, ``CXX``, ``CUDA``, ``Fortran``, ``HIP``, ``ISPC``, ``OBJC``,
    ``OBJCXX``, and ``Swift``.

    .. versionadded:: 3.21
      Support for ``HIP`` language.

    .. versionadded:: 3.26
      Support for ``Swift`` language.

  ``<code>``
    The source code to check.  This must be an entire program, as written
    in a file containing the body block.  All symbols used in the source code
    are expected to be declared as usual in their corresponding headers.

  ``<variable>``
    Variable name of an internal cache variable to store the result of the
    check, with boolean true for success and boolean false for failure.

  ``FAIL_REGEX <regexes>...``
    If one or more regular expression patterns are provided, then failure is
    determined by checking if anything in the compiler output matches any of
    the specified regular expressions.

  ``SRC_EXT <extension>``
    By default, the internal test source file used for the check will be
    given a file extension that matches the requested language (e.g., ``.c``
    for C, ``.cxx`` for C++, ``.F90`` for Fortran, etc.).  This option can
    be used to override this with the ``.<extension>`` instead.

  .. rubric:: Variables Affecting the Check

  The following variables may be set before calling this command to modify
  the way the check is run:

  .. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst

  .. include:: /module/include/CMAKE_REQUIRED_DEFINITIONS.rst

  .. include:: /module/include/CMAKE_REQUIRED_INCLUDES.rst

  .. include:: /module/include/CMAKE_REQUIRED_LINK_OPTIONS.rst

  .. include:: /module/include/CMAKE_REQUIRED_LIBRARIES.rst

  .. include:: /module/include/CMAKE_REQUIRED_LINK_DIRECTORIES.rst

  .. include:: /module/include/CMAKE_REQUIRED_QUIET.rst

  .. include:: /module/include/CMAKE_TRY_COMPILE_TARGET_TYPE.rst

Examples
^^^^^^^^

Example: Basic Usage
""""""""""""""""""""

The following example demonstrates how to check whether the C++ compiler
supports a specific language feature using this module.  In this case, the
check verifies if the compiler supports ``C++11`` lambda expressions.  The
result is stored in the internal cache variable ``HAVE_CXX11_LAMBDAS``:

.. code-block:: cmake

  include(CheckSourceCompiles)

  check_source_compiles(CXX "
    int main()
    {
      auto lambda = []() { return 42; };
      return lambda();
    }
  " HAVE_CXX11_LAMBDAS)

Example: Checking Code With Bracket Argument
""""""""""""""""""""""""""""""""""""""""""""

The following example shows how to check whether the C compiler supports the
``noreturn`` attribute.  Code is supplied using the :ref:`Bracket Argument`
for easier embedded quotes handling:

.. code-block:: cmake
  :force:

  include(CheckSourceCompiles)

  check_source_compiles(C [[
    #if !__has_c_attribute(noreturn)
    #  error "No noreturn attribute"
    #endif
    int main(void) { return 0; }
  ]] HAVE_NORETURN)

Example: Performing a Check Without Linking
"""""""""""""""""""""""""""""""""""""""""""

In the following example, this module is used to perform a compile-only
check of Fortran source code, whether the compiler supports the ``pure``
procedure attribute:

.. code-block:: cmake

  include(CheckSourceCompiles)

  block()
    set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

    check_source_compiles(
      Fortran
      "pure subroutine foo()
      end subroutine"
      HAVE_PURE
    )
  endblock()

Example: Isolated Check
"""""""""""""""""""""""

In the following example, this module is used in combination with the
:module:`CMakePushCheckState` module to modify required libraries when
checking whether the PostgreSQL ``PGVerbosity`` enum contains
``PQERRORS_SQLSTATE`` (available as of PostgreSQL version 12):

.. code-block:: cmake

  include(CheckSourceCompiles)
  include(CMakePushCheckState)

  find_package(PostgreSQL)

  if(TARGET PostgreSQL::PostgreSQL)
    cmake_push_check_state(RESET)
      set(CMAKE_REQUIRED_LIBRARIES PostgreSQL::PostgreSQL)

      check_source_compiles(C "
        #include <libpq-fe.h>
        int main(void)
        {
          PGVerbosity e = PQERRORS_SQLSTATE;
          (void)e;
          return 0;
        }
      " HAVE_PQERRORS_SQLSTATE)
    cmake_pop_check_state()
  endif()

See Also
^^^^^^^^

* The :module:`CheckSourceRuns` module to check whether the source code can
  be built and also run.
#]=======================================================================]

include_guard(GLOBAL)
include(Internal/CheckSourceCompiles)

function(CHECK_SOURCE_COMPILES _lang _source _var)
  cmake_check_source_compiles(${_lang} "${_source}" ${_var} ${ARGN})
endfunction()