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
14namespace {
15
16void 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
31void 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
50ConfigValuesGenerator::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
61ConfigValuesGenerator::~ConfigValuesGenerator() {
62}
63
64void 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