Home | History | Annotate | Download | only in gn
      1 // Copyright 2014 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_SUBSTITUTION_TYPE_H_
      6 #define TOOLS_GN_SUBSTITUTION_TYPE_H_
      7 
      8 #include <vector>
      9 
     10 class Err;
     11 class ParseNode;
     12 
     13 // Keep kSubstitutionNames, kSubstitutionNinjaNames and the
     14 // IsValid*Substutition functions in sync if you change anything here.
     15 enum SubstitutionType {
     16   SUBSTITUTION_LITERAL = 0,
     17 
     18   // The index of the first pattern. To loop overal all patterns, go from here
     19   // until NUM_TYPES.
     20   SUBSTITUTION_FIRST_PATTERN,
     21 
     22   // These map to Ninja's {in} and {out} variables.
     23   SUBSTITUTION_SOURCE = SUBSTITUTION_FIRST_PATTERN,  // {{source}}
     24   SUBSTITUTION_OUTPUT,  // {{output}}
     25 
     26   // Valid for all compiler tools.
     27   SUBSTITUTION_SOURCE_NAME_PART,  // {{source_name_part}}
     28   SUBSTITUTION_SOURCE_FILE_PART,  // {{source_file_part}}
     29   SUBSTITUTION_SOURCE_DIR,  // {{source_dir}}
     30   SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR,  // {{root_relative_dir}}
     31   SUBSTITUTION_SOURCE_GEN_DIR,  // {{source_gen_dir}}
     32   SUBSTITUTION_SOURCE_OUT_DIR,  // {{source_out_dir}}
     33 
     34   // Valid for all compiler and linker tools. These depend on the target and
     35   // no not vary on a per-file basis.
     36   SUBSTITUTION_LABEL,  // {{label}}
     37   SUBSTITUTION_ROOT_GEN_DIR,  // {{root_gen_dir}}
     38   SUBSTITUTION_ROOT_OUT_DIR,  // {{root_out_dir}}
     39   SUBSTITUTION_TARGET_GEN_DIR,  // {{target_gen_dir}}
     40   SUBSTITUTION_TARGET_OUT_DIR,  // {{target_out_dir}}
     41   SUBSTITUTION_TARGET_OUTPUT_NAME,  // {{target_output_name}}
     42 
     43   // Valid for compiler tools.
     44   SUBSTITUTION_CFLAGS,  // {{cflags}}
     45   SUBSTITUTION_CFLAGS_C,  // {{cflags_c}}
     46   SUBSTITUTION_CFLAGS_CC,  // {{cflags_cc}}
     47   SUBSTITUTION_CFLAGS_OBJC,  // {{cflags_objc}}
     48   SUBSTITUTION_CFLAGS_OBJCC,  // {{cflags_objcc}}
     49   SUBSTITUTION_DEFINES,  // {{defines}}
     50   SUBSTITUTION_INCLUDE_DIRS,  // {{include_dirs}}
     51 
     52   // Valid for linker tools.
     53   SUBSTITUTION_LINKER_INPUTS,  // {{inputs}}
     54   SUBSTITUTION_LINKER_INPUTS_NEWLINE,  // {{inputs_newline}}
     55   SUBSTITUTION_LDFLAGS,  // {{ldflags}}
     56   SUBSTITUTION_LIBS,  // {{libs}}
     57   SUBSTITUTION_OUTPUT_EXTENSION,  // {{output_extension}}
     58   SUBSTITUTION_SOLIBS,  // {{solibs}}
     59 
     60   SUBSTITUTION_NUM_TYPES  // Must be last.
     61 };
     62 
     63 // An array of size SUBSTITUTION_NUM_TYPES that lists the names of the
     64 // substitution patterns, including the curly braces. So, for example,
     65 // kSubstitutionNames[SUBSTITUTION_SOURCE] == "{{source}}".
     66 extern const char* kSubstitutionNames[SUBSTITUTION_NUM_TYPES];
     67 
     68 // Ninja variables corresponding to each substitution. These do not include
     69 // the dollar sign.
     70 extern const char* kSubstitutionNinjaNames[SUBSTITUTION_NUM_TYPES];
     71 
     72 // A wrapper around an array if flags indicating whether a give substitution
     73 // type is required in some context. By convention, the LITERAL type bit is
     74 // not set.
     75 struct SubstitutionBits {
     76   SubstitutionBits();
     77 
     78   // Merges any bits set in the given "other" to this one. This object will
     79   // then be the union of all bits in the two lists.
     80   void MergeFrom(const SubstitutionBits& other);
     81 
     82   // Converts the substitution type bitfield (with a true set for each required
     83   // item) to a vector of the types listed. Does not include LITERAL.
     84   void FillVector(std::vector<SubstitutionType>* vect) const;
     85 
     86   bool used[SUBSTITUTION_NUM_TYPES];
     87 };
     88 
     89 // Returns true if the given substitution pattern references the output
     90 // directory. This is used to check strings that begin with a substitution to
     91 // verify that the produce a file in the output directory.
     92 bool SubstitutionIsInOutputDir(SubstitutionType type);
     93 
     94 // Returns true if the given substitution is valid for the named purpose.
     95 bool IsValidSourceSubstitution(SubstitutionType type);
     96 // Both compiler and linker tools.
     97 bool IsValidToolSubstutition(SubstitutionType type);
     98 bool IsValidCompilerSubstitution(SubstitutionType type);
     99 bool IsValidCompilerOutputsSubstitution(SubstitutionType type);
    100 bool IsValidLinkerSubstitution(SubstitutionType type);
    101 bool IsValidLinkerOutputsSubstitution(SubstitutionType type);
    102 bool IsValidCopySubstitution(SubstitutionType type);
    103 
    104 // Like the "IsValid..." version above but checks a list of types and sets a
    105 // an error blaming the given source if the test fails.
    106 bool EnsureValidSourcesSubstitutions(
    107     const std::vector<SubstitutionType>& types,
    108     const ParseNode* origin,
    109     Err* err);
    110 
    111 #endif  // TOOLS_GN_SUBSTITUTION_TYPE_H_
    112