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