diff options
author | Alex Merry <kde@randomguy3.me.uk> | 2014-01-24 12:10:51 +0000 |
---|---|---|
committer | Alex Merry <kde@randomguy3.me.uk> | 2014-01-27 17:44:55 +0000 |
commit | 81233a524e0b18123201d0a7ca72b87ce8b8625b (patch) | |
tree | a2baa62d9aec4d4012a17799cc4fad5627cb5515 /kde-modules/KDECompilerSettings.cmake | |
parent | fdb805d02e60281261f43b8a50ecec6e8630336f (diff) | |
download | extra-cmake-modules-81233a524e0b18123201d0a7ca72b87ce8b8625b.tar.gz extra-cmake-modules-81233a524e0b18123201d0a7ca72b87ce8b8625b.tar.bz2 |
Organise KDECompilerSettings.cmake more logically
Very little should have changed in practice (apart from the Intel
compiler stuff being properly separated between things for WIN32 and
things for other platforms, and not defining _BSD_SOURCE).
Diffstat (limited to 'kde-modules/KDECompilerSettings.cmake')
-rw-r--r-- | kde-modules/KDECompilerSettings.cmake | 492 |
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() + |