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