cmake_modules/compilerchecks.cmake
author koda
Thu, 13 Jun 2013 14:44:28 +0200
changeset 9219 0a4b6bb69f99
parent 9217 992b7ef2eba3
parent 9191 fc54667b1203
child 9220 5e7db24f3489
permissions -rw-r--r--
bring windows fixes from main repo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     1
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     2
#TESTING TIME
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     3
include(CheckCCompilerFlag)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     4
#when you need to check for a linker flag, just leave the argument of "check_c_compiler_flag" empty
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     5
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
     6
# CMAKE_C{XX}_FLAGS is for compiler flags (c and c++)
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
     7
# CMAKE_EXE_LINKER_FLAGS is for linker flags (also add them to pascal_flags and haskell_flags)
9165
7b0d5388abc4 stack-protector flag needs to be passed to the linker as well
koda
parents: 9159
diff changeset
     8
# CMAKE_SHARED_LIBRARY_<lang>_FLAGS same but for shared libraries
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     9
9156
6bf5359d5d14 make sure that also CXX sources pick up the flags (although I'm not 100% of the correctness of the tests)
koda
parents: 9155
diff changeset
    10
#TODO: should there be two different checks for C and CXX?
6bf5359d5d14 make sure that also CXX sources pick up the flags (although I'm not 100% of the correctness of the tests)
koda
parents: 9155
diff changeset
    11
9191
fc54667b1203 fix launching on windows
koda
parents: 9169
diff changeset
    12
#stack protection, when found it needs to go in the linker flags too
fc54667b1203 fix launching on windows
koda
parents: 9169
diff changeset
    13
#it is disabled on win32 because it adds a dll and messes with linker
fc54667b1203 fix launching on windows
koda
parents: 9169
diff changeset
    14
#(see 822312 654424 on bugzilla.redhat.com)
9167
ecf19179b37e protect all types with -fstack-protector-all
koda
parents: 9165
diff changeset
    15
check_c_compiler_flag("-fstack-protector-all -fstack-protector" HAVE_STACKPROTECTOR)
9191
fc54667b1203 fix launching on windows
koda
parents: 9169
diff changeset
    16
if(HAVE_STACKPROTECTOR AND (NOT WIN32))
9167
ecf19179b37e protect all types with -fstack-protector-all
koda
parents: 9165
diff changeset
    17
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-all -fstack-protector")
ecf19179b37e protect all types with -fstack-protector-all
koda
parents: 9165
diff changeset
    18
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all -fstack-protector")
ecf19179b37e protect all types with -fstack-protector-all
koda
parents: 9165
diff changeset
    19
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fstack-protector-all -fstack-protector")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    20
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} -fstack-protector-all -fstack-protector")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    21
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -fstack-protector-all -fstack-protector")
9155
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    22
endif()
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    23
9169
ef53201e95ec visibility unsupported on windows
koda
parents: 9167
diff changeset
    24
#symbol visibility, not supported on Windows (so we error out to avoid spam)
ef53201e95ec visibility unsupported on windows
koda
parents: 9167
diff changeset
    25
check_c_compiler_flag("-fvisibility=hidden -Werror" HAVE_VISIBILITY)
ef53201e95ec visibility unsupported on windows
koda
parents: 9167
diff changeset
    26
if(HAVE_VISIBILITY)
9155
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    27
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
9156
6bf5359d5d14 make sure that also CXX sources pick up the flags (although I'm not 100% of the correctness of the tests)
koda
parents: 9155
diff changeset
    28
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
9155
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    29
endif()
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    30
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    31
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    32
#check for noexecstack on ELF, Gentoo security
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    33
set(CMAKE_REQUIRED_FLAGS "-Wl,-z,noexecstack")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    34
check_c_compiler_flag("" HAVE_NOEXECSTACK)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    35
if(HAVE_NOEXECSTACK)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    36
    list(APPEND pascal_flags "-k-z" "-knoexecstack")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    37
    list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
    38
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    39
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    40
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    41
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    42
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    43
#check for full relro on ELF, Debian security
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    44
set(CMAKE_REQUIRED_FLAGS "-Wl,-z,relro,-z,now")
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    45
check_c_compiler_flag("" HAVE_RELROFULL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    46
if(HAVE_RELROFULL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    47
    list(APPEND pascal_flags "-k-z" "-krelro" "-k-z" "-know")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    48
    list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
    49
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    50
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    51
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    52
else()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    53
    #if full relro is not available, try partial relro
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    54
    set(CMAKE_REQUIRED_FLAGS "-Wl,-z,relro")
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    55
    check_c_compiler_flag("" HAVE_RELROPARTIAL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    56
    if(HAVE_RELROPARTIAL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    57
        list(APPEND pascal_flags "-k-z" "-krelro")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    58
        list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
    59
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    60
        set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    61
        set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    62
    endif()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    63
endif()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    64
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    65
#check for ASLR on Windows Vista or later, requires binutils >= 2.20
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    66
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    67
check_c_compiler_flag("" HAVE_WINASLR)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    68
if(HAVE_WINASLR)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    69
    list(APPEND pascal_flags "-k--nxcompat")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    70
    list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
    71
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    72
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    73
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    74
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    75
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    76
#check for DEP on Windows XP SP2 or later, requires binutils >= 2.20
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    77
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    78
check_c_compiler_flag("" HAVE_WINDEP)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    79
if(HAVE_WINDEP)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    80
    list(APPEND pascal_flags "-k--dynamicbase")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    81
    list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9159
3e9d4bbc4053 set linker flags where appropriate
koda
parents: 9156
diff changeset
    82
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    83
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    84
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    85
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    86
9206
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    87
#this is actually an optimisation
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    88
set(CMAKE_REQUIRED_FLAGS "-Wl,--as-needed")
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    89
check_c_compiler_flag("" HAVE_ASNEEDED)
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    90
if(HAVE_ASNEEDED)
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    91
    list(APPEND pascal_flags "-k--as-needed")
9207
16373565692a oops, haskell uses gcc to link, correctly pass flags
koda
parents: 9206
diff changeset
    92
    list(APPEND haskell_flags "-optl" "${CMAKE_REQUIRED_FLAGS}")
9206
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    93
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9217
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    94
    set(CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
992b7ef2eba3 apply linker flags to all relevant targets
koda
parents: 9211
diff changeset
    95
    set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9206
4788b24fee05 since shared libs are now our friends, let's optimise them
koda
parents: 9169
diff changeset
    96
endif()
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    97
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    98
#always unset or these flags will be spread everywhere
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    99
unset(CMAKE_REQUIRED_FLAGS)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
   100