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 #ifndef TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_ 6 #define TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_ 7 8 #include "base/compiler_specific.h" 9 #include "tools/gn/ninja_target_writer.h" 10 #include "tools/gn/toolchain.h" 11 12 // Writes a .ninja file for a binary target type (an executable, a shared 13 // library, or a static library). 14 class NinjaBinaryTargetWriter : public NinjaTargetWriter { 15 public: 16 NinjaBinaryTargetWriter(const Target* target, 17 const Toolchain* toolchain, 18 std::ostream& out); 19 virtual ~NinjaBinaryTargetWriter(); 20 21 virtual void Run() OVERRIDE; 22 23 private: 24 typedef std::set<OutputFile> OutputFileSet; 25 26 void WriteCompilerVars(); 27 void WriteSources(std::vector<OutputFile>* object_files); 28 void WriteLinkerStuff(const std::vector<OutputFile>& object_files); 29 void WriteLinkerFlags(const Toolchain::Tool& tool, 30 const OutputFile& windows_manifest); 31 void WriteLibs(const Toolchain::Tool& tool); 32 33 // Writes the build line for linking the target. Includes newline. 34 void WriteLinkCommand(const OutputFile& external_output_file, 35 const OutputFile& internal_output_file, 36 const std::vector<OutputFile>& object_files); 37 38 // Writes the stamp line for a source set. These are not linked. 39 void WriteSourceSetStamp(const std::vector<OutputFile>& object_files); 40 41 // Gets all target dependencies and classifies them, as well as accumulates 42 // object files from source sets we need to link. 43 void GetDeps(std::set<OutputFile>* extra_object_files, 44 std::vector<const Target*>* linkable_deps, 45 std::vector<const Target*>* non_linkable_deps) const; 46 47 // Classifies the dependency as linkable or nonlinkable with the current 48 // target, adding it to the appropriate vector. If the dependency is a source 49 // set we should link in, the source set's object files will be appended to 50 // |extra_object_files|. 51 void ClassifyDependency(const Target* dep, 52 std::set<OutputFile>* extra_object_files, 53 std::vector<const Target*>* linkable_deps, 54 std::vector<const Target*>* non_linkable_deps) const; 55 56 // Writes the implicit dependencies for the link or stamp line. This is 57 // the "||" and everything following it on the ninja line. 58 // 59 // The implicit dependencies are the non-linkable deps passed in as an 60 // argument, plus the data file depdencies in the target. 61 void WriteImplicitDependencies( 62 const std::vector<const Target*>& non_linkable_deps); 63 64 Toolchain::ToolType tool_type_; 65 66 DISALLOW_COPY_AND_ASSIGN(NinjaBinaryTargetWriter); 67 }; 68 69 #endif // TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_ 70 71