[3115] | 1 | # |
---|
| 2 | # ORXONOX - the hottest 3D action shooter ever to exist |
---|
| 3 | # > www.orxonox.net < |
---|
| 4 | # |
---|
| 5 | # This program is free software; you can redistribute it and/or |
---|
| 6 | # modify it under the terms of the GNU General Public License |
---|
| 7 | # as published by the Free Software Foundation; either version 2 |
---|
| 8 | # of the License, or (at your option) any later version. |
---|
| 9 | # |
---|
| 10 | # This program is distributed in the hope that it will be useful, |
---|
| 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 13 | # GNU General Public License for more details. |
---|
| 14 | # |
---|
| 15 | # You should have received a copy of the GNU General Public License along |
---|
| 16 | # with this program; if not, write to the Free Software Foundation, |
---|
| 17 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
| 18 | # |
---|
| 19 | # |
---|
| 20 | # Author: |
---|
| 21 | # Reto Grieder |
---|
| 22 | # Description: |
---|
| 23 | # Separates a string of program flags like "--blubb -test -D AA". |
---|
| 24 | # " -" or " /" denotes the start of a flag. |
---|
| 25 | # The same sequence inside double quotation marks is being ignored. |
---|
| 26 | # Spaces not within quotes are cleaned meaningfully. |
---|
| 27 | # Note: |
---|
| 28 | # This macro cannot cope with semicolons in the flag string! |
---|
| 29 | |
---|
| 30 | FUNCTION(SEPARATE_FLAGS _flags _output_variable) |
---|
| 31 | # Visual studio (esp. IntelliSense) doesn't like dashes to specify arguments |
---|
| 32 | # Always use foward slashes instead |
---|
| 33 | IF(MSVC) |
---|
| 34 | SET(_argument_starter "/") |
---|
| 35 | ELSE() |
---|
| 36 | SET(_argument_starter "-") |
---|
| 37 | ENDIF(MSVC) |
---|
| 38 | |
---|
| 39 | SET(_flags_prep " ${_flags} -") |
---|
| 40 | # Separate the chunks |
---|
| 41 | STRING(REPLACE " " " ;" _flag_chunks "${_flags_prep}") # Max loop iterations |
---|
| 42 | SET(_flag_string) |
---|
| 43 | SET(_parsed_flags) |
---|
| 44 | # Loop is necessary because the regex engine is greedy |
---|
| 45 | FOREACH(_chunk ${_flag_chunks}) |
---|
| 46 | SET(_flag_string "${_flag_string}${_chunk}") |
---|
| 47 | # Replace all " -" and " /" inside quotation marks |
---|
| 48 | STRING(REGEX REPLACE "^(([^\"]*\"[^\"]*\")*[^\"]*\"[^\"]*) [/-]([^\"]*\")" |
---|
| 49 | "\\1@39535493@\\3" _flag_string "${_flag_string}") |
---|
| 50 | # Extract one flag if possible |
---|
| 51 | SET(_flag) |
---|
| 52 | STRING(REGEX REPLACE "^.* [/-](.+)( [/-].*$)" "${_argument_starter}\\1" _flag "${_flag_string}") |
---|
| 53 | STRING(REGEX REPLACE "^.* [/-](.+)( [/-].*$)" "\\2" _flag_string "${_flag_string}") |
---|
| 54 | IF(NOT _flag STREQUAL _flag_string) |
---|
| 55 | STRING(STRIP "${_flag}" _flag_stripped) |
---|
| 56 | LIST(APPEND _parsed_flags "${_flag_stripped}") |
---|
| 57 | ENDIF(NOT _flag STREQUAL _flag_string) |
---|
| 58 | ENDFOREACH(_chunk) |
---|
| 59 | |
---|
| 60 | # Re-replace all " -" and " /" inside quotation marks |
---|
| 61 | STRING(REGEX REPLACE "@39535493@" " -" _parsed_flags "${_parsed_flags}") |
---|
| 62 | SET(${_output_variable} "${_parsed_flags}" PARENT_SCOPE) |
---|
| 63 | ENDFUNCTION(SEPARATE_FLAGS) |
---|