// Copyright 2016 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/bundle_file_rule.h" #include "tools/gn/output_file.h" #include "tools/gn/settings.h" #include "tools/gn/substitution_pattern.h" #include "tools/gn/substitution_writer.h" #include "tools/gn/target.h" BundleFileRule::BundleFileRule(const Target* bundle_data_target, const std::vector sources, const SubstitutionPattern& pattern) : target_(bundle_data_target), sources_(sources), pattern_(pattern) { // target_ may be null during testing. DCHECK(!target_ || target_->output_type() == Target::BUNDLE_DATA); } BundleFileRule::BundleFileRule(const BundleFileRule& other) = default; BundleFileRule::~BundleFileRule() {} SourceFile BundleFileRule::ApplyPatternToSource( const Settings* settings, const BundleData& bundle_data, const SourceFile& source_file) const { std::string output_path; for (const auto& subrange : pattern_.ranges()) { switch (subrange.type) { case SUBSTITUTION_LITERAL: output_path.append(subrange.literal); break; case SUBSTITUTION_BUNDLE_ROOT_DIR: output_path.append(bundle_data.root_dir().value()); break; case SUBSTITUTION_BUNDLE_CONTENTS_DIR: output_path.append(bundle_data.contents_dir().value()); break; case SUBSTITUTION_BUNDLE_RESOURCES_DIR: output_path.append(bundle_data.resources_dir().value()); break; case SUBSTITUTION_BUNDLE_EXECUTABLE_DIR: output_path.append(bundle_data.executable_dir().value()); break; case SUBSTITUTION_BUNDLE_PLUGINS_DIR: output_path.append(bundle_data.plugins_dir().value()); break; default: output_path.append(SubstitutionWriter::GetSourceSubstitution( target_, target_->settings(), source_file, subrange.type, SubstitutionWriter::OUTPUT_ABSOLUTE, SourceDir())); break; } } return SourceFile(SourceFile::SWAP_IN, &output_path); } OutputFile BundleFileRule::ApplyPatternToSourceAsOutputFile( const Settings* settings, const BundleData& bundle_data, const SourceFile& source_file) const { return OutputFile(settings->build_settings(), ApplyPatternToSource(settings, bundle_data, source_file)); }