File: CheckSourceRuns.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 (198 lines) | stat: -rw-r--r-- 5,784 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
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.


#[=======================================================================[.rst:
CheckSourceRuns
-------------------

.. versionadded:: 3.19

This module provides a command to check whether a source code can be built
and run.

Load this module in a CMake project with:

.. code-block:: cmake

  include(CheckSourceRuns)

Commands
^^^^^^^^

This module provides the following command:

.. command:: check_source_runs

  Checks once whether the given source code compiles and links into an
  executable that can subsequently be run:

  .. code-block:: cmake

    check_source_runs(<lang> <code> <variable> [SRC_EXT <extension>])

  This command checks once that the ``<lang>`` source code supplied in
  ``<code>`` can be built, linked as an executable, and then run.  The
  result of the check is stored in the internal cache variable specified by
  ``<variable>``.

  The arguments are:

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

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

  ``<code>``
    The source code to be tested.  It must contain a valid source program.
    For example, it must contain at least a ``main()`` function (in C/C++),
    or a ``program`` unit (in Fortran).

  ``<variable>``
    Name of the internal cache variable with the result of the check.  If
    the code builds and runs with exit code ``0``, success is indicated by
    a boolean true value.  Failure to build or run is indicated by a boolean
    false value, such as an empty string or an error message.

  ``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

Examples
^^^^^^^^

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

The following example demonstrates how to use this module to check whether
the C source code is supported and operational at runtime.  The result of
the check is stored in the internal cache variable ``HAVE_NORETURN``.

.. code-block:: cmake

  include(CheckSourceRuns)

  check_source_runs(C "
    #include <stdlib.h>
    #include <stdnoreturn.h>
    noreturn void f(){ exit(0); }
    int main(void) { f(); return 1; }
  " HAVE_NORETURN)

Example: Checking Fortran Code
""""""""""""""""""""""""""""""

Checking if Fortran source code runs successfully:

.. code-block:: cmake

  include(CheckSourceRuns)

  check_source_runs(Fortran "
    program test
    real :: x[*]
    call co_sum(x)
    end program
  " HAVE_COARRAY)

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

The following example demonstrates how to check whether the C++ standard
library is functional and ``std::vector`` works at runtime.  If the source
compiles, links, and runs successfully, internal cache variable
``HAVE_WORKING_STD_VECTOR`` will be set to boolean true value.  Code is
supplied using :ref:`Bracket Argument` for easier embedded quotes handling:

.. code-block:: cmake
  :force:

  include(CheckSourceRuns)

  check_source_runs(CXX [[
    #include <iostream>
    #include <vector>

    int main()
    {
      std::vector<int> v = {1, 2, 3};
      if (v.size() != 3) return 1;
      std::cout << "Vector works correctly." << std::endl;
      return 0;
    }
  ]] HAVE_WORKING_STD_VECTOR)

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

In the following example, this module is used in combination with the
:module:`CMakePushCheckState` module to modify required compile definitions
and libraries when checking whether the C function ``sched_getcpu()`` is
supported and operational at runtime.  For example, on some systems, the
``sched_getcpu()`` function may be available at compile time but not actually
implemented by the kernel.  In such cases, it returns ``-1`` and sets
``errno`` to ``ENOSYS``.  This check verifies that ``sched_getcpu()`` runs
successfully and stores a boolean result in the internal cache variable
``HAVE_SCHED_GETCPU``.

.. code-block:: cmake

  include(CheckSourceRuns)
  include(CMakePushCheckState)

  cmake_push_check_state(RESET)
    set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)

    if(CMAKE_SYSTEM_NAME STREQUAL "Haiku")
      set(CMAKE_REQUIRED_LIBRARIES gnu)
    endif()

    check_source_runs(C "
      #include <sched.h>
      int main(void)
      {
        if (sched_getcpu() == -1) {
          return 1;
        }
        return 0;
      }
    " HAVE_SCHED_GETCPU)
  cmake_pop_check_state()

See Also
^^^^^^^^

* The :module:`CheckSourceCompiles` module to check whether a source code
  can be built.
#]=======================================================================]

include_guard(GLOBAL)
include(Internal/CheckSourceRuns)

function(CHECK_SOURCE_RUNS _lang _source _var)
  cmake_check_source_runs(${_lang} "${_source}" ${_var} ${ARGN})
endfunction()