#include <map>
#include "base/command_line.h"
-#include "base/file_util.h"
+#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/process/process_handle.h"
#include "base/strings/string_util.h"
#include "tools/gn/escape.h"
#include "tools/gn/filesystem_utils.h"
#include "tools/gn/input_file_manager.h"
+#include "tools/gn/ninja_utils.h"
#include "tools/gn/scheduler.h"
#include "tools/gn/target.h"
#include "tools/gn/trace.h"
cmdline.AppendSwitch("-q"); // Don't write output.
EscapeOptions escape_shell;
- escape_shell.mode = ESCAPE_SHELL;
+ escape_shell.mode = ESCAPE_NINJA_COMMAND;
#if defined(OS_WIN)
// The command line code quoting varies by platform. We have one string,
// possibly with spaces, that we want to quote. The Windows command line
NinjaBuildWriter::NinjaBuildWriter(
const BuildSettings* build_settings,
const std::vector<const Settings*>& all_settings,
+ const Toolchain* default_toolchain,
const std::vector<const Target*>& default_toolchain_targets,
std::ostream& out,
std::ostream& dep_out)
: build_settings_(build_settings),
all_settings_(all_settings),
+ default_toolchain_(default_toolchain),
default_toolchain_targets_(default_toolchain_targets),
out_(out),
dep_out_(dep_out),
- path_output_(build_settings->build_dir(), ESCAPE_NINJA, false),
- helper_(build_settings) {
+ path_output_(build_settings->build_dir(), ESCAPE_NINJA) {
}
NinjaBuildWriter::~NinjaBuildWriter() {
void NinjaBuildWriter::Run() {
WriteNinjaRules();
+ WriteLinkPool();
WriteSubninjas();
WritePhonyAndAllRules();
}
bool NinjaBuildWriter::RunAndWriteFile(
const BuildSettings* build_settings,
const std::vector<const Settings*>& all_settings,
+ const Toolchain* default_toolchain,
const std::vector<const Target*>& default_toolchain_targets) {
ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, "build.ninja");
if (depfile.fail())
return false;
- NinjaBuildWriter gen(build_settings, all_settings,
+ NinjaBuildWriter gen(build_settings, all_settings, default_toolchain,
default_toolchain_targets, file, depfile);
gen.Run();
return true;
out_ << std::endl;
}
+void NinjaBuildWriter::WriteLinkPool() {
+ out_ << "pool link_pool\n"
+ << " depth = " << default_toolchain_->concurrent_links() << std::endl
+ << std::endl;
+}
+
void NinjaBuildWriter::WriteSubninjas() {
for (size_t i = 0; i < all_settings_.size(); i++) {
out_ << "subninja ";
- path_output_.WriteFile(out_,
- helper_.GetNinjaFileForToolchain(all_settings_[i]));
+ path_output_.WriteFile(out_, GetNinjaFileForToolchain(all_settings_[i]));
out_ << std::endl;
}
out_ << std::endl;
for (size_t i = 0; i < default_toolchain_targets_.size(); i++) {
const Target* target = default_toolchain_targets_[i];
const Label& label = target->label();
- OutputFile target_file = helper_.GetTargetOutputFile(target);
+ OutputFile target_file(target->dependency_output_file());
+ // The output files may have leading "./" so normalize those away.
+ NormalizePath(&target_file.value());
// Write the long name "foo/bar:baz" for the target "//foo/bar:baz".
std::string long_name = label.GetUserVisibleName(false);
for (size_t i = 0; i < toplevel_targets.size(); i++) {
if (small_name_count[toplevel_targets[i]->label().name()] > 1) {
const Target* target = toplevel_targets[i];
- WritePhonyRule(target, helper_.GetTargetOutputFile(target),
+ WritePhonyRule(target, target->dependency_output_file(),
target->label().name());
}
}