1 // Copyright (c) 2013 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.
5 #include "tools/gn/config_values_generator.h"
7 #include "base/strings/string_util.h"
8 #include "tools/gn/config_values.h"
9 #include "tools/gn/scope.h"
10 #include "tools/gn/settings.h"
11 #include "tools/gn/value.h"
12 #include "tools/gn/value_extractors.h"
13 #include "tools/gn/variables.h"
20 ConfigValues
* config_values
,
21 std::vector
<std::string
>& (ConfigValues::* accessor
)(),
23 const Value
* value
= scope
->GetValue(var_name
, true);
25 return; // No value, empty input and succeed.
27 std::vector
<std::string
> result
;
28 ExtractListOfStringValues(*value
, &result
, err
);
29 (config_values
->*accessor
)().swap(result
);
35 ConfigValues
* config_values
,
36 const SourceDir input_dir
,
37 std::vector
<SourceDir
>& (ConfigValues::* accessor
)(),
39 const Value
* value
= scope
->GetValue(var_name
, true);
41 return; // No value, empty input and succeed.
43 std::vector
<SourceDir
> result
;
44 ExtractListOfRelativeDirs(scope
->settings()->build_settings(),
45 *value
, input_dir
, &result
, err
);
46 (config_values
->*accessor
)().swap(result
);
51 ConfigValuesGenerator::ConfigValuesGenerator(
52 ConfigValues
* dest_values
,
54 const SourceDir
& input_dir
,
56 : config_values_(dest_values
),
58 input_dir_(input_dir
),
62 ConfigValuesGenerator::~ConfigValuesGenerator() {
65 void ConfigValuesGenerator::Run() {
66 #define FILL_STRING_CONFIG_VALUE(name) \
67 GetStringList(scope_, #name, config_values_, &ConfigValues::name, err_);
68 #define FILL_DIR_CONFIG_VALUE(name) \
69 GetDirList(scope_, #name, config_values_, input_dir_, \
70 &ConfigValues::name, err_);
72 FILL_STRING_CONFIG_VALUE(cflags
)
73 FILL_STRING_CONFIG_VALUE(cflags_c
)
74 FILL_STRING_CONFIG_VALUE(cflags_cc
)
75 FILL_STRING_CONFIG_VALUE(cflags_objc
)
76 FILL_STRING_CONFIG_VALUE(cflags_objcc
)
77 FILL_STRING_CONFIG_VALUE(defines
)
78 FILL_DIR_CONFIG_VALUE( include_dirs
)
79 FILL_STRING_CONFIG_VALUE(ldflags
)
80 FILL_DIR_CONFIG_VALUE( lib_dirs
)
81 FILL_STRING_CONFIG_VALUE(libs
)
83 #undef FILL_STRING_CONFIG_VALUE
84 #undef FILL_DIR_CONFIG_VALUE
86 // Precompiled headers.
87 const Value
* precompiled_header_value
=
88 scope_
->GetValue(variables::kPrecompiledHeader
, true);
89 if (precompiled_header_value
) {
90 if (!precompiled_header_value
->VerifyTypeIs(Value::STRING
, err_
))
93 // Check for common errors. This is a string and not a file.
94 const std::string
& pch_string
= precompiled_header_value
->string_value();
95 if (base::StartsWith(pch_string
, "//", base::CompareCase::SENSITIVE
)) {
96 *err_
= Err(*precompiled_header_value
,
97 "This precompiled_header value is wrong.",
98 "You need to specify a string that the compiler will match against\n"
99 "the #include lines rather than a GN-style file name.\n");
102 config_values_
->set_precompiled_header(pch_string
);
105 const Value
* precompiled_source_value
=
106 scope_
->GetValue(variables::kPrecompiledSource
, true);
107 if (precompiled_source_value
) {
108 config_values_
->set_precompiled_source(
109 input_dir_
.ResolveRelativeFile(
110 *precompiled_source_value
, err_
,
111 scope_
->settings()->build_settings()->root_path_utf8()));
112 if (err_
->has_error())