Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <cstring> | 10 #include <cstring> |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 931 // Only the following types of outputs have libraries linked into them: | 931 // Only the following types of outputs have libraries linked into them: |
| 932 // EXECUTABLE | 932 // EXECUTABLE |
| 933 // SHARED_LIBRARY | 933 // SHARED_LIBRARY |
| 934 // _complete_ STATIC_LIBRARY | 934 // _complete_ STATIC_LIBRARY |
| 935 // | 935 // |
| 936 // Child deps of intermediate static libraries get pushed up the | 936 // Child deps of intermediate static libraries get pushed up the |
| 937 // dependency tree until one of these is reached, and source sets | 937 // dependency tree until one of these is reached, and source sets |
| 938 // don't link at all. | 938 // don't link at all. |
| 939 bool can_link_libs = target_->IsFinal(); | 939 bool can_link_libs = target_->IsFinal(); |
| 940 | 940 |
| 941 if (dep->output_type() == Target::SOURCE_SET) { | 941 if (dep->output_type() == Target::SOURCE_SET || |
| 942 // If a complete static library depends on an incomplete static library, | |
| 943 // manually link in the object files of the dependent library as if it | |
| 944 // were a source set. This avoids problems with braindead tools such as | |
| 945 // ar which don't properly link dependent static libraries. | |
| 946 (target_->complete_static_lib() && | |
| 947 dep->output_type() == Target::STATIC_LIBRARY && | |
| 948 !dep->complete_static_lib())) { | |
| 942 // Source sets have their object files linked into final targets | 949 // Source sets have their object files linked into final targets |
| 943 // (shared libraries, executables, loadable modules, and complete static | 950 // (shared libraries, executables, loadable modules, and complete static |
| 944 // libraries). Intermediate static libraries and other source sets | 951 // libraries). Intermediate static libraries and other source sets |
| 945 // just forward the dependency, otherwise the files in the source | 952 // just forward the dependency, otherwise the files in the source |
| 946 // set can easily get linked more than once which will cause | 953 // set can easily get linked more than once which will cause |
| 947 // multiple definition errors. | 954 // multiple definition errors. |
| 948 if (can_link_libs) | 955 if (can_link_libs) |
| 949 AddSourceSetObjectFiles(dep, extra_object_files); | 956 AddSourceSetObjectFiles(dep, extra_object_files); |
| 950 | |
|
brettw
2016/04/21 20:47:00
I liked this blank line here as it was before.
| |
| 951 // Add the source set itself as a non-linkable dependency on the current | 957 // Add the source set itself as a non-linkable dependency on the current |
| 952 // target. This will make sure that anything the source set's stamp file | 958 // target. This will make sure that anything the source set's stamp file |
| 953 // depends on (like data deps) are also built before the current target | 959 // depends on (like data deps) are also built before the current target |
| 954 // can be complete. Otherwise, these will be skipped since this target | 960 // can be complete. Otherwise, these will be skipped since this target |
| 955 // will depend only on the source set's object files. | 961 // will depend only on the source set's object files. |
| 956 non_linkable_deps->push_back(dep); | 962 non_linkable_deps->push_back(dep); |
| 963 } else if (target_->complete_static_lib() && dep->IsFinal()) { | |
| 964 non_linkable_deps->push_back(dep); | |
| 957 } else if (can_link_libs && dep->IsLinkable()) { | 965 } else if (can_link_libs && dep->IsLinkable()) { |
| 958 linkable_deps->push_back(dep); | 966 linkable_deps->push_back(dep); |
| 959 } else { | 967 } else { |
| 960 non_linkable_deps->push_back(dep); | 968 non_linkable_deps->push_back(dep); |
| 961 } | 969 } |
| 962 } | 970 } |
| 963 | 971 |
| 964 void NinjaBinaryTargetWriter::WriteOrderOnlyDependencies( | 972 void NinjaBinaryTargetWriter::WriteOrderOnlyDependencies( |
| 965 const UniqueVector<const Target*>& non_linkable_deps) { | 973 const UniqueVector<const Target*>& non_linkable_deps) { |
| 966 if (!non_linkable_deps.empty()) { | 974 if (!non_linkable_deps.empty()) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1006 "\n" | 1014 "\n" |
| 1007 "In the latter case, either rename one of the files or move one of\n" | 1015 "In the latter case, either rename one of the files or move one of\n" |
| 1008 "the sources to a separate source_set to avoid them both being in\n" | 1016 "the sources to a separate source_set to avoid them both being in\n" |
| 1009 "the same target."); | 1017 "the same target."); |
| 1010 g_scheduler->FailWithError(err); | 1018 g_scheduler->FailWithError(err); |
| 1011 return false; | 1019 return false; |
| 1012 } | 1020 } |
| 1013 } | 1021 } |
| 1014 return true; | 1022 return true; |
| 1015 } | 1023 } |
| OLD | NEW |