| # 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() |