aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kde-modules/KDECompilerSettings.cmake492
1 files changed, 244 insertions, 248 deletions
diff --git a/kde-modules/KDECompilerSettings.cmake b/kde-modules/KDECompilerSettings.cmake
index 1a1d2789..6b7ab4ed 100644
--- a/kde-modules/KDECompilerSettings.cmake
+++ b/kde-modules/KDECompilerSettings.cmake
@@ -11,26 +11,63 @@
# kde_source_files_enable_exceptions([file1 [file2 [...]]])
#
# Enables exceptions for specific source files. This should not be
-# called on source files in a language other than C++.
+# used on source files in a language other than C++.
#
# kde_target_enable_exceptions(target <INTERFACE|PUBLIC|PRIVATE>)
#
-# Enables exceptions for a specific target. This should not be called
+# Enables exceptions for a specific target. This should not be used
# on a target that has source files in a language other than C++.
#
# kde_enable_exceptions()
#
-# Enables exceptions for C++ source files compiled for the CMakeLists.txt file
-# in the current directory and all subdirectories.
+# Enables exceptions for C++ source files compiled for the
+# CMakeLists.txt file in the current directory and all subdirectories.
#
-# TODO: Deal with QT_NO_EXCEPTIONS for non-gnu compilers?
-# This should be defined if and only if exceptions are disabled.
-# qglobal.h has some magic to set it when exceptions are disabled
-# with gcc, but other compilers are unaccounted for.
+############################################################
+# Toolchain minimal requirements
+############################################################
-include(CheckCXXCompilerFlag)
+set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE)
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ if ("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.2.0")
+ message(FATAL_ERROR "GCC 4.2 or later is required")
+ endif()
+
+ if (NOT WIN32)
+ # FIXME: This test was originally used to decide whether to
+ # enable hidden vis for GCC >= 4.1 (it would not be
+ # if GCC had the mt allocator).
+ # 1. Is this something that matters for GCC >= 4.2?
+ # 2. If so, do we actually want to change the value
+ # of CMAKE_CXX_VISIBILITY_PRESET?
+ # All I can find about this is
+ # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664,
+ # esp. comments 90/91 and 104-108. I think requiring
+ # GCC 4.2 and some version of binutils (2.18?) should
+ # be enough.
+ set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE)
+ exec_program(${CMAKE_C_COMPILER} ARGS ${CMAKE_C_COMPILER_ARG1} -v OUTPUT_VARIABLE _gcc_alloc_info)
+ string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}")
+ endif()
+endif()
+
+if (NOT WIN32 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR)
+ # FIXME: in practice, this target is never going to exist at this point
+ if (TARGET Qt5::Core)
+ if(NOT QT_VISIBILITY_AVAILABLE)
+ message(FATAL_ERROR "Qt compiled without support for -fvisibility=hidden. This will break plugins and linking of some applications. Please fix your Qt installation (try passing --reduce-exports to configure).")
+ endif()
+ endif()
+endif()
+
+
+
+############################################################
+# System API features
+############################################################
# This macro is for adding definitions that affect the underlying
# platform API. It makes sure that configure checks will also have
@@ -40,260 +77,107 @@ macro (_KDE_ADD_PLATFORM_DEFINITIONS)
set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${ARGV})
endmacro()
-if (WIN32)
-
- # windows, microsoft compiler
- if(MSVC OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
- # FIXME: KDE_FULL_TEMPLATE_EXPORT_INSTANTIATION is a hangover from kdemacros.h
- # and should probably be removed
- add_definitions(-DKDE_FULL_TEMPLATE_EXPORT_INSTANTIATION)
-
- # Speeds up compile times by not including everything with windows.h
- _kde_add_platform_definitions(-DWIN32_LEAN_AND_MEAN)
-
- # Disable warnings:
- # C4250: 'class1' : inherits 'class2::member' via dominance
- set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4250" )
- # C4251: 'identifier' : class 'type' needs to have dll-interface to be
- # used by clients of class 'type2'
- set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4251" )
- # C4396: 'identifier' : 'function' the inline specifier cannot be used
- # when a friend declaration refers to a specialization of a
- # function template
- set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4396" )
- # C4661: 'identifier' : no suitable definition provided for explicit
- # template instantiation request
- set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4661" )
-
- # to avoid a lot of deprecated warnings
- add_definitions(-D_CRT_SECURE_NO_DEPRECATE
- -D_CRT_SECURE_NO_WARNINGS
- -D_CRT_NONSTDC_NO_DEPRECATE
- -D_SCL_SECURE_NO_WARNINGS
- )
- endif()
-
-# TODO: we should not depend on Perl or Qt already been found here
-#
-# # for visual studio IDE set the path correctly for custom commands
-# # maybe under windows bat-files should be generated for running apps during the build
-# if(MSVC_IDE)
-# get_filename_component(PERL_LOCATION "${PERL_EXECUTABLE}" PATH)
-# file(TO_NATIVE_PATH "${PERL_LOCATION}" PERL_PATH_WINDOWS)
-# file(TO_NATIVE_PATH "${QT_BINARY_DIR}" QT_BIN_DIR_WINDOWS)
-# set(CMAKE_MSVCIDE_RUN_PATH "${PERL_PATH_WINDOWS}\;${QT_BIN_DIR_WINDOWS}"
-# CACHE STATIC "MSVC IDE Run path" FORCE)
-# endif()
-
- # TODO: do we really want to have this line here ? Is it actually needed ?
- # we prefer to use a different postfix for debug libs only on Windows
- # does not work atm
- set(CMAKE_DEBUG_POSTFIX "")
-
- # we don't support anything below w2k
- _kde_add_platform_definitions(-D_WIN32_WINNT=0x0501 -DWINVER=0x0501 -D_WIN32_IE=0x0501)
- # all winapi calls are unicodes
- _kde_add_platform_definitions(-DUNICODE)
-
-endif (WIN32)
-
-if (APPLE)
- # we need to set MACOSX_DEPLOYMENT_TARGET to (I believe) at least 10.2 or
- # maybe 10.3 to allow -undefined dynamic_lookup; in the future we should do
- # this programmatically
-
- # hmm... why doesn't this work?
- set (ENV{MACOSX_DEPLOYMENT_TARGET} 10.3)
+if (UNIX)
+ # Enable basically everything portable across modern UNIX systems.
+ # See http://www.delorie.com/gnu/docs/glibc/libc_13.html
+ #
+ # NB: we do NOT define _BSD_SOURCE, as with GNU libc that requires linking
+ # against the -lbsd-compat library (it changes the behaviour of some
+ # functions).
+ _kde_add_platform_definitions(-D_XOPEN_SOURCE=500)
+ # FIXME: do we need this?
+ _kde_add_platform_definitions(-D_GNU_SOURCE)
+
+ # Enable extra API for using 64-bit file offsets on 32-bit systems.
+ # FIXME: do we need this? Does it make sense on non-glibc systems?
+ _kde_add_platform_definitions(-D_LARGEFILE64_SOURCE)
endif()
-
-if ("${CMAKE_SYSTEM_NAME}" MATCHES Linux OR "${CMAKE_SYSTEM_NAME}" STREQUAL GNU)
- # Get glibc to provide useful functions
- #
- # _BSD_SOURCE: is/was needed by glibc for snprintf to be available when
- # building C files.
- # See commit 4a44862b2d178c1d2e1eb4da90010d19a1e4a42c.
- _kde_add_platform_definitions(-D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_GNU_SOURCE)
+if (WIN32)
+ # Speeds up compile times by not including everything with windows.h
+ # See http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx
+ _kde_add_platform_definitions(-DWIN32_LEAN_AND_MEAN)
+
+ # Target Windows XP / Windows Server 2003
+ # This enables various bits of new API
+ # See http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx
+ _kde_add_platform_definitions(-D_WIN32_WINNT=0x0501 -DWINVER=0x0501 -D_WIN32_IE=0x0501)
+
+ # Use the Unicode versions of Windows API by default
+ # See http://msdn.microsoft.com/en-us/library/windows/desktop/dd317766%28v=vs.85%29.aspx
+ _kde_add_platform_definitions(-DUNICODE)
endif()
-if (UNIX)
- # 64-bit file offsets
- _kde_add_platform_definitions(-D_LARGEFILE64_SOURCE)
-endif (UNIX)
-
-
-if (APPLE)
- # "-undefined dynamic_lookup" means we don't care about missing symbols at
- # link-time by default this is bad, but unavoidable until there is the
- # equivalent of libtool -no-undefined implemented or perhaps it already is,
- # and I just don't know where to look ;)
-
- set (CMAKE_SHARED_LINKER_FLAGS "-single_module -multiply_defined suppress ${CMAKE_SHARED_LINKER_FLAGS}")
- set (CMAKE_MODULE_LINKER_FLAGS "-multiply_defined suppress ${CMAKE_MODULE_LINKER_FLAGS}")
- #set(CMAKE_SHARED_LINKER_FLAGS "-single_module -undefined dynamic_lookup -multiply_defined suppress")
- #set(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup -multiply_defined suppress")
-
- # removed -Os, was there a special reason for using -Os instead of -O2 ?, Alex
- # optimization flags are set below for the various build types
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-common")
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common")
-endif (APPLE)
-
-# TODO: why don't we go inside that block on the BSDs ?
-if (CMAKE_SYSTEM_NAME MATCHES Linux OR CMAKE_SYSTEM_NAME STREQUAL GNU)
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # TODO: does the Intel compiler also support --enable-new-dtags ? ...probably since they are only forwarded to the linker....
- set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-new-dtags -Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}")
- set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-new-dtags -Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}")
- set ( CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_EXE_LINKER_FLAGS}")
- endif()
-
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
- set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}")
- set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}")
- endif ()
-endif (CMAKE_SYSTEM_NAME MATCHES Linux OR CMAKE_SYSTEM_NAME STREQUAL GNU)
-
############################################################
-# compiler specific settings
+# Language and toolchain features
############################################################
-if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR (WIN32 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel"))
-
- # this macro is for internal use only.
- macro(_KDE_INSERT_FLAG FLAG VAR DOC)
- if(NOT ${VAR} MATCHES "${FLAG}")
- set(${VAR} "${${VAR}} ${FLAG}" CACHE STRING "Flags used by the linker during ${DOC} builds." FORCE)
- endif()
- endmacro()
-
- # make sure that no header adds libcmt by default using
- # #pragma comment(lib, "libcmt.lib") as done by mfc/afx.h
- _kde_insert_flag("/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "Release with Debug Info")
- _kde_insert_flag("/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt" CMAKE_EXE_LINKER_FLAGS_RELEASE "release")
- _kde_insert_flag("/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt" CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "release minsize")
- _kde_insert_flag("/NODEFAULTLIB:libcmtd /DEFAULTLIB:msvcrtd" CMAKE_EXE_LINKER_FLAGS_DEBUG "debug")
+# Pick sensible versions of the C and C++ standards
+# FIXME: MSVC, Intel on windows?
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=iso9899:1990")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" AND NOT WIN32)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
endif()
-# TODO: this is for BSD, this looks like something which should be done in CMake
-# # This macro is for internal use only
-# # Return the directories present in gcc's include path.
-# macro(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang _result)
-# set(${_result})
-# set(_gccOutput)
-# file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/dummy" "\n" )
-# execute_process(COMMAND ${CMAKE_C_COMPILER} -v -E -x ${_lang} -dD dummy
-# WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles
-# ERROR_VARIABLE _gccOutput
-# OUTPUT_VARIABLE _gccStdout )
-# file(REMOVE "${CMAKE_BINARY_DIR}/CMakeFiles/dummy")
-#
-# if( "${_gccOutput}" MATCHES "> search starts here[^\n]+\n *(.+) *\n *End of (search) list" )
-# SET(${_result} ${CMAKE_MATCH_1})
-# STRING(REPLACE "\n" " " ${_result} "${${_result}}")
-# SEPARATE_ARGUMENTS(${_result})
-# ENDIF( "${_gccOutput}" MATCHES "> search starts here[^\n]+\n *(.+) *\n *End of (search) list" )
-# endmacro(_DETERMINE_GCC_SYSTEM_INCLUDE_DIRS _lang)
-
-
-if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+# Default to hidden visibility for symbols
+set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
- if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.2.0")
- message(FATAL_ERROR "GCC 4.2 or later is required")
- endif()
+if (UNIX AND NOT APPLE)
+ # Enable adding DT_RUNPATH, which means that LD_LIBRARY_PATH takes precedence
+ # over the built-in rPath
+ set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_SHARED_LINKER_FLAGS}")
+ set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_MODULE_LINKER_FLAGS}")
+ set(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_EXE_LINKER_FLAGS}")
+endif()
-# if (CMAKE_COMPILER_IS_GNUCC)
-# _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c _dirs)
-# set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES
-# ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES} ${_dirs})
-# endif (CMAKE_COMPILER_IS_GNUCC)
+if (CMAKE_SYSTEM_NAME STREQUAL GNU)
+ # Enable multithreading with the pthread library
+ # FIXME: Is this actually necessary to have here?
+ # Can CMakeLists.txt files that require it use FindThreads.cmake
+ # instead?
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pthread")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pthread")
+endif()
-# _DETERMINE_GCC_SYSTEM_INCLUDE_DIRS(c++ _dirs)
-# set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES
-# ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES} ${_dirs})
-endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+############################################################
+# Turn off exceptions by default
+#
+# This involves enough code to be separate from the
+# previous section.
+############################################################
+# TODO: Deal with QT_NO_EXCEPTIONS for non-gnu compilers?
+# This should be defined if and only if exceptions are disabled.
+# qglobal.h has some magic to set it when exceptions are disabled
+# with gcc, but other compilers are unaccounted for.
+# Turn off exceptions by default
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
- # As of Qt 4.6.x we need to override the new exception macros if we want compile with -fno-exceptions
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wnon-virtual-dtor -Wno-long-long -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -fno-check-new -fno-common")
-
- if (CMAKE_SYSTEM_NAME STREQUAL GNU)
- set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pthread")
- set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pthread")
- endif ()
-
- # gcc under Windows
- if (MINGW)
- set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols")
- set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--export-all-symbols")
- endif ()
-
- check_cxx_compiler_flag(-Woverloaded-virtual __KDE_HAVE_W_OVERLOADED_VIRTUAL)
- if(__KDE_HAVE_W_OVERLOADED_VIRTUAL)
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual")
- endif()
-
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-type")
-
- set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE)
- exec_program(${CMAKE_C_COMPILER} ARGS ${CMAKE_C_COMPILER_ARG1} -v OUTPUT_VARIABLE _gcc_alloc_info)
- string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}")
-
- if (NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR AND NOT WIN32)
- if (TARGET Qt5::Core)
- if(NOT QT_VISIBILITY_AVAILABLE)
- message(FATAL_ERROR "Qt compiled without support for -fvisibility=hidden. This will break plugins and linking of some applications. Please fix your Qt installation (try passing --reduce-exports to configure).")
- endif()
- endif()
- endif()
-
-endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
-
-
-if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # Note that exceptions are enabled by default when building with clang. That
- # is, -fno-exceptions is not set in CMAKE_CXX_FLAGS below. This is because a
- # lot of code in different KDE modules ends up including code that throws
- # exceptions. Most (or all) of the occurrences are in template code that
- # never gets instantiated. Contrary to GCC, ICC and MSVC, clang (most likely
- # rightfully) complains about that. Trying to work around the issue by
- # passing -fdelayed-template-parsing brings other problems, as noted in
- # http://lists.kde.org/?l=kde-core-devel&m=138157459706783&w=2.
- # The generated code will be slightly bigger, but there is no way to avoid
- # it.
-
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wnon-virtual-dtor -Wno-long-long -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -Woverloaded-virtual -fno-common -Werror=return-type")
-
- if (CMAKE_SYSTEM_NAME STREQUAL GNU)
- set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pthread")
- set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pthread")
- endif ()
-
- if (NOT WIN32)
- if (TARGET Qt5::Core)
- if(NOT QT_VISIBILITY_AVAILABLE)
- message(FATAL_ERROR "Qt compiled without support for -fvisibility=hidden. This will break plugins and linking of some applications. Please fix your Qt installation (try passing --reduce-exports to configure).")
- endif()
- endif()
- endif()
-endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
-
-
-if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -w1 -Wpointer-arith -fno-common")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -w1 -Wpointer-arith -fno-exceptions -fno-common")
-
-endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
-
-set(CMAKE_CXX_VISIBILITY_PRESET hidden)
-set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
+#elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # Note that exceptions are enabled by default when building with clang. That
+ # is, -fno-exceptions is not set in CMAKE_CXX_FLAGS below. This is because a
+ # lot of code in different KDE modules ends up including code that throws
+ # exceptions. Most (or all) of the occurrences are in template code that
+ # never gets instantiated. Contrary to GCC, ICC and MSVC, clang (most likely
+ # rightfully) complains about that. Trying to work around the issue by
+ # passing -fdelayed-template-parsing brings other problems, as noted in
+ # http://lists.kde.org/?l=kde-core-devel&m=138157459706783&w=2.
+ # The generated code will be slightly bigger, but there is no way to avoid
+ # it.
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" AND NOT WIN32)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
+#elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR
+# (WIN32 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel"))
+ # FIXME: are exceptions disabled by default on WIN32?
+endif()
macro(_kdecompilersettings_append_exception_flag VAR)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
@@ -323,8 +207,6 @@ function(KDE_SOURCE_FILES_ENABLE_EXCEPTIONS)
endfunction()
function(KDE_TARGET_ENABLE_EXCEPTIONS target mode)
- # TODO we need to unset QT_NO_EXCEPTIONS for non-GNU compilers
- # (although we currently do not set it anyway)
target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:MSVC>:-EHsc>")
if (WIN32)
target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:Intel>:-EHsc>")
@@ -338,7 +220,6 @@ function(KDE_TARGET_ENABLE_EXCEPTIONS target mode)
endfunction()
function(KDE_ENABLE_EXCEPTIONS)
-
# We set CMAKE_CXX_FLAGS, rather than add_compile_options(), because
# we only want to affect the compilation of C++ source files.
@@ -353,6 +234,121 @@ function(KDE_ENABLE_EXCEPTIONS)
_kdecompilersettings_append_exception_flag(CMAKE_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
-
endfunction()
+
+
+############################################################
+# Better diagnostics (warnings, errors)
+############################################################
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
+ "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
+ ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" AND NOT WIN32))
+ # Linker warnings should be treated as errors
+ set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings ${CMAKE_SHARED_LINKER_FLAGS}")
+ set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings ${CMAKE_MODULE_LINKER_FLAGS}")
+
+ # Do not allow undefined symbols, even in non-symbolic shared libraries
+ set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_SHARED_LINKER_FLAGS}")
+ set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_MODULE_LINKER_FLAGS}")
+endif()
+
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set(_KDE_COMMON_WARNING_FLAGS "-Wall -Wextra -Wcast-align -Wchar-subscripts -Wformat-security -Wno-long-long -Wpointer-arith -Wundef")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_KDE_COMMON_WARNING_FLAGS} -Wmissing-format-attribute -Wwrite-strings")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_KDE_COMMON_WARNING_FLAGS} -Wnon-virtual-dtor -Woverloaded-virtual")
+
+ # Make some warnings errors
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration")
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-type")
+endif()
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" AND NOT WIN32)
+ # -w1 turns on warnings and errors
+ # FIXME: someone needs to have a closer look at the Intel compiler options
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -w1 -Wpointer-arith")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -w1 -Wpointer-arith")
+endif()
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR
+ (WIN32 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel"))
+ # FIXME: do we not want to set the warning level up to level 3? (/W3)
+ # FIXME: does Intel really follow MSVC *this* closely on Windows?
+ # Disable warnings:
+ # C4250: 'class1' : inherits 'class2::member' via dominance
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4250")
+ # C4251: 'identifier' : class 'type' needs to have dll-interface to be
+ # used by clients of class 'type2'
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
+ # C4396: 'identifier' : 'function' the inline specifier cannot be used
+ # when a friend declaration refers to a specialization of a
+ # function template
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4396")
+ # C4661: 'identifier' : no suitable definition provided for explicit
+ # template instantiation request
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4661")
+endif()
+
+if (WIN32)
+ # Disable deprecation warnings for some API
+ # FIXME: do we really want this?
+ add_definitions(-D_CRT_SECURE_NO_DEPRECATE
+ -D_CRT_SECURE_NO_WARNINGS
+ -D_CRT_NONSTDC_NO_DEPRECATE
+ -D_SCL_SECURE_NO_WARNINGS
+ )
+endif()
+
+
+
+############################################################
+# Hacks
+#
+# Anything in this section should be thoroughly documented,
+# including what problems it is supposed to fix and in what
+# circumstances those problems occur. Include links to any
+# relevant bug reports.
+############################################################
+
+if (APPLE)
+ # FIXME: is this still needed?
+ # Apple's Mach-O linker apparently does not like having uninitialized global
+ # variables in a common block (only relevant for C code)
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-common")
+
+ # FIXME: why are these needed?
+ set (CMAKE_SHARED_LINKER_FLAGS "-single_module -multiply_defined suppress ${CMAKE_SHARED_LINKER_FLAGS}")
+ set (CMAKE_MODULE_LINKER_FLAGS "-multiply_defined suppress ${CMAKE_MODULE_LINKER_FLAGS}")
+endif()
+
+if (UNIX AND NOT APPLE)
+ # We apparently need to explicitly link against libc
+ # FIXME: really!?
+ set(CMAKE_SHARED_LINKER_FLAGS "-lc ${CMAKE_SHARED_LINKER_FLAGS}")
+ set(CMAKE_MODULE_LINKER_FLAGS "-lc ${CMAKE_MODULE_LINKER_FLAGS}")
+endif()
+
+if (WIN32)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR
+ (WIN32 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel"))
+ # make sure that no header adds libcmt by default using
+ # #pragma comment(lib, "libcmt.lib") as done by mfc/afx.h
+ set(CMAKE_EXE_LINKER_FLAGS "/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt ${CMAKE_EXE_LINKER_FLAGS}")
+ endif()
+endif()
+
+if (MINGW AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ # FIXME: do our export macros not deal with this properly?
+ # maybe we only need this for modules?
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols")
+ set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--export-all-symbols")
+endif()
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
+ "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
+ ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" AND NOT WIN32))
+ # FIXME: why?
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-common")
+endif()
+