| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| # file LICENSE.rst or https://cmake.org/licensing for details. |
| |
| #[=======================================================================[.rst: |
| CMakeBackwardCompatibilityCXX |
| ----------------------------- |
| |
| This module defines several backward compatibility cache variables for the |
| ``CXX`` language to support early C++ (pre-C++98, ANSI C++). |
| |
| Load this module in a CMake project with: |
| |
| .. code-block:: cmake |
| |
| include(CMakeBackwardCompatibilityCXX) |
| |
| The following modules are included by this module: |
| |
| * :module:`TestForANSIForScope` |
| * :module:`TestForANSIStreamHeaders` |
| * :module:`TestForSSTREAM` |
| * :module:`TestForSTDNamespace` |
| |
| Additionally, the following cache variable may be defined: |
| |
| ``CMAKE_ANSI_CXXFLAGS`` |
| A space-separated string of compiler options for enabling ANSI C++ mode, if |
| available. |
| |
| .. note:: |
| |
| This module is intended for C++ code written before ``C++ 98``. As of the |
| ``C++ 98`` standard, these issues have been formally addressed, making such |
| checks obsolete. |
| |
| Examples |
| ^^^^^^^^ |
| |
| Including this module provides backward compatibility cache variables, which |
| can be used in C++. For example: |
| |
| .. code-block:: cmake |
| :caption: ``CMakeLists.txt`` |
| |
| include(CMakeBackwardCompatibilityCXX) |
| file( |
| CONFIGURE |
| OUTPUT config.h |
| CONTENT [[ |
| #cmakedefine CMAKE_NO_ANSI_FOR_SCOPE |
| #cmakedefine CMAKE_NO_ANSI_STRING_STREAM |
| #cmakedefine CMAKE_NO_ANSI_STREAM_HEADERS |
| #cmakedefine CMAKE_NO_STD_NAMESPACE |
| ]] |
| ) |
| #]=======================================================================] |
| |
| if(NOT CMAKE_SKIP_COMPATIBILITY_TESTS) |
| # check for some ANSI flags in the CXX compiler if it is not gnu |
| if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
| include(TestCXXAcceptsFlag) |
| set(CMAKE_TRY_ANSI_CXX_FLAGS "") |
| if(CMAKE_SYSTEM_NAME MATCHES "OSF") |
| set(CMAKE_TRY_ANSI_CXX_FLAGS "-std strict_ansi -nopure_cname") |
| endif() |
| # if CMAKE_TRY_ANSI_CXX_FLAGS has something in it, see |
| # if the compiler accepts it |
| if(NOT CMAKE_TRY_ANSI_CXX_FLAGS STREQUAL "") |
| check_cxx_accepts_flag(${CMAKE_TRY_ANSI_CXX_FLAGS} CMAKE_CXX_ACCEPTS_FLAGS) |
| # if the compiler liked the flag then set CMAKE_ANSI_CXXFLAGS |
| # to the flag |
| if(CMAKE_CXX_ACCEPTS_FLAGS) |
| set(CMAKE_ANSI_CXXFLAGS ${CMAKE_TRY_ANSI_CXX_FLAGS} CACHE INTERNAL |
| "What flags are required by the c++ compiler to make it ansi." ) |
| endif() |
| endif() |
| endif() |
| set(CMAKE_CXX_FLAGS_SAVE ${CMAKE_CXX_FLAGS}) |
| string(APPEND CMAKE_CXX_FLAGS " ${CMAKE_ANSI_CXXFLAGS}") |
| include(TestForANSIStreamHeaders) |
| include(CheckIncludeFileCXX) |
| include(TestForSTDNamespace) |
| include(TestForANSIForScope) |
| include(TestForSSTREAM) |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_SAVE}") |
| endif() |