Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 3115


Ignore:
Timestamp:
Jun 3, 2009, 7:45:10 PM (15 years ago)
Author:
rgrieder
Message:

Split the flag parser and the advanced cache writer from "FlagUtilities.cmake".

Location:
code/branches/pch/cmake
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/pch/cmake/FlagUtilities.cmake

    r2792 r3115  
    2424 #    Release, Debug, RelWithDebInfo, MinSizeRel: Build configs (inclusive)
    2525 #    ReleaseAll: Sets the flags of all three release builds
    26  #    CACHE: Values are witten with SET_CACHE (see above)
     26 #    CACHE: Values are witten with SET_CACHE_ADVANCED
    2727 #    FORCE: When writing to the cache, the values are set anyway
    2828 #    Any variable names (like WIN32, MSVC, etc.): Condition (combined with AND)
    2929 #    You can suffix the condition with a NOT if you wish
    30  #  Functions:
     30 #  Function names:
    3131 #    [ADD/SET/REMOVE]_[COMPILER/LINKER]_FLAGS
    3232 #  Caution: -If you use CACHE after calling the macro without CACHE, the value
    33  #            Will not get written unless FORCE is specified.
     33 #            Will not be written unless FORCE is specified.
    3434 #          - Also be aware to always specify the flags in quotes.
    3535 #  Example:
     
    3737 #    This will only remove the CXX (C++) flags on a non Unix system for the
    3838 #    Release, RelWithDebInfo and MinSizeRel configurations. The macros should
    39  #    be able to cope with "test -foo" that is like another flag in the string.
     39 #    be able to cope with "test -foo" as string argument for a flag.
    4040 #
    4141
    42 # Write to the cache by force, but only if the user didn't edit the value
    43 # Additional argument is the value (may also be a list)
    44 MACRO(SET_CACHE _varname _type _docstring)
    45   SET(_value ${ARGN})
    46   IF(NOT "${_type}" MATCHES "^(STRING|BOOL|PATH|FILEPATH)$")
    47     MESSAGE(FATAL_ERROR "${_type} is not a valid CACHE entry type")
    48   ENDIF()
     42INCLUDE(SeparateFlags)
     43INCLUDE(SetCacheAdvanced)
    4944
    50   IF(NOT DEFINED _INTERNAL_${_varname} OR "${_INTERNAL_${_varname}}" STREQUAL "${${_varname}}")
    51     SET(${_varname} "${_value}" CACHE ${_type} "${_docstring}" FORCE)
    52     SET(_INTERNAL_${_varname} "${_value}" CACHE INTERNAL "Do not edit in any case!")
    53   ENDIF()
    54 ENDMACRO(SET_CACHE)
     45# Compiler flags, additional arguments:
     46# C, CXX: Specify a language, default is both
     47MACRO(SET_COMPILER_FLAGS _flags)
     48  _INTERNAL_PARSE_FLAGS_ARGS(SET "C;CXX" "" "${_flags}" "${ARGN}")
     49ENDMACRO(SET_COMPILER_FLAGS)
     50# Add flags (flags don't get added twice)
     51MACRO(ADD_COMPILER_FLAGS _flags)
     52  _INTERNAL_PARSE_FLAGS_ARGS(APPEND "C;CXX" "" "${_flags}" "${ARGN}")
     53ENDMACRO(ADD_COMPILER_FLAGS)
     54# Remove flags
     55MACRO(REMOVE_COMPILER_FLAGS _flags)
     56  _INTERNAL_PARSE_FLAGS_ARGS(REMOVE_ITEM "C;CXX" "" "${_flags}" "${ARGN}")
     57ENDMACRO(REMOVE_COMPILER_FLAGS)
    5558
    56 # Visual studio (esp. IntelliSense) doesn't like dashes to specify arguments
    57 # Always use foward slashes instead
    58 IF(MSVC)
    59   SET(ARGUMENT_STARTER "/")
    60 ELSE()
    61   SET(ARGUMENT_STARTER "-")
    62 ENDIF(MSVC)
    6359
    64 # Separates a string of flags. " -" or " /" denotes the start of a flag.
    65 # The same sequence inside double quotation marks is ignored.
    66 # Spaces not within quotes are cleaned meaningfully.
    67 # This macro cannot cope with semicolons in the flag string!
    68 MACRO(SEPARATE_FLAGS _flags _output_variable)
    69   SET(_flags_prep " ${_flags} -")
    70   STRING(REPLACE " " " ;" _flag_chunks ${_flags_prep}) # Max loop iterations
    71   SET(_flag_string)
    72   SET(_parsed_flags)
    73   # Loop is necessary because the regex engine is greedy
    74   FOREACH(_chunk ${_flag_chunks})
    75     SET(_flag_string "${_flag_string}${_chunk}")
    76     # Replace all " -" and " /" inside quotation marks
    77     STRING(REGEX REPLACE "^(([^\"]*\"[^\"]*\")*[^\"]*\"[^\"]*) [/-]([^\"]*\")"
    78            "\\1@39535493@\\3" _flag_string "${_flag_string}")
    79     # Extract one flag if possible
    80     SET(_flag)
    81     STRING(REGEX REPLACE "^.* [/-](.+)( [/-].*$)" "${ARGUMENT_STARTER}\\1" _flag "${_flag_string}")
    82     STRING(REGEX REPLACE "^.* [/-](.+)( [/-].*$)" "\\2"  _flag_string "${_flag_string}")
    83     IF(NOT _flag STREQUAL _flag_string)
    84       LIST(APPEND _parsed_flags "${_flag}")
    85     ENDIF(NOT _flag STREQUAL _flag_string)
    86   ENDFOREACH(_chunk)
     60# Linker flags, additional arguments:
     61# EXE, SHARED, MODULE: Specify a linker mode, default is all three
     62MACRO(SET_LINKER_FLAGS _flags)
     63  _INTERNAL_PARSE_FLAGS_ARGS(SET "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
     64ENDMACRO(SET_LINKER_FLAGS)
     65# Add flags (flags don't get added twice)
     66MACRO(ADD_LINKER_FLAGS _flags)
     67  _INTERNAL_PARSE_FLAGS_ARGS(APPEND "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
     68ENDMACRO(ADD_LINKER_FLAGS)
     69# Remove flags
     70MACRO(REMOVE_LINKER_FLAGS _flags)
     71  _INTERNAL_PARSE_FLAGS_ARGS(REMOVE_ITEM "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
     72ENDMACRO(REMOVE_LINKER_FLAGS)
    8773
    88   # Re-replace all " -" and " /" inside quotation marks
    89   STRING(REGEX REPLACE "@39535493@" " -" ${_output_variable} "${_parsed_flags}")
    90 ENDMACRO(SEPARATE_FLAGS)
    91 
    92 # Internal macro, do not use
    93 # Modifies the flags according to the mode: set, add or remove
    94 # Also sets flags according to the CACHE and FORCE parameter.
    95 # If only CACHE is specified, SET_CACHE() is used.
    96 MACRO(_INTERNAL_PARSE_FLAGS _mode _flags _varname _write_to_cache _force)
    97   SEPARATE_FLAGS("${_flags}" _arg_flag_list)
    98 
    99   IF("${_mode}" STREQUAL "SET")
    100     # SET
    101     SET(_flag_list "${_arg_flag_list}")
    102   ELSE()
    103     # ADD or REMOVE
    104     SEPARATE_FLAGS("${${_varname}}" _flag_list)
    105     FOREACH(_flag ${_arg_flag_list})
    106       LIST(${_mode} _flag_list "${_flag}")
    107     ENDFOREACH(_flag)
    108   ENDIF()
    109 
    110   LIST(REMOVE_DUPLICATES _flag_list)
    111   LIST(SORT _flag_list)
    112   STRING(REPLACE ";" " " _flag_list "${_flag_list}")
    113 
    114   IF(_write_to_cache)
    115     IF(_force)
    116       SET(${_varname} "${_flag_list}" CACHE STRING "${${_varname}}" FORCE)
    117       SET(${_varname} "${_flag_list}" CACHE STRING "${${_varname}}" FORCE)
    118     ELSE()
    119       SET_CACHE(${_varname} STRING "${${_varname}}" "${_flag_list}")
    120     ENDIF()
    121   ELSE()
    122     SET(${_varname} "${_flag_list}")
    123   ENDIF()
    124 ENDMACRO(_INTERNAL_PARSE_FLAGS)
    12574
    12675# Internal macro, do not use
     
    155104      IF(_invert_condition)
    156105        SET(_invert_condition FALSE)
    157     IF(${_arg})
     106        IF(${_arg})
    158107          SET(_arg_cond FALSE)
    159     ELSE()
     108        ELSE()
    160109          SET(_arg_cond TRUE)
    161     ENDIF()
     110       ENDIF()
    162111      ELSE()
    163112        SET(_arg_cond ${${_arg}})
     
    191140
    192141
    193 # Compiler flags, additional arguments:
    194 # C, CXX: Specify a language, default is both
    195 MACRO(SET_COMPILER_FLAGS _flags)
    196   _INTERNAL_PARSE_FLAGS_ARGS(SET "C;CXX" "" "${_flags}" "${ARGN}")
    197 ENDMACRO(SET_COMPILER_FLAGS)
    198 # Add flags (flags don't get added twice)
    199 MACRO(ADD_COMPILER_FLAGS _flags)
    200   _INTERNAL_PARSE_FLAGS_ARGS(APPEND "C;CXX" "" "${_flags}" "${ARGN}")
    201 ENDMACRO(ADD_COMPILER_FLAGS)
    202 # Remove flags
    203 MACRO(REMOVE_COMPILER_FLAGS _flags)
    204   _INTERNAL_PARSE_FLAGS_ARGS(REMOVE_ITEM "C;CXX" "" "${_flags}" "${ARGN}")
    205 ENDMACRO(REMOVE_COMPILER_FLAGS)
     142# Internal macro, do not use
     143# Modifies the flags according to the mode: set, add or remove
     144# Also sets flags according to the CACHE and FORCE parameter.
     145# If only CACHE is specified, SET_CACHE_ADVANCED() is used.
     146MACRO(_INTERNAL_PARSE_FLAGS _mode _flags _varname _write_to_cache _force)
     147  SEPARATE_FLAGS("${_flags}" _arg_flag_list)
    206148
    207 # Linker flags, additional arguments:
    208 # EXE, SHARED, MODULE: Specify a linker mode, default is all three
    209 MACRO(SET_LINKER_FLAGS _flags)
    210   _INTERNAL_PARSE_FLAGS_ARGS(SET "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
    211 ENDMACRO(SET_LINKER_FLAGS)
    212 # Add flags (flags don't get added twice)
    213 MACRO(ADD_LINKER_FLAGS _flags)
    214   _INTERNAL_PARSE_FLAGS_ARGS(APPEND "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
    215 ENDMACRO(ADD_LINKER_FLAGS)
    216 # Remove flags
    217 MACRO(REMOVE_LINKER_FLAGS _flags)
    218   _INTERNAL_PARSE_FLAGS_ARGS(REMOVE_ITEM "EXE;SHARED;MODULE" "_LINKER" "${_flags}" "${ARGN}")
    219 ENDMACRO(REMOVE_LINKER_FLAGS)
     149  IF("${_mode}" STREQUAL "SET")
     150    # SET
     151    SET(_flag_list "${_arg_flag_list}")
     152  ELSE()
     153    # ADD or REMOVE
     154    SEPARATE_FLAGS("${${_varname}}" _flag_list)
     155    IF(NOT _flag_list)
     156      SET(_flag_list "") # LIST command requires a list in any case
     157    ENDIF()
     158    FOREACH(_flag ${_arg_flag_list})
     159      LIST(${_mode} _flag_list "${_flag}")
     160    ENDFOREACH(_flag)
     161  ENDIF()
     162
     163  LIST(REMOVE_DUPLICATES _flag_list)
     164  LIST(SORT _flag_list)
     165  STRING(REPLACE ";" " " _flag_list "${_flag_list}")
     166
     167  IF(_write_to_cache)
     168    IF(_force)
     169      SET(${_varname} "${_flag_list}" CACHE STRING "${${_varname}}" FORCE)
     170      SET(${_varname} "${_flag_list}" CACHE STRING "${${_varname}}" FORCE)
     171    ELSE()
     172      SET_CACHE_ADVANCED(${_varname} STRING "${${_varname}}" "${_flag_list}")
     173    ENDIF()
     174  ELSE()
     175    SET(${_varname} "${_flag_list}")
     176  ENDIF()
     177ENDMACRO(_INTERNAL_PARSE_FLAGS)
Note: See TracChangeset for help on using the changeset viewer.