300eb490aeb7c71c08e47cfe0fc1fb71d98a40af
[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         set_target_properties(${_target} PROPERTIES
49             COMPILE_FLAGS "${OLD_COMPILE_FLAGS}")
50
51         unset(OLD_COMPILE_FLAGS)
52     endif ()
53 endmacro()
54
55
56 # Append the given flag to the target property.
57 # Builds on top of get_target_property() and set_target_properties()
58 macro(ADD_TARGET_PROPERTIES _target _property _flags)
59     get_target_property(_tmp ${_target} ${_property})
60     if (NOT _tmp)
61         set(_tmp "")
62     endif (NOT _tmp)
63
64     foreach (f ${_flags})
65         set(_tmp "${_tmp} ${f}")
66     endforeach (f ${_flags})
67
68     set_target_properties(${_target} PROPERTIES ${_property} ${_tmp})
69     unset(_tmp)
70 endmacro(ADD_TARGET_PROPERTIES _target _property _flags)
71
72
73 # Append the given dependencies to the source file
74 macro(ADD_SOURCE_DEPENDENCIES _source _deps)
75     get_source_file_property(_tmp ${_source} OBJECT_DEPENDS)
76     if (NOT _tmp)
77         set(_tmp "")
78     endif ()
79
80     foreach (f ${_deps})
81         list(APPEND _tmp "${f}")
82     endforeach ()
83
84     set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}")
85     unset(_tmp)
86 endmacro()
87
88
89 # Append the given dependencies to the source file
90 # This one consider the given dependencies are in ${DERIVED_SOURCES_WEBCORE_DIR}
91 # and prepends this to every member of dependencies list
92 macro(ADD_SOURCE_WEBCORE_DERIVED_DEPENDENCIES _source _deps)
93     set(_tmp "")
94     foreach (f ${_deps})
95         list(APPEND _tmp "${DERIVED_SOURCES_WEBCORE_DIR}/${f}")
96     endforeach ()
97
98     ADD_SOURCE_DEPENDENCIES(${_source} ${_tmp})
99     unset(_tmp)
100 endmacro()