# - define a bunch of backwards compatibility variables
#  CMAKE_ANSI_CXXFLAGS - flag for ansi c++ 
#  CMAKE_HAS_ANSI_STRING_STREAM - has <strstream>
#  INCLUDE(TestForANSIStreamHeaders)
#  INCLUDE(CheckIncludeFileCXX)
#  INCLUDE(TestForSTDNamespace)
#  INCLUDE(TestForANSIForScope)
IF(NOT CMAKE_SKIP_COMPATIBILITY_TESTS)
  # check for some ANSI flags in the CXX compiler if it is not gnu
  IF(NOT CMAKE_COMPILER_IS_GNUCXX)
    INCLUDE(TestCXXAcceptsFlag)
    SET(CMAKE_TRY_ANSI_CXX_FLAGS "")
    IF(CMAKE_SYSTEM MATCHES "IRIX.*")
      SET(CMAKE_TRY_ANSI_CXX_FLAGS "-LANG:std")
    ENDIF(CMAKE_SYSTEM MATCHES "IRIX.*")
    IF(CMAKE_SYSTEM MATCHES "OSF.*")
      SET(CMAKE_TRY_ANSI_CXX_FLAGS "-std strict_ansi -nopure_cname")
    ENDIF(CMAKE_SYSTEM MATCHES "OSF.*")
    # if CMAKE_TRY_ANSI_CXX_FLAGS has something in it, see
    # if the compiler accepts it
    IF( CMAKE_TRY_ANSI_CXX_FLAGS MATCHES ".+")
      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(CMAKE_CXX_ACCEPTS_FLAGS)
    ENDIF( CMAKE_TRY_ANSI_CXX_FLAGS MATCHES ".+")
  ENDIF(NOT CMAKE_COMPILER_IS_GNUCXX)
  SET(CMAKE_CXX_FLAGS_SAVE ${CMAKE_CXX_FLAGS})
  SET(CMAKE_CXX_FLAGS "${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(NOT CMAKE_SKIP_COMPATIBILITY_TESTS)

