| Index: trunk/src/tools/gn/ninja_build_writer.cc
|
| ===================================================================
|
| --- trunk/src/tools/gn/ninja_build_writer.cc (revision 214322)
|
| +++ trunk/src/tools/gn/ninja_build_writer.cc (working copy)
|
| @@ -1,165 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "tools/gn/ninja_build_writer.h"
|
| -
|
| -#include <fstream>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/file_util.h"
|
| -#include "base/process/process_handle.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "build/build_config.h"
|
| -#include "tools/gn/build_settings.h"
|
| -#include "tools/gn/filesystem_utils.h"
|
| -#include "tools/gn/input_file_manager.h"
|
| -#include "tools/gn/scheduler.h"
|
| -#include "tools/gn/target.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include <windows.h>
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -std::string GetSelfInvocationCommand(const BuildSettings* build_settings) {
|
| -#if defined(OS_WIN)
|
| - wchar_t module[MAX_PATH];
|
| - GetModuleFileName(NULL, module, MAX_PATH);
|
| - //result = "\"" + WideToUTF8(module) + "\"";
|
| - base::FilePath executable(module);
|
| -#elif defined(OS_MACOSX)
|
| - // FIXME(brettw) write this on Mac!
|
| - base::FilePath executable("gn");
|
| -#else
|
| - base::FilePath executable =
|
| - base::GetProcessExecutablePath(base::GetCurrentProcessHandle());
|
| -#endif
|
| -
|
| -/*
|
| - // Append the root path.
|
| - CommandLine* cmdline = CommandLine::ForCurrentProcess();
|
| - result += " --root=\"" + FilePathToUTF8(settings->root_path()) + "\"";
|
| -*/
|
| -
|
| - CommandLine cmdline(executable);
|
| - cmdline.AppendSwitchPath("--root", build_settings->root_path());
|
| -
|
| - // TODO(brettw) append other parameters.
|
| -
|
| -#if defined(OS_WIN)
|
| - return WideToUTF8(cmdline.GetCommandLineString());
|
| -#else
|
| - return cmdline.GetCommandLineString();
|
| -#endif
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -NinjaBuildWriter::NinjaBuildWriter(
|
| - const BuildSettings* build_settings,
|
| - const std::vector<const Settings*>& all_settings,
|
| - const std::vector<const Target*>& default_toolchain_targets,
|
| - std::ostream& out)
|
| - : build_settings_(build_settings),
|
| - all_settings_(all_settings),
|
| - default_toolchain_targets_(default_toolchain_targets),
|
| - out_(out),
|
| - path_output_(build_settings->build_dir(), ESCAPE_NINJA, true),
|
| - helper_(build_settings) {
|
| -}
|
| -
|
| -NinjaBuildWriter::~NinjaBuildWriter() {
|
| -}
|
| -
|
| -void NinjaBuildWriter::Run() {
|
| - WriteNinjaRules();
|
| - WriteSubninjas();
|
| - WritePhonyAndAllRules();
|
| -}
|
| -
|
| -// static
|
| -bool NinjaBuildWriter::RunAndWriteFile(
|
| - const BuildSettings* build_settings,
|
| - const std::vector<const Settings*>& all_settings,
|
| - const std::vector<const Target*>& default_toolchain_targets) {
|
| - base::FilePath ninja_file(build_settings->GetFullPath(
|
| - SourceFile(build_settings->build_dir().value() + "build.ninja")));
|
| - file_util::CreateDirectory(ninja_file.DirName());
|
| -
|
| - std::ofstream file;
|
| - file.open(FilePathToUTF8(ninja_file).c_str(),
|
| - std::ios_base::out | std::ios_base::binary);
|
| - if (file.fail())
|
| - return false;
|
| -
|
| - NinjaBuildWriter gen(build_settings, all_settings,
|
| - default_toolchain_targets, file);
|
| - gen.Run();
|
| - return true;
|
| -}
|
| -
|
| -void NinjaBuildWriter::WriteNinjaRules() {
|
| - out_ << "rule gn\n";
|
| - out_ << " command = " << GetSelfInvocationCommand(build_settings_) << "\n";
|
| - out_ << " description = GN the world\n\n";
|
| -
|
| - out_ << "build build.ninja: gn";
|
| -
|
| - // Input build files.
|
| - std::vector<SourceFile> input_files;
|
| - g_scheduler->input_file_manager()->GetAllInputFileNames(&input_files);
|
| - for (size_t i = 0; i < input_files.size(); i++) {
|
| - out_ << " ";
|
| - path_output_.WriteFile(out_, input_files[i]);
|
| - }
|
| -
|
| - // Other files read by the build.
|
| - std::vector<SourceFile> other_files = g_scheduler->GetGenDependencies();
|
| - for (size_t i = 0; i < other_files.size(); i++) {
|
| - out_ << " ";
|
| - path_output_.WriteFile(out_, other_files[i]);
|
| - }
|
| -
|
| - out_ << 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]));
|
| - out_ << std::endl;
|
| - }
|
| - out_ << std::endl;
|
| -}
|
| -
|
| -void NinjaBuildWriter::WritePhonyAndAllRules() {
|
| - std::string all_rules;
|
| -
|
| - // Write phony rules for the default toolchain (don't do other toolchains or
|
| - // we'll get naming conflicts).
|
| - for (size_t i = 0; i < default_toolchain_targets_.size(); i++) {
|
| - const Target* target = default_toolchain_targets_[i];
|
| - if (target->output_type() == Target::NONE)
|
| - continue; // Nothing to generate.
|
| -
|
| - OutputFile target_file = helper_.GetTargetOutputFile(target);
|
| - if (target_file.value() != target->label().name()) {
|
| - out_ << "build " << target->label().name() << ": phony ";
|
| - path_output_.WriteFile(out_, target_file);
|
| - out_ << std::endl;
|
| - }
|
| -
|
| - if (!all_rules.empty())
|
| - all_rules.append(" $\n ");
|
| - all_rules.append(target_file.value());
|
| - }
|
| -
|
| - if (!all_rules.empty()) {
|
| - out_ << "\nbuild all: phony " << all_rules << std::endl;
|
| - out_ << "default all" << std::endl;
|
| - }
|
| -}
|
| -
|
|
|