| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/ninja_binary_target_writer.h" | 5 #include "tools/gn/ninja_binary_target_writer.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "tools/gn/config_values_extractors.h" | 10 #include "tools/gn/config_values_extractors.h" |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 std::vector<const Target*>* linkable_deps, | 419 std::vector<const Target*>* linkable_deps, |
| 420 std::vector<const Target*>* non_linkable_deps) const { | 420 std::vector<const Target*>* non_linkable_deps) const { |
| 421 // Only these types of outputs have libraries linked into them. Child deps of | 421 // Only these types of outputs have libraries linked into them. Child deps of |
| 422 // static libraries get pushed up the dependency tree until one of these is | 422 // static libraries get pushed up the dependency tree until one of these is |
| 423 // reached, and source sets don't link at all. | 423 // reached, and source sets don't link at all. |
| 424 bool can_link_libs = | 424 bool can_link_libs = |
| 425 (target_->output_type() == Target::EXECUTABLE || | 425 (target_->output_type() == Target::EXECUTABLE || |
| 426 target_->output_type() == Target::SHARED_LIBRARY); | 426 target_->output_type() == Target::SHARED_LIBRARY); |
| 427 | 427 |
| 428 if (dep->output_type() == Target::SOURCE_SET) { | 428 if (dep->output_type() == Target::SOURCE_SET) { |
| 429 if (target_->output_type() == Target::SOURCE_SET) { | 429 // Source sets have their object files linked into final targets (shared |
| 430 // When a source set depends on another source set, add it as a data | 430 // libraries and executables). Intermediate static libraries and other |
| 431 // dependency so if the user says "ninja second_source_set" it will | 431 // source sets just forward the dependency, otherwise the files in the |
| 432 // also compile the first (what you would expect) even though we'll | 432 // source set can easily get linked more than once which will cause |
| 433 // never do anything with the first one's files. | 433 // multiple definition errors. |
| 434 non_linkable_deps->push_back(dep); | 434 // |
| 435 } else { | 435 // In the future, we may need a way to specify a "complete" static library |
| 436 // Linking in a source set, copy its object files. | 436 // for cases where you want a static library that includes all source sets |
| 437 // (like if you're shipping that to customers to link against). |
| 438 if (target_->output_type() != Target::SOURCE_SET && |
| 439 target_->output_type() != Target::STATIC_LIBRARY) { |
| 440 // Linking in a source set to an executable or shared library, copy its |
| 441 // object files. |
| 437 for (size_t i = 0; i < dep->sources().size(); i++) { | 442 for (size_t i = 0; i < dep->sources().size(); i++) { |
| 438 SourceFileType input_file_type = GetSourceFileType(dep->sources()[i]); | 443 SourceFileType input_file_type = GetSourceFileType(dep->sources()[i]); |
| 439 if (input_file_type != SOURCE_UNKNOWN && | 444 if (input_file_type != SOURCE_UNKNOWN && |
| 440 input_file_type != SOURCE_H) { | 445 input_file_type != SOURCE_H) { |
| 441 // Note we need to specify the target as the source_set target | 446 // Note we need to specify the target as the source_set target |
| 442 // itself, since this is used to prefix the object file name. | 447 // itself, since this is used to prefix the object file name. |
| 443 extra_object_files->insert(helper_.GetOutputFileForSource( | 448 extra_object_files->insert(helper_.GetOutputFileForSource( |
| 444 dep, dep->sources()[i], input_file_type)); | 449 dep, dep->sources()[i], input_file_type)); |
| 445 } | 450 } |
| 446 } | 451 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 466 } | 471 } |
| 467 | 472 |
| 468 // Data files. | 473 // Data files. |
| 469 const std::vector<SourceFile>& data = target_->data(); | 474 const std::vector<SourceFile>& data = target_->data(); |
| 470 for (size_t i = 0; i < data.size(); i++) { | 475 for (size_t i = 0; i < data.size(); i++) { |
| 471 out_ << " "; | 476 out_ << " "; |
| 472 path_output_.WriteFile(out_, data[i]); | 477 path_output_.WriteFile(out_, data[i]); |
| 473 } | 478 } |
| 474 } | 479 } |
| 475 } | 480 } |
| OLD | NEW |