Author: tfaber Date: Sat Jun 22 12:15:50 2013 New Revision: 59286 URL: http://svn.reactos.org/svn/reactos?rev=59286&view=rev Log: [CMAKE] - Add replace_compile_flags macros. Thanks to Amine and LLVM. - Clean up compilerflags.cmake a bit, and make invalid macro/function invocations fatal so we actually notice them
Modified: trunk/reactos/cmake/compilerflags.cmake Modified: trunk/reactos/cmake/compilerflags.cmake URL: http://svn.reactos.org/svn/reactos/trunk/reactos/cmake/compilerflags.cmake?rev=59286&r1=59285&r2=59286&view=diff ============================================================================== --- trunk/reactos/cmake/compilerflags.cmake [iso-8859-1] (original) +++ trunk/reactos/cmake/compilerflags.cmake [iso-8859-1] Sat Jun 22 12:15:50 2013 @@ -31,40 +31,20 @@ # arguments, all of which will be added to the list # # Examples: -# add_compile_flags("-pedantic -O5") +# add_target_compile_flags(mymodule "-pedantic -O5") # add_target_link_flags(mymodule "-s --fatal-warnings") -# add_target_compile_flags(mymodule "-pedantic -O5") # add_target_compile_definitions(mymodule WIN32 _WIN32 INLINE=inline) # add_target_include_directories(mymodule include ../include) -# add_compile_flags_language("-std=gnu99" "C") -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) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${_flags}" PARENT_SCOPE) -endfunction() - -function(add_compile_flags_language _flags _lang) - if(NOT ${ARGC} EQUAL 2) - message(STATUS "Wrong arguments to add_compile_flags_language! Args ${ARGN}") - endif() - # Adds the compiler flag to both CMAKE_C_FLAGS and CMAKE_CXX_FLAGS - set(CMAKE_${_lang}_FLAGS "${CMAKE_${_lang}_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}") + 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}") + message(FATAL_ERROR "Excess arguments to add_target_link_flags! Module ${_module}, args ${ARGN}") endif() add_target_property(${_module} LINK_FLAGS ${_flags}) endfunction() @@ -76,3 +56,70 @@ function(add_target_include_directories _module) add_target_property(${_module} INCLUDE_DIRECTORIES ${ARGN}) endfunction() + +# 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) + +# 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() + # 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()