[CMake] Allow user specified compiler flags to take precedence
[WebKit-https.git] / Source / cmake / WebKitHelpers.cmake
1 INCLUDE(CMakeParseArguments)
2 # Sets extra compile flags for a target, depending on the compiler being used.
3 # Currently, only GCC is supported.
4 MACRO(WEBKIT_SET_EXTRA_COMPILER_FLAGS _target)
5   SET(options ENABLE_WERROR IGNORECXX_WARNINGS)
6   CMAKE_PARSE_ARGUMENTS("OPTION" "${options}" "" "" ${ARGN})
7   IF (CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
8     GET_TARGET_PROPERTY(OLD_COMPILE_FLAGS ${_target} COMPILE_FLAGS)
9     IF (${OLD_COMPILE_FLAGS} STREQUAL "OLD_COMPILE_FLAGS-NOTFOUND")
10         SET(OLD_COMPILE_FLAGS "")
11     ENDIF ()
12
13     INCLUDE(TestCXXAcceptsFlag)
14     CHECK_CXX_ACCEPTS_FLAG("-dumpversion" CMAKE_CXX_ACCEPTS_DUMPVERSION)
15     IF (CMAKE_CXX_ACCEPTS_DUMPVERSION)
16         EXEC_PROGRAM(${CMAKE_CXX_COMPILER} ARGS -dumpversion OUTPUT_VARIABLE COMPILER_VERSION)
17     ELSE ()
18         EXEC_PROGRAM("${CMAKE_CXX_COMPILER} -E -Wp,-dM - < /dev/null | grep '#define __VERSION__' | grep -E -o '[0-9]+\\.[0-9]+\\.?[0-9]+?'" OUTPUT_VARIABLE COMPILER_VERSION)
19     ENDIF ()
20
21     # Disable some optimizations on buggy compiler versions
22     # GCC 4.5.1 does not implement -ftree-sra correctly
23     IF (${COMPILER_VERSION} STREQUAL "4.5.1")
24         SET(OLD_COMPILE_FLAGS "-fno-tree-sra ${OLD_COMPILE_FLAGS}")
25     ENDIF ()
26
27     IF (NOT SHARED_CORE)
28         SET(OLD_COMPILE_FLAGS "-fvisibility=hidden ${OLD_COMPILE_FLAGS}")
29     ENDIF ()
30
31     GET_TARGET_PROPERTY(TARGET_TYPE ${_target} TYPE)
32     IF (${TARGET_TYPE} STREQUAL "STATIC_LIBRARY") # -fPIC is automatically added to shared libraries
33         SET(OLD_COMPILE_FLAGS "-fPIC ${OLD_COMPILE_FLAGS}")
34     ENDIF ()
35
36     SET(OLD_COMPILE_FLAGS "-fno-exceptions -fno-strict-aliasing ${OLD_COMPILE_FLAGS}")
37
38     # Enable warnings by default
39     IF (NOT ${OPTION_IGNORECXX_WARNINGS})
40         SET(OLD_COMPILE_FLAGS "-Wall -Wextra -Wcast-align -Wformat-security -Wmissing-format-attribute -Wpointer-arith -Wundef -Wwrite-strings ${OLD_COMPILE_FLAGS}")
41     ENDIF ()
42
43     # Enable errors on warning
44     IF (OPTION_ENABLE_WERROR)
45         SET(OLD_COMPILE_FLAGS "-Werror -Wno-error=unused-parameter ${OLD_COMPILE_FLAGS}")
46     ENDIF ()
47
48     # Disable C++0x compat warnings for GCC >= 4.6.0 until we build
49     # cleanly with that.
50     IF (NOT ${OPTION_IGNORECXX_WARNINGS} AND NOT ${COMPILER_VERSION} VERSION_LESS "4.6.0")
51         SET(OLD_COMPILE_FLAGS "${OLD_COMPILE_FLAGS} -Wno-c++0x-compat")
52     ENDIF ()
53
54     SET_TARGET_PROPERTIES (${_target} PROPERTIES
55         COMPILE_FLAGS "${OLD_COMPILE_FLAGS}")
56
57     UNSET(OLD_COMPILE_FLAGS)
58   ENDIF ()
59 ENDMACRO()
60
61
62 # Append the given flag to the target property.
63 # Builds on top of GET_TARGET_PROPERTY() and SET_TARGET_PROPERTIES()
64 MACRO (ADD_TARGET_PROPERTIES _target _property _flags)
65   GET_TARGET_PROPERTY (_tmp ${_target} ${_property})
66   IF (NOT _tmp)
67     SET (_tmp "")
68   ENDIF (NOT _tmp)
69
70   FOREACH (f ${_flags})
71     SET (_tmp "${_tmp} ${f}")
72   ENDFOREACH (f ${_flags})
73
74   SET_TARGET_PROPERTIES (${_target} PROPERTIES ${_property} ${_tmp})
75   UNSET (_tmp)
76 ENDMACRO (ADD_TARGET_PROPERTIES _target _property _flags)
77
78
79 # Append the given dependencies to the source file
80 MACRO(ADD_SOURCE_DEPENDENCIES _source _deps)
81   GET_SOURCE_FILE_PROPERTY(_tmp ${_source} OBJECT_DEPENDS)
82   IF (NOT _tmp)
83     SET (_tmp "")
84   ENDIF ()
85
86   FOREACH (f ${_deps})
87     LIST(APPEND _tmp "${f}")
88   ENDFOREACH ()
89
90   SET_SOURCE_FILES_PROPERTIES(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}")
91   UNSET(_tmp)
92 ENDMACRO()
93
94
95 # Append the given dependencies to the source file
96 # This one consider the given dependencies are in ${DERIVED_SOURCES_WEBCORE_DIR}
97 # and prepends this to every member of dependencies list
98 MACRO(ADD_SOURCE_WEBCORE_DERIVED_DEPENDENCIES _source _deps)
99   SET(_tmp "")
100   FOREACH (f ${_deps})
101     LIST(APPEND _tmp "${DERIVED_SOURCES_WEBCORE_DIR}/${f}")
102   ENDFOREACH ()
103
104   ADD_SOURCE_DEPENDENCIES(${_source} ${_tmp})
105   UNSET(_tmp)
106 ENDMACRO()
107