| Index: tools/gn/visual_studio_utils.cc
|
| diff --git a/tools/gn/visual_studio_utils.cc b/tools/gn/visual_studio_utils.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..894472213dcf5102c74a3c3fa522fdba76945b94
|
| --- /dev/null
|
| +++ b/tools/gn/visual_studio_utils.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "tools/gn/visual_studio_utils.h"
|
| +
|
| +#include "base/md5.h"
|
| +#include "base/strings/string_util.h"
|
| +
|
| +CompilerOptions::CompilerOptions() = default;
|
| +
|
| +CompilerOptions::~CompilerOptions() = default;
|
| +
|
| +std::string MakeGuid(const std::string& entry_path, const std::string& seed) {
|
| + std::string str = base::ToUpperASCII(base::MD5String(seed + entry_path));
|
| + return '{' + str.substr(0, 8) + '-' + str.substr(8, 4) + '-' +
|
| + str.substr(12, 4) + '-' + str.substr(16, 4) + '-' +
|
| + str.substr(20, 12) + '}';
|
| +}
|
| +
|
| +#define SetOption(condition, member, value) \
|
| + if (condition) { \
|
| + options->member = value; \
|
| + return; \
|
| + }
|
| +
|
| +#define AppendOption(condition, member, value, separator) \
|
| + if (condition) { \
|
| + options->member += value + separator; \
|
| + return; \
|
| + }
|
| +
|
| +void ParseCompilerOption(const std::string& cflag, CompilerOptions* options) {
|
| + if (cflag.size() > 2 && cflag[0] == '/') {
|
| + switch (cflag[1]) {
|
| + case 'F':
|
| + AppendOption(cflag.size() > 3 && cflag[2] == 'I', forced_include_files,
|
| + cflag.substr(3), ';')
|
| + break;
|
| +
|
| + case 'G':
|
| + if (cflag[2] == 'S') {
|
| + SetOption(cflag.size() == 3, buffer_security_check, "true")
|
| + SetOption(cflag.size() == 4 && cflag[3] == '-',
|
| + buffer_security_check, "false")
|
| + }
|
| + break;
|
| +
|
| + case 'M':
|
| + switch (cflag[2]) {
|
| + case 'D':
|
| + SetOption(cflag.size() == 3, runtime_library, "MultiThreadedDLL")
|
| + SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library,
|
| + "MultiThreadedDebugDLL")
|
| + break;
|
| +
|
| + case 'T':
|
| + SetOption(cflag.size() == 3, runtime_library, "MultiThreaded")
|
| + SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library,
|
| + "MultiThreadedDebug")
|
| + break;
|
| + }
|
| + break;
|
| +
|
| + case 'O':
|
| + switch (cflag[2]) {
|
| + case '1':
|
| + SetOption(cflag.size() == 3, optimization, "MinSpace")
|
| + break;
|
| +
|
| + case '2':
|
| + SetOption(cflag.size() == 3, optimization, "MaxSpeed")
|
| + break;
|
| +
|
| + case 'd':
|
| + SetOption(cflag.size() == 3, optimization, "Disabled")
|
| + break;
|
| +
|
| + case 'x':
|
| + SetOption(cflag.size() == 3, optimization, "Full")
|
| + break;
|
| + }
|
| + break;
|
| +
|
| + case 'T':
|
| + // Skip flags that cause treating all source files as C and C++ files.
|
| + if (cflag.size() == 3 && (cflag[2] == 'C' || cflag[2] == 'P'))
|
| + return;
|
| + break;
|
| +
|
| + case 'W':
|
| + switch (cflag[2]) {
|
| + case '0':
|
| + case '1':
|
| + case '2':
|
| + case '3':
|
| + case '4':
|
| + SetOption(cflag.size() == 3, warning_level,
|
| + std::string("Level") + cflag[2])
|
| + break;
|
| +
|
| + case 'X':
|
| + SetOption(cflag.size() == 3, treat_warning_as_error, "true")
|
| + break;
|
| + }
|
| + break;
|
| +
|
| + case 'w':
|
| + AppendOption(cflag.size() > 3 && cflag[2] == 'd',
|
| + disable_specific_warnings, cflag.substr(3), ';')
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // Put everything else into additional_options.
|
| + options->additional_options += cflag + ' ';
|
| +}
|
|
|