blob: 723bf8a4469953dd9e234ac892efc6ff5d22b516 [file] [log] [blame]
// Copyright 2014 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 "gn/substitution_type.h"
#include <stddef.h>
#include <stdlib.h>
#include "gn/c_substitution_type.h"
#include "gn/err.h"
#include "gn/rust_substitution_type.h"
const std::vector<SubstitutionTypes*> AllSubstitutions = {
&GeneralSubstitutions, &CSubstitutions, &RustSubstitutions};
const SubstitutionTypes GeneralSubstitutions = {
&SubstitutionLiteral,
&SubstitutionOutput,
&SubstitutionLabel,
&SubstitutionLabelName,
&SubstitutionLabelNoToolchain,
&SubstitutionRootGenDir,
&SubstitutionRootOutDir,
&SubstitutionOutputDir,
&SubstitutionOutputExtension,
&SubstitutionTargetGenDir,
&SubstitutionTargetOutDir,
&SubstitutionTargetOutputName,
&SubstitutionSource,
&SubstitutionSourceNamePart,
&SubstitutionSourceFilePart,
&SubstitutionSourceDir,
&SubstitutionSourceRootRelativeDir,
&SubstitutionSourceGenDir,
&SubstitutionSourceOutDir,
&SubstitutionSourceTargetRelative,
&SubstitutionBundleRootDir,
&SubstitutionBundleContentsDir,
&SubstitutionBundleResourcesDir,
&SubstitutionBundleExecutableDir,
&SubstitutionBundleProductType,
&SubstitutionBundlePartialInfoPlist,
&SubstitutionXcassetsCompilerFlags,
&SubstitutionRspFileName,
};
const Substitution SubstitutionLiteral = {"<<literal>>", nullptr};
const Substitution SubstitutionSource = {"{{source}}", "in"};
const Substitution SubstitutionOutput = {"{{output}}", "out"};
const Substitution SubstitutionSourceNamePart = {"{{source_name_part}}",
"source_name_part"};
const Substitution SubstitutionSourceFilePart = {"{{source_file_part}}",
"source_file_part"};
const Substitution SubstitutionSourceDir = {"{{source_dir}}", "source_dir"};
const Substitution SubstitutionSourceRootRelativeDir = {
"{{source_root_relative_dir}}", "source_root_relative_dir"};
const Substitution SubstitutionSourceGenDir = {"{{source_gen_dir}}",
"source_gen_dir"};
const Substitution SubstitutionSourceOutDir = {"{{source_out_dir}}",
"source_out_dir"};
const Substitution SubstitutionSourceTargetRelative = {
"{{source_target_relative}}", "source_target_relative"};
// Valid for all compiler and linker tools. These depend on the target and
// do not vary on a per-file basis.
const Substitution SubstitutionLabel = {"{{label}}", "label"};
const Substitution SubstitutionLabelName = {"{{label_name}}", "label_name"};
const Substitution SubstitutionLabelNoToolchain = {"{{label_no_toolchain}}",
"label_no_toolchain"};
const Substitution SubstitutionRootGenDir = {"{{root_gen_dir}}",
"root_gen_dir"};
const Substitution SubstitutionRootOutDir = {"{{root_out_dir}}",
"root_out_dir"};
const Substitution SubstitutionOutputDir = {"{{output_dir}}", "output_dir"};
const Substitution SubstitutionOutputExtension = {"{{output_extension}}",
"output_extension"};
const Substitution SubstitutionTargetGenDir = {"{{target_gen_dir}}",
"target_gen_dir"};
const Substitution SubstitutionTargetOutDir = {"{{target_out_dir}}",
"target_out_dir"};
const Substitution SubstitutionTargetOutputName = {"{{target_output_name}}",
"target_output_name"};
// Valid for bundle_data targets.
const Substitution SubstitutionBundleRootDir = {"{{bundle_root_dir}}",
"bundle_root_dir"};
const Substitution SubstitutionBundleContentsDir = {"{{bundle_contents_dir}}",
"bundle_contents_dir"};
const Substitution SubstitutionBundleResourcesDir = {"{{bundle_resources_dir}}",
"bundle_resources_dir"};
const Substitution SubstitutionBundleExecutableDir = {
"{{bundle_executable_dir}}", "bundle_executable_dir"};
// Valid for compile_xcassets tool.
const Substitution SubstitutionBundleProductType = {"{{bundle_product_type}}",
"product_type"};
const Substitution SubstitutionBundlePartialInfoPlist = {
"{{bundle_partial_info_plist}}", "partial_info_plist"};
const Substitution SubstitutionXcassetsCompilerFlags = {
"{{xcasset_compiler_flags}}", "xcasset_compiler_flags"};
// Used only for the args of actions.
const Substitution SubstitutionRspFileName = {"{{response_file_name}}",
"rspfile"};
SubstitutionBits::SubstitutionBits() = default;
void SubstitutionBits::MergeFrom(const SubstitutionBits& other) {
for (const Substitution* s : other.used)
used.insert(s);
}
void SubstitutionBits::FillVector(
std::vector<const Substitution*>* vect) const {
for (const Substitution* s : used) {
vect->push_back(s);
}
}
bool SubstitutionIsInOutputDir(const Substitution* type) {
return type == &SubstitutionSourceGenDir ||
type == &SubstitutionSourceOutDir || type == &SubstitutionRootGenDir ||
type == &SubstitutionRootOutDir || type == &SubstitutionTargetGenDir ||
type == &SubstitutionTargetOutDir;
}
bool SubstitutionIsInBundleDir(const Substitution* type) {
return type == &SubstitutionBundleRootDir ||
type == &SubstitutionBundleContentsDir ||
type == &SubstitutionBundleResourcesDir ||
type == &SubstitutionBundleExecutableDir;
}
bool IsValidBundleDataSubstitution(const Substitution* type) {
return type == &SubstitutionLiteral ||
type == &SubstitutionSourceTargetRelative ||
type == &SubstitutionSourceNamePart ||
type == &SubstitutionSourceFilePart ||
type == &SubstitutionSourceRootRelativeDir ||
type == &SubstitutionBundleRootDir ||
type == &SubstitutionBundleContentsDir ||
type == &SubstitutionBundleResourcesDir ||
type == &SubstitutionBundleExecutableDir;
}
bool IsValidSourceSubstitution(const Substitution* type) {
return type == &SubstitutionLiteral || type == &SubstitutionSource ||
type == &SubstitutionSourceNamePart ||
type == &SubstitutionSourceFilePart ||
type == &SubstitutionSourceDir ||
type == &SubstitutionSourceRootRelativeDir ||
type == &SubstitutionSourceGenDir ||
type == &SubstitutionSourceOutDir ||
type == &SubstitutionSourceTargetRelative;
}
bool IsValidScriptArgsSubstitution(const Substitution* type) {
return IsValidSourceSubstitution(type) || type == &SubstitutionRspFileName ||
IsValidCompilerScriptArgsSubstitution(type) ||
IsValidRustScriptArgsSubstitution(type);
}
bool IsValidToolSubstitution(const Substitution* type) {
return type == &SubstitutionLiteral || type == &SubstitutionOutput ||
type == &SubstitutionLabel || type == &SubstitutionLabelName ||
type == &SubstitutionLabelNoToolchain ||
type == &SubstitutionRootGenDir || type == &SubstitutionRootOutDir ||
type == &SubstitutionTargetGenDir ||
type == &SubstitutionTargetOutDir ||
type == &SubstitutionTargetOutputName;
}
bool IsValidCopySubstitution(const Substitution* type) {
return IsValidToolSubstitution(type) || type == &SubstitutionSource;
}
bool IsValidCompileXCassetsSubstitution(const Substitution* type) {
return IsValidToolSubstitution(type) || type == &CSubstitutionLinkerInputs ||
type == &SubstitutionBundleProductType ||
type == &SubstitutionBundlePartialInfoPlist ||
type == &SubstitutionXcassetsCompilerFlags;
}
bool EnsureValidSubstitutions(const std::vector<const Substitution*>& types,
bool (*is_valid_subst)(const Substitution*),
const ParseNode* origin,
Err* err) {
for (const Substitution* type : types) {
if (!is_valid_subst(type)) {
*err = Err(origin, "Invalid substitution type.",
"The substitution " + std::string(type->name) +
" isn't valid for something\n"
"operating on a source file such as this.");
return false;
}
}
return true;
}