mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
140 lines
4.2 KiB
C++
140 lines
4.2 KiB
C++
|
// 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 <vector>
|
||
|
|
||
|
#include "base/md5.h"
|
||
|
#include "base/strings/string_split.h"
|
||
|
#include "base/strings/string_util.h"
|
||
|
|
||
|
CompilerOptions::CompilerOptions() = default;
|
||
|
|
||
|
CompilerOptions::~CompilerOptions() = default;
|
||
|
|
||
|
LinkerOptions::LinkerOptions() = default;
|
||
|
|
||
|
LinkerOptions::~LinkerOptions() = 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 + ' ';
|
||
|
}
|
||
|
|
||
|
// Parses |ldflags| value and stores it in |options|.
|
||
|
void ParseLinkerOption(const std::string& ldflag, LinkerOptions* options) {
|
||
|
const char kSubsytemPrefix[] ="/SUBSYSTEM:";
|
||
|
if (base::StartsWith(ldflag, kSubsytemPrefix,
|
||
|
base::CompareCase::SENSITIVE)) {
|
||
|
const std::string subsystem(
|
||
|
ldflag.begin() + std::string(kSubsytemPrefix).length(),
|
||
|
ldflag.end());
|
||
|
const std::vector<std::string> tokens = base::SplitString(
|
||
|
subsystem, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
||
|
if (!tokens.empty())
|
||
|
options->subsystem = tokens[0];
|
||
|
}
|
||
|
}
|