OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "tools/gn/visual_studio_utils.h" |
| 6 |
| 7 #include "base/md5.h" |
| 8 #include "base/strings/string_util.h" |
| 9 |
| 10 std::string MakeGuid(const std::string& entry_path, const std::string& seed) { |
| 11 std::string str = base::ToUpperASCII(base::MD5String(seed + entry_path)); |
| 12 return '{' + str.substr(0, 8) + '-' + str.substr(8, 4) + '-' + |
| 13 str.substr(12, 4) + '-' + str.substr(16, 4) + '-' + |
| 14 str.substr(20, 12) + '}'; |
| 15 } |
| 16 |
| 17 #define SetOption(condition, member, value) \ |
| 18 if (condition) { \ |
| 19 options->member = value; \ |
| 20 return; \ |
| 21 } |
| 22 |
| 23 #define AppendOption(condition, member, value, separator) \ |
| 24 if (condition) { \ |
| 25 options->member += value + separator; \ |
| 26 return; \ |
| 27 } |
| 28 |
| 29 void ParseCompilerOption(const std::string& cflag, CompilerOptions* options) { |
| 30 if (cflag.size() > 2 && cflag[0] == '/') { |
| 31 switch (cflag[1]) { |
| 32 case 'F': |
| 33 AppendOption(cflag.size() > 3 && cflag[2] == 'I', forced_include_files, |
| 34 cflag.substr(3), ';') |
| 35 break; |
| 36 |
| 37 case 'G': |
| 38 if (cflag[2] == 'S') { |
| 39 SetOption(cflag.size() == 3, buffer_security_check, "true") |
| 40 SetOption(cflag.size() == 4 && cflag[3] == '-', |
| 41 buffer_security_check, "false") |
| 42 } |
| 43 break; |
| 44 |
| 45 case 'M': |
| 46 switch (cflag[2]) { |
| 47 case 'D': |
| 48 SetOption(cflag.size() == 3, runtime_library, "MultiThreadedDLL") |
| 49 SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library, |
| 50 "MultiThreadedDebugDLL") |
| 51 break; |
| 52 |
| 53 case 'T': |
| 54 SetOption(cflag.size() == 3, runtime_library, "MultiThreaded") |
| 55 SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library, |
| 56 "MultiThreadedDebug") |
| 57 break; |
| 58 } |
| 59 break; |
| 60 |
| 61 case 'O': |
| 62 switch (cflag[2]) { |
| 63 case '1': |
| 64 SetOption(cflag.size() == 3, optimization, "MinSpace") |
| 65 break; |
| 66 |
| 67 case '2': |
| 68 SetOption(cflag.size() == 3, optimization, "MaxSpeed") |
| 69 break; |
| 70 |
| 71 case 'd': |
| 72 SetOption(cflag.size() == 3, optimization, "Disabled") |
| 73 break; |
| 74 |
| 75 case 'x': |
| 76 SetOption(cflag.size() == 3, optimization, "Full") |
| 77 break; |
| 78 } |
| 79 break; |
| 80 |
| 81 case 'T': |
| 82 // Skip flags that cause treating all source files as C and C++ files. |
| 83 if (cflag.size() == 3 && (cflag[2] == 'C' || cflag[2] == 'P')) |
| 84 return; |
| 85 break; |
| 86 |
| 87 case 'W': |
| 88 switch (cflag[2]) { |
| 89 case '0': |
| 90 case '1': |
| 91 case '2': |
| 92 case '3': |
| 93 case '4': |
| 94 SetOption(cflag.size() == 3, warning_level, |
| 95 std::string("Level") + cflag[2]) |
| 96 break; |
| 97 |
| 98 case 'X': |
| 99 SetOption(cflag.size() == 3, treat_warning_as_error, "true") |
| 100 break; |
| 101 } |
| 102 break; |
| 103 |
| 104 case 'w': |
| 105 AppendOption(cflag.size() > 3 && cflag[2] == 'd', |
| 106 disable_specific_warnings, cflag.substr(3), ';') |
| 107 break; |
| 108 } |
| 109 } |
| 110 |
| 111 // Put everything else into additional_options. |
| 112 options->additional_options += cflag + ' '; |
| 113 } |
OLD | NEW |