2016-09-27 19:01:08 +00:00
|
|
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
2009-09-28 15:43:28 +00:00
|
|
|
|
2007-05-10 18:08:15 +00:00
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# set some special flags for different compilers
|
|
|
|
#
|
2014-10-14 14:25:32 +00:00
|
|
|
if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
2012-08-13 17:47:32 +00:00
|
|
|
set(_INTEL_WINDOWS 1)
|
|
|
|
endif()
|
2009-10-28 12:42:20 +00:00
|
|
|
|
2019-05-29 16:03:34 +00:00
|
|
|
if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Clang"
|
|
|
|
AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
|
|
|
|
set(_CLANG_MSVC_WINDOWS 1)
|
|
|
|
endif()
|
|
|
|
|
2007-05-10 18:08:15 +00:00
|
|
|
# Disable deprecation warnings for standard C functions.
|
2009-06-25 20:41:57 +00:00
|
|
|
# really only needed for newer versions of VS, but should
|
2012-08-13 17:42:58 +00:00
|
|
|
# not hurt other versions, and this will work into the
|
2009-06-25 20:41:57 +00:00
|
|
|
# future
|
2019-05-29 16:03:34 +00:00
|
|
|
if(MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS)
|
2012-08-13 17:47:32 +00:00
|
|
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
|
|
|
|
else()
|
|
|
|
endif()
|
2018-01-30 19:37:23 +00:00
|
|
|
|
|
|
|
if(MSVC)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stack:10000000")
|
|
|
|
endif()
|
2007-05-10 18:08:15 +00:00
|
|
|
|
2019-05-29 16:03:34 +00:00
|
|
|
if(_CLANG_MSVC_WINDOWS AND "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
|
2019-02-20 11:19:58 +00:00
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker -stack:20000000")
|
|
|
|
endif()
|
|
|
|
|
2007-05-10 18:08:15 +00:00
|
|
|
#silence duplicate symbol warnings on AIX
|
2014-04-11 16:27:01 +00:00
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "AIX")
|
2012-08-13 17:47:32 +00:00
|
|
|
if(NOT CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -bhalt:5 ")
|
2012-08-13 17:50:14 +00:00
|
|
|
endif()
|
|
|
|
endif()
|
2007-05-10 18:08:15 +00:00
|
|
|
|
2014-04-11 16:17:46 +00:00
|
|
|
if(CMAKE_SYSTEM MATCHES "OSF1-V")
|
2012-08-13 17:47:32 +00:00
|
|
|
if(NOT CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local -no_implicit_include ")
|
2012-08-13 17:50:14 +00:00
|
|
|
endif()
|
|
|
|
endif()
|
2007-05-10 18:08:15 +00:00
|
|
|
|
2014-11-04 16:01:56 +00:00
|
|
|
# Workaround for short jump tables on PA-RISC
|
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^parisc")
|
2016-09-14 14:11:43 +00:00
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
2014-11-04 16:01:56 +00:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-calls")
|
|
|
|
endif()
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-calls")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2019-02-27 17:31:57 +00:00
|
|
|
# Workaround for TOC Overflow on ppc64
|
2019-12-09 08:42:40 +00:00
|
|
|
set(bigTocFlag "")
|
2019-02-27 17:31:57 +00:00
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "AIX" AND
|
|
|
|
CMAKE_SYSTEM_PROCESSOR MATCHES "powerpc")
|
2019-12-09 08:42:40 +00:00
|
|
|
set(bigTocFlag "-Wl,-bbigtoc")
|
2019-02-27 17:31:57 +00:00
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
|
|
|
|
CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64")
|
2019-12-09 08:42:40 +00:00
|
|
|
set(bigTocFlag "-Wl,--no-multi-toc")
|
|
|
|
endif()
|
|
|
|
if(bigTocFlag)
|
|
|
|
include(CheckCXXLinkerFlag)
|
|
|
|
check_cxx_linker_flag(${bigTocFlag} BIG_TOC_FLAG_SUPPORTED)
|
|
|
|
if(BIG_TOC_FLAG_SUPPORTED)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${bigTocFlag}")
|
|
|
|
endif()
|
2019-02-27 17:31:57 +00:00
|
|
|
endif()
|
|
|
|
|
2017-05-22 21:28:51 +00:00
|
|
|
if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND
|
|
|
|
NOT DEFINED CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION)
|
SolarisStudio: Use alternative standard library to build CMake.
SolarisStudio ships a very old RogueWave standard library
implementation (libCstd) and uses it by default for backward compatibility.
The macros defined when building the system libCstd need to be the same as
the macros defined when using it for binary compatibility reasons etc. The
SolarisStudio compiler driver adds macros such as _RWSTD_NO_MEMBER_TEMPLATES and
_RWSTD_NO_CLASS_PARTIAL_SPEC etc. These macros disable certain APIs in the
standard library headers.
Although the compiler supports the features 'member templates' and 'partial
template specialization', the standard library does not provide APIs which
rely on those features. This means that std::vector::insert in libCStd does
not accept a pair of iterators from a different type of container, because
that requires member templates, and reverse_iterator<const T> can not
be constructed from a reverse_iterator<T> because that requires partial
specialization (or at least the _RWSTD_NO_CLASS_PARTIAL_SPEC define) and
member templates.
This causes many problems while building CMake using SolarisStudio, which
have not been well understood until now. The problems are usually
attributed to compiler limitations, while actually the problem is in
the standard library, as in commit v3.0.0-rc1~99^2~1 (Help: Document non-use
of std::set::insert., 2014-01-24) and commit 107dcac3 (Fix compilation with
the Oracle / Sun compiler (#15318), 2014-12-12).
SolarisStudio 12.3 and earlier also ships a version of stlport which may be
used instead of libCstd by specifying -library=stlport4
https://docs.oracle.com/cd/E18659_01/html/821-1383/bkakg.html
SolarisStudio 12.4 ships a version of libstdc++ from GCC 4.8.2 which may be
used by specifying -std=c++03 or -std=c++11 etc
http://docs.oracle.com/cd/E37069_01/html/E37075/bkamw.html#OSSCPgnaof
Use these more-capable standard library implementations when building cmake.
This will allow more use of 'normal' C++ (such as std::vector::insert), and cause
fewer surprises resulting from dashboards using SolarisStudio.
Because cmake is not a library linked against by 3rd parties and does not have
external dependencies, issues related to mixing code using libCStd and libstdc++
do not apply.
2014-12-31 11:23:50 +00:00
|
|
|
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13)
|
2017-05-08 14:26:54 +00:00
|
|
|
if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD EQUAL 98)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
|
|
|
|
elseif(CMAKE_VERSION VERSION_LESS 3.8.20170502)
|
|
|
|
# CMake knows how to add this flag for compilation as C++11,
|
|
|
|
# but has not been taught that SunPro needs it for linking too.
|
|
|
|
# Add it in a place that will be used for both.
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
|
|
endif()
|
SolarisStudio: Use alternative standard library to build CMake.
SolarisStudio ships a very old RogueWave standard library
implementation (libCstd) and uses it by default for backward compatibility.
The macros defined when building the system libCstd need to be the same as
the macros defined when using it for binary compatibility reasons etc. The
SolarisStudio compiler driver adds macros such as _RWSTD_NO_MEMBER_TEMPLATES and
_RWSTD_NO_CLASS_PARTIAL_SPEC etc. These macros disable certain APIs in the
standard library headers.
Although the compiler supports the features 'member templates' and 'partial
template specialization', the standard library does not provide APIs which
rely on those features. This means that std::vector::insert in libCStd does
not accept a pair of iterators from a different type of container, because
that requires member templates, and reverse_iterator<const T> can not
be constructed from a reverse_iterator<T> because that requires partial
specialization (or at least the _RWSTD_NO_CLASS_PARTIAL_SPEC define) and
member templates.
This causes many problems while building CMake using SolarisStudio, which
have not been well understood until now. The problems are usually
attributed to compiler limitations, while actually the problem is in
the standard library, as in commit v3.0.0-rc1~99^2~1 (Help: Document non-use
of std::set::insert., 2014-01-24) and commit 107dcac3 (Fix compilation with
the Oracle / Sun compiler (#15318), 2014-12-12).
SolarisStudio 12.3 and earlier also ships a version of stlport which may be
used instead of libCstd by specifying -library=stlport4
https://docs.oracle.com/cd/E18659_01/html/821-1383/bkakg.html
SolarisStudio 12.4 ships a version of libstdc++ from GCC 4.8.2 which may be
used by specifying -std=c++03 or -std=c++11 etc
http://docs.oracle.com/cd/E37069_01/html/E37075/bkamw.html#OSSCPgnaof
Use these more-capable standard library implementations when building cmake.
This will allow more use of 'normal' C++ (such as std::vector::insert), and cause
fewer surprises resulting from dashboards using SolarisStudio.
Because cmake is not a library linked against by 3rd parties and does not have
external dependencies, issues related to mixing code using libCStd and libstdc++
do not apply.
2014-12-31 11:23:50 +00:00
|
|
|
else()
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2016-09-28 20:03:14 +00:00
|
|
|
foreach(lang C CXX)
|
|
|
|
# Suppress warnings from PGI compiler.
|
|
|
|
if (CMAKE_${lang}_COMPILER_ID STREQUAL "PGI")
|
|
|
|
set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} -w")
|
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
|
2007-05-10 18:08:15 +00:00
|
|
|
# use the ansi CXX compile flag for building cmake
|
2012-08-13 17:47:32 +00:00
|
|
|
if (CMAKE_ANSI_CXXFLAGS)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_ANSI_CXXFLAGS}")
|
2012-08-13 17:50:14 +00:00
|
|
|
endif ()
|
2007-05-10 18:08:15 +00:00
|
|
|
|
2012-08-13 17:47:32 +00:00
|
|
|
if (CMAKE_ANSI_CFLAGS)
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
|
2012-08-13 17:50:14 +00:00
|
|
|
endif ()
|
2018-01-29 17:34:28 +00:00
|
|
|
|
|
|
|
# Allow per-translation-unit parallel builds when using MSVC
|
|
|
|
if(CMAKE_GENERATOR MATCHES "Visual Studio" AND
|
|
|
|
(CMAKE_C_COMPILER_ID MATCHES "MSVC|Intel" OR
|
|
|
|
CMAKE_CXX_COMPILER_ID MATCHES "MSVC|Intel"))
|
|
|
|
|
|
|
|
set(CMake_MSVC_PARALLEL ON CACHE STRING "\
|
|
|
|
Enables /MP flag for parallel builds using MSVC. Specify an \
|
|
|
|
integer value to control the number of threads used (Only \
|
|
|
|
works on some older versions of Visual Studio). Setting to \
|
|
|
|
ON lets the toolchain decide how many threads to use. Set to \
|
|
|
|
OFF to disable /MP completely." )
|
|
|
|
|
|
|
|
if(CMake_MSVC_PARALLEL)
|
|
|
|
if(CMake_MSVC_PARALLEL GREATER 0)
|
|
|
|
string(APPEND CMAKE_C_FLAGS " /MP${CMake_MSVC_PARALLEL}")
|
|
|
|
string(APPEND CMAKE_CXX_FLAGS " /MP${CMake_MSVC_PARALLEL}")
|
|
|
|
else()
|
|
|
|
string(APPEND CMAKE_C_FLAGS " /MP")
|
|
|
|
string(APPEND CMAKE_CXX_FLAGS " /MP")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|