13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/binary_target_generator.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/config_values_generator.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/deps_iterator.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/err.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/functions.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/scope.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/value_extractors.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "tools/gn/variables.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)BinaryTargetGenerator::BinaryTargetGenerator(
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Target* target,
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Scope* scope,
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const FunctionCallNode* function_call,
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Target::OutputType type,
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Err* err)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : TargetGenerator(target, scope, function_call, err),
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      output_type_(type) {
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)BinaryTargetGenerator::~BinaryTargetGenerator() {
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BinaryTargetGenerator::DoRun() {
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  target_->set_output_type(output_type_);
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillOutputName())
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillOutputExtension())
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillSources())
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillPublic())
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillCheckIncludes())
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillInputs())
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillConfigs())
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillAllowCircularIncludesFrom())
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!FillCompleteStaticLib())
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Config values (compiler flags, etc.) set directly on this target.
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ConfigValuesGenerator gen(&target_->config_values(), scope_,
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            scope_->GetSourceDir(), err_);
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  gen.Run();
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (err_->has_error())
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BinaryTargetGenerator::FillCheckIncludes() {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const Value* value = scope_->GetValue(variables::kCheckIncludes, true);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!value)
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!value->VerifyTypeIs(Value::BOOLEAN, err_))
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  target_->set_check_includes(value->boolean_value());
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BinaryTargetGenerator::FillCompleteStaticLib() {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (target_->output_type() == Target::STATIC_LIBRARY) {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const Value* value = scope_->GetValue(variables::kCompleteStaticLib, true);
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!value)
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return true;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!value->VerifyTypeIs(Value::BOOLEAN, err_))
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    target_->set_complete_static_lib(value->boolean_value());
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BinaryTargetGenerator::FillOutputName() {
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const Value* value = scope_->GetValue(variables::kOutputName, true);
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!value)
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!value->VerifyTypeIs(Value::STRING, err_))
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  target_->set_output_name(value->string_value());
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BinaryTargetGenerator::FillOutputExtension() {
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const Value* value = scope_->GetValue(variables::kOutputExtension, true);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!value)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!value->VerifyTypeIs(Value::STRING, err_))
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  target_->set_output_extension(value->string_value());
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BinaryTargetGenerator::FillAllowCircularIncludesFrom() {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const Value* value = scope_->GetValue(
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      variables::kAllowCircularIncludesFrom, true);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!value)
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UniqueVector<Label> circular;
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtractListOfUniqueLabels(*value, scope_->GetSourceDir(),
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            ToolchainLabelForScope(scope_), &circular, err_);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (err_->has_error())
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Validate that all circular includes entries are in the deps.
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t circular_i = 0; circular_i < circular.size(); circular_i++) {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool found_dep = false;
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (DepsIterator iter(target_, DepsIterator::LINKED_ONLY);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         !iter.done(); iter.Advance()) {
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (iter.label() == circular[circular_i]) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        found_dep = true;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!found_dep) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *err_ = Err(*value, "Label not in deps.",
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "The label \"" + circular[circular_i].GetUserVisibleName(false) +
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"\nwas not in the deps of this target. "
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "allow_circular_includes_from only allows\ntargets present in the "
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "deps.");
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add to the set.
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < circular.size(); i++)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    target_->allow_circular_includes_from().insert(circular[i]);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
145