cmake_modules/compilerchecks.cmake
author nemo
Fri, 07 Jun 2013 22:12:15 -0400
changeset 9157 2f8b60b89121
parent 9156 6bf5359d5d14
child 9159 3e9d4bbc4053
permissions -rw-r--r--
ok. this could be tidier, but, I'm sick of hogs w/ unmodified thaw thawing on exactly wrong turn.
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
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
     6
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
     7
#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
     8
9155
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
     9
#stack protection
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    10
check_c_compiler_flag("-fstack-protector" HAVE_STACKPROTECTOR)
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    11
if(HAVE_STACKPROTECTOR)
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    12
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
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
    13
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector")
9155
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    14
endif()
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    15
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    16
#symbol visibility
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    17
check_c_compiler_flag("-fvisibility=hidden" HAVE_VISIBILITYH)
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    18
if(HAVE_VISIBILITYH)
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    19
    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
    20
    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
    21
endif()
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    22
480f483de544 add fstack-protector and fvisibility=hidden to cmake tests
koda
parents: 9154
diff changeset
    23
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    24
#check for noexecstack on ELF, Gentoo security
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    25
set(CMAKE_REQUIRED_FLAGS "-Wl,-z,noexecstack")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    26
check_c_compiler_flag("" HAVE_NOEXECSTACK)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    27
if(HAVE_NOEXECSTACK)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    28
    list(APPEND pascal_flags "-k-z" "-knoexecstack")
9154
a43406054648 also apply linker flags to haskell programs
koda
parents: 9153
diff changeset
    29
    list(APPEND haskell_flags "-optl" "-z" "-optl" "noexecstack")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    30
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
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
    31
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    32
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    33
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    34
#check for full relro on ELF, Debian security
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    35
set(CMAKE_REQUIRED_FLAGS "-Wl,-z,relro,-z,now")
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    36
check_c_compiler_flag("" HAVE_RELROFULL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    37
if(HAVE_RELROFULL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    38
    list(APPEND pascal_flags "-k-z" "-krelro" "-k-z" "-know")
9154
a43406054648 also apply linker flags to haskell programs
koda
parents: 9153
diff changeset
    39
    list(APPEND haskell_flags "-optl" "-z" "-optl" "relro" "-optl" "-z" "-optl" "now")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    40
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
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
    41
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    42
else()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    43
    #if full relro is not available, try partial relro
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    44
    set(CMAKE_REQUIRED_FLAGS "-Wl,-z,relro")
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    45
    check_c_compiler_flag("" HAVE_RELROPARTIAL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    46
    if(HAVE_RELROPARTIAL)
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    47
        list(APPEND pascal_flags "-k-z" "-krelro")
9154
a43406054648 also apply linker flags to haskell programs
koda
parents: 9153
diff changeset
    48
        list(APPEND haskell_flags "-optl" "-z" "-optl" "relro")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    49
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
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
    50
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9153
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    51
    endif()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    52
endif()
354a9803fe91 add relro linker tests (issue 663)
koda
parents: 9152
diff changeset
    53
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    54
#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
    55
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    56
check_c_compiler_flag("" HAVE_WINASLR)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    57
if(HAVE_WINASLR)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    58
    list(APPEND pascal_flags "-k--nxcompat")
9154
a43406054648 also apply linker flags to haskell programs
koda
parents: 9153
diff changeset
    59
    list(APPEND haskell_flags "-optl" "--nxcompat")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    60
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
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
    61
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    62
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    63
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    64
#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
    65
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    66
check_c_compiler_flag("" HAVE_WINDEP)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    67
if(HAVE_WINDEP)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    68
    list(APPEND pascal_flags "-k--dynamicbase")
9154
a43406054648 also apply linker flags to haskell programs
koda
parents: 9153
diff changeset
    69
    list(APPEND haskell_flags "-optl" "--dynamicbase")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    70
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
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
    71
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_REQUIRED_FLAGS}")
9152
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    72
endif()
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    73
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    74
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    75
#always unset or these flags will be spread everywhere
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    76
unset(CMAKE_REQUIRED_FLAGS)
c884e40dca9e move compiler checks in a separate cmake module
koda
parents:
diff changeset
    77