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.
4
5 #include "tools/gn/config_values_generator.h"
6
7 #include "tools/gn/config_values.h"
8 #include "tools/gn/scope.h"
9 #include "tools/gn/settings.h"
10 #include "tools/gn/value.h"
11 #include "tools/gn/value_extractors.h"
12 #include "tools/gn/variables.h"
13
14 namespace {
15
GetStringList(Scope * scope,const char * var_name,ConfigValues * config_values,std::vector<std::string> & (ConfigValues::* accessor)(),Err * err)16 void GetStringList(
17 Scope* scope,
18 const char* var_name,
19 ConfigValues* config_values,
20 std::vector<std::string>& (ConfigValues::* accessor)(),
21 Err* err) {
22 const Value* value = scope->GetValue(var_name, true);
23 if (!value)
24 return; // No value, empty input and succeed.
25
26 std::vector<std::string> result;
27 ExtractListOfStringValues(*value, &result, err);
28 (config_values->*accessor)().swap(result);
29 }
30
GetDirList(Scope * scope,const char * var_name,ConfigValues * config_values,const SourceDir input_dir,std::vector<SourceDir> & (ConfigValues::* accessor)(),Err * err)31 void GetDirList(
32 Scope* scope,
33 const char* var_name,
34 ConfigValues* config_values,
35 const SourceDir input_dir,
36 std::vector<SourceDir>& (ConfigValues::* accessor)(),
37 Err* err) {
38 const Value* value = scope->GetValue(var_name, true);
39 if (!value)
40 return; // No value, empty input and succeed.
41
42 std::vector<SourceDir> result;
43 ExtractListOfRelativeDirs(scope->settings()->build_settings(),
44 *value, input_dir, &result, err);
45 (config_values->*accessor)().swap(result);
46 }
47
48 } // namespace
49
ConfigValuesGenerator(ConfigValues * dest_values,Scope * scope,const SourceDir & input_dir,Err * err)50 ConfigValuesGenerator::ConfigValuesGenerator(
51 ConfigValues* dest_values,
52 Scope* scope,
53 const SourceDir& input_dir,
54 Err* err)
55 : config_values_(dest_values),
56 scope_(scope),
57 input_dir_(input_dir),
58 err_(err) {
59 }
60
~ConfigValuesGenerator()61 ConfigValuesGenerator::~ConfigValuesGenerator() {
62 }
63
Run()64 void ConfigValuesGenerator::Run() {
65 #define FILL_STRING_CONFIG_VALUE(name) \
66 GetStringList(scope_, #name, config_values_, &ConfigValues::name, err_);
67 #define FILL_DIR_CONFIG_VALUE(name) \
68 GetDirList(scope_, #name, config_values_, input_dir_, \
69 &ConfigValues::name, err_);
70
71 FILL_STRING_CONFIG_VALUE(cflags)
72 FILL_STRING_CONFIG_VALUE(cflags_c)
73 FILL_STRING_CONFIG_VALUE(cflags_cc)
74 FILL_STRING_CONFIG_VALUE(cflags_objc)
75 FILL_STRING_CONFIG_VALUE(cflags_objcc)
76 FILL_STRING_CONFIG_VALUE(defines)
77 FILL_DIR_CONFIG_VALUE( include_dirs)
78 FILL_STRING_CONFIG_VALUE(ldflags)
79 FILL_DIR_CONFIG_VALUE( lib_dirs)
80 FILL_STRING_CONFIG_VALUE(libs)
81
82 #undef FILL_STRING_CONFIG_VALUE
83 #undef FILL_DIR_CONFIG_VALUE
84 }
85