[WIN32K]
[reactos.git] / reactos / cmake / compilerflags.cmake
index 953bd3f..3928b79 100644 (file)
@@ -8,11 +8,11 @@ function(add_target_property _module _propname)
     list(APPEND _list_properties COMPILE_DEFINITIONS INCLUDE_DIRECTORIES)
     set(_newvalue "")
     get_target_property(_oldvalue ${_module} ${_propname})
-    if (_oldvalue)
+    if(_oldvalue)
         set(_newvalue ${_oldvalue})
     endif()
     list(FIND _list_properties ${_propname} _list_index)
-    if (NOT _list_index EQUAL -1)
+    if(NOT _list_index EQUAL -1)
         # list property
         list(APPEND _newvalue ${ARGN})
     else()
@@ -24,62 +24,27 @@ function(add_target_property _module _propname)
     set_property(TARGET ${_module} PROPERTY ${_propname} ${_newvalue})
 endfunction()
 
-#
-# For backwards compatibility. To be removed soon.
-#
-function(add_compiler_flags)
-    set(flags_list "")
-    # Adds the compiler flag to both CMAKE_C_FLAGS and CMAKE_CXX_FLAGS
-    foreach(flag ${ARGN})
-        set(flags_list "${flags_list} ${flag}")
-    endforeach()
-
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flags_list}" PARENT_SCOPE)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flags_list}" PARENT_SCOPE)
-endfunction()
-
-function(add_linkerflag MODULE _flag)
-    if (${ARGC} GREATER 2)
-        message(STATUS "Excess arguments to add_linkerflag! Module ${MODULE}, args ${ARGN}")
-    endif()
-    set(NEW_LINKER_FLAGS ${_flag})
-    get_target_property(LINKER_FLAGS ${MODULE} LINK_FLAGS)
-    if(LINKER_FLAGS)
-        set(NEW_LINKER_FLAGS "${LINKER_FLAGS} ${NEW_LINKER_FLAGS}")
-    endif()
-    set_target_properties(${MODULE} PROPERTIES LINK_FLAGS ${NEW_LINKER_FLAGS})
-endfunction()
-
-# New versions, using add_target_property where appropriate.
+# Wrapper functions for the important properties, using add_target_property
+# where appropriate.
 # Note that the functions for string properties take a single string
 # argument while those for list properties can take a variable number of
 # arguments, all of which will be added to the list
 #
 # Examples:
-#  add_compile_flags("-pedantic -O5")
-#  add_target_link_flags(mymodule "-s --fatal-warnings")
 #  add_target_compile_flags(mymodule "-pedantic -O5")
-#  add_target_compile_definitions(mymodule WIN32 _WIN32)
+#  add_target_link_flags(mymodule "-s --fatal-warnings")
+#  add_target_compile_definitions(mymodule WIN32 _WIN32 INLINE=inline)
 #  add_target_include_directories(mymodule include ../include)
-function(add_compile_flags _flags)
-    if (${ARGC} GREATER 1)
-        message(STATUS "Excess arguments to add_compile_flags! Args ${ARGN}")
-    endif()
-    # Adds the compiler flag to both CMAKE_C_FLAGS and CMAKE_CXX_FLAGS
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flags}" PARENT_SCOPE)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flags}" PARENT_SCOPE)
-endfunction()
-
 function(add_target_compile_flags _module _flags)
-    if (${ARGC} GREATER 2)
-        message(STATUS "Excess arguments to add_target_compile_flags! Module ${_module}, args ${ARGN}")
+    if(${ARGC} GREATER 2)
+        message(FATAL_ERROR "Excess arguments to add_target_compile_flags! Module ${_module}, args ${ARGN}")
     endif()
     add_target_property(${_module} COMPILE_FLAGS ${_flags})
 endfunction()
 
 function(add_target_link_flags _module _flags)
-    if (${ARGC} GREATER 2)
-        message(STATUS "Excess arguments to add_target_link_flags! Module ${_module}, args ${ARGN}")
+    if(${ARGC} GREATER 2)
+        message(FATAL_ERROR "Excess arguments to add_target_link_flags! Module ${_module}, args ${ARGN}")
     endif()
     add_target_property(${_module} LINK_FLAGS ${_flags})
 endfunction()
@@ -92,18 +57,69 @@ function(add_target_include_directories _module)
     add_target_property(${_module} INCLUDE_DIRECTORIES ${ARGN})
 endfunction()
 
-macro(set_unicode)
-   add_definitions(-DUNICODE -D_UNICODE)
-   set(IS_UNICODE 1)
-endmacro()
+# replace_compiler_option
+#  (taken from LLVM)
+#  Replaces a compiler option or switch `_old' in `_var' by `_new'.
+#  If `_old' is not in `_var', appends `_new' to `_var'.
+#
+# Example:
+#  replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
+macro(replace_compiler_option _var _old _new)
+    # If the option already is on the variable, don't add it:
+    if("${${_var}}" MATCHES "(^| )${_new}($| )")
+        set(__n "")
+    else()
+        set(__n "${_new}")
+    endif()
+    if("${${_var}}" MATCHES "(^| )${_old}($| )")
+        string(REGEX REPLACE "(^| )${_old}($| )" " ${__n} " ${_var} "${${_var}}")
+    else()
+        set(${_var} "${${_var}} ${__n}")
+    endif()
+endmacro(replace_compiler_option)
 
-function(add_compiler_flags_target __module)
-    get_target_property(__flags ${__module} COMPILE_FLAGS)
-    if(NOT __flags)
-        set(__flags "")
+# add_compile_flags
+# add_compile_flags_language
+# replace_compile_flags
+# replace_compile_flags_language
+#  Add or replace compiler flags in the global scope for either all source
+#  files or only those of the specified language.
+#
+# Examples:
+#  add_compile_flags("-pedantic -O5")
+#  add_compile_flags_language("-std=gnu99" "C")
+#  replace_compile_flags("-O5" "-O3")
+#  replace_compile_flags_language("-fno-exceptions" "-fexceptions" "CXX")
+function(add_compile_flags _flags)
+    if(${ARGC} GREATER 1)
+        message(FATAL_ERROR "Excess arguments to add_compile_flags! Args ${ARGN}")
     endif()
-    foreach(flag ${ARGN})
-        set(__flags "${__flags} ${flag}")
-    endforeach()
-    set_target_properties(${__module} PROPERTIES COMPILE_FLAGS ${__flags})
+    # Adds the compiler flag for all code files: C, C++, and assembly
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flags}" PARENT_SCOPE)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flags}" PARENT_SCOPE)
+    set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${_flags}" PARENT_SCOPE)
 endfunction()
+
+function(add_compile_flags_language _flags _lang)
+    if(NOT ${ARGC} EQUAL 2)
+        message(FATAL_ERROR "Wrong arguments to add_compile_flags_language! Args ${ARGN}")
+    endif()
+    # Adds the compiler flag for the specified language only, e.g. CMAKE_C_FLAGS
+    set(CMAKE_${_lang}_FLAGS "${CMAKE_${_lang}_FLAGS} ${_flags}" PARENT_SCOPE)
+endfunction()
+
+macro(replace_compile_flags _oldflags _newflags)
+    if(NOT ${ARGC} EQUAL 2)
+        message(FATAL_ERROR "Wrong arguments to replace_compile_flags! Args ${ARGN}")
+    endif()
+    replace_compiler_option(CMAKE_C_FLAGS ${_oldflags} ${_newflags})
+    replace_compiler_option(CMAKE_CXX_FLAGS ${_oldflags} ${_newflags})
+    replace_compiler_option(CMAKE_ASM_FLAGS ${_oldflags} ${_newflags})
+endmacro()
+
+macro(replace_compile_flags_language _oldflags _newflags _lang)
+    if(NOT ${ARGC} EQUAL 3)
+        message(FATAL_ERROR "Wrong arguments to replace_compile_flags_language! Args ${ARGN}")
+    endif()
+    replace_compiler_option(CMAKE_${_lang}_FLAGS ${_oldflags} ${_newflags})
+endmacro()