| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/substitution_type.h" | 5 #include "tools/gn/substitution_type.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include "tools/gn/err.h" | 9 #include "tools/gn/err.h" |
| 10 | 10 |
| 11 const char* kSubstitutionNames[SUBSTITUTION_NUM_TYPES] = { | 11 const char* kSubstitutionNames[SUBSTITUTION_NUM_TYPES] = { |
| 12 NULL, // SUBSTITUTION_LITERAL | 12 "<<literal>>", // SUBSTITUTION_LITERAL |
| 13 | 13 |
| 14 "{{source}}", // SUBSTITUTION_SOURCE | 14 "{{source}}", // SUBSTITUTION_SOURCE |
| 15 "{{output}}", // SUBSTITUTION_OUTPUT |
| 16 |
| 15 "{{source_name_part}}", // SUBSTITUTION_NAME_PART | 17 "{{source_name_part}}", // SUBSTITUTION_NAME_PART |
| 16 "{{source_file_part}}", // SUBSTITUTION_FILE_PART | 18 "{{source_file_part}}", // SUBSTITUTION_FILE_PART |
| 17 "{{source_dir}}", // SUBSTITUTION_SOURCE_DIR | 19 "{{source_dir}}", // SUBSTITUTION_SOURCE_DIR |
| 18 "{{source_root_relative_dir}}", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR | 20 "{{source_root_relative_dir}}", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR |
| 19 "{{source_gen_dir}}", // SUBSTITUTION_SOURCE_GEN_DIR | 21 "{{source_gen_dir}}", // SUBSTITUTION_SOURCE_GEN_DIR |
| 20 "{{source_out_dir}}", // SUBSTITUTION_SOURCE_OUT_DIR | 22 "{{source_out_dir}}", // SUBSTITUTION_SOURCE_OUT_DIR |
| 21 | 23 |
| 22 "{{output}}", // SUBSTITUTION_OUTPUT | 24 "{{label}}", // SUBSTITUTION_LABEL |
| 23 "{{root_gen_dir}}", // SUBSTITUTION_ROOT_GEN_DIR | 25 "{{root_gen_dir}}", // SUBSTITUTION_ROOT_GEN_DIR |
| 24 "{{root_out_dir}}", // SUBSTITUTION_ROOT_OUT_DIR | 26 "{{root_out_dir}}", // SUBSTITUTION_ROOT_OUT_DIR |
| 25 "{{target_gen_dir}}", // SUBSTITUTION_TARGET_GEN_DIR | 27 "{{target_gen_dir}}", // SUBSTITUTION_TARGET_GEN_DIR |
| 26 "{{target_out_dir}}", // SUBSTITUTION_TARGET_OUT_DIR | 28 "{{target_out_dir}}", // SUBSTITUTION_TARGET_OUT_DIR |
| 27 "{{target_output_name}}", // SUBSTITUTION_TARGET_OUTPUT_NAME | 29 "{{target_output_name}}", // SUBSTITUTION_TARGET_OUTPUT_NAME |
| 28 | 30 |
| 29 "{{cflags}}", // SUBSTITUTION_CFLAGS | 31 "{{cflags}}", // SUBSTITUTION_CFLAGS |
| 30 "{{cflags_c}}", // SUBSTITUTION_CFLAGS_C | 32 "{{cflags_c}}", // SUBSTITUTION_CFLAGS_C |
| 31 "{{cflags_cc}}", // SUBSTITUTION_CFLAGS_CC | 33 "{{cflags_cc}}", // SUBSTITUTION_CFLAGS_CC |
| 32 "{{cflags_objc}}", // SUBSTITUTION_CFLAGS_OBJC | 34 "{{cflags_objc}}", // SUBSTITUTION_CFLAGS_OBJC |
| 33 "{{cflags_objcc}}", // SUBSTITUTION_CFLAGS_OBJCC | 35 "{{cflags_objcc}}", // SUBSTITUTION_CFLAGS_OBJCC |
| 34 "{{defines}}", // SUBSTITUTION_DEFINES | 36 "{{defines}}", // SUBSTITUTION_DEFINES |
| 35 "{{include_dirs}}", // SUBSTITUTION_INCLUDE_DIRS | 37 "{{include_dirs}}", // SUBSTITUTION_INCLUDE_DIRS |
| 36 | 38 |
| 37 "{{inputs}}", // SUBSTITUTION_LINKER_INPUTS | 39 "{{inputs}}", // SUBSTITUTION_LINKER_INPUTS |
| 38 "{{ldflags}}", // SUBSTITUTION_LDFLAGS | 40 "{{ldflags}}", // SUBSTITUTION_LDFLAGS |
| 39 "{{libs}}", // SUBSTITUTION_LIBS | 41 "{{libs}}", // SUBSTITUTION_LIBS |
| 40 "{{output_extension}}", // SUBSTITUTION_OUTPUT_EXTENSION | 42 "{{output_extension}}", // SUBSTITUTION_OUTPUT_EXTENSION |
| 41 "{{solibs}}", // SUBSTITUTION_SOLIBS | 43 "{{solibs}}", // SUBSTITUTION_SOLIBS |
| 42 }; | 44 }; |
| 43 | 45 |
| 44 const char* kSubstitutionNinjaNames[SUBSTITUTION_NUM_TYPES] = { | 46 const char* kSubstitutionNinjaNames[SUBSTITUTION_NUM_TYPES] = { |
| 45 NULL, // SUBSTITUTION_LITERAL | 47 NULL, // SUBSTITUTION_LITERAL |
| 46 | 48 |
| 47 // This isn't written by GN, the name here is referring to the Ninja variable | |
| 48 // since when we would use this would be for writing source rules. | |
| 49 "in", // SUBSTITUTION_SOURCE | 49 "in", // SUBSTITUTION_SOURCE |
| 50 "out", // SUBSTITUTION_OUTPUT |
| 51 |
| 50 "source_name_part", // SUBSTITUTION_NAME_PART | 52 "source_name_part", // SUBSTITUTION_NAME_PART |
| 51 "source_file_part", // SUBSTITUTION_FILE_PART | 53 "source_file_part", // SUBSTITUTION_FILE_PART |
| 52 "source_dir", // SUBSTITUTION_SOURCE_DIR | 54 "source_dir", // SUBSTITUTION_SOURCE_DIR |
| 53 "source_root_relative_dir", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR | 55 "source_root_relative_dir", // SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR |
| 54 "source_gen_dir", // SUBSTITUTION_SOURCE_GEN_DIR | 56 "source_gen_dir", // SUBSTITUTION_SOURCE_GEN_DIR |
| 55 "source_out_dir", // SUBSTITUTION_SOURCE_OUT_DIR | 57 "source_out_dir", // SUBSTITUTION_SOURCE_OUT_DIR |
| 56 | 58 |
| 57 "output", // SUBSTITUTION_OUTPUT | 59 "label", // SUBSTITUTION_LABEL |
| 58 "root_gen_dir", // SUBSTITUTION_ROOT_GEN_DIR | 60 "root_gen_dir", // SUBSTITUTION_ROOT_GEN_DIR |
| 59 "root_out_dir", // SUBSTITUTION_ROOT_OUT_DIR | 61 "root_out_dir", // SUBSTITUTION_ROOT_OUT_DIR |
| 60 "target_gen_dir", // SUBSTITUTION_TARGET_GEN_DIR | 62 "target_gen_dir", // SUBSTITUTION_TARGET_GEN_DIR |
| 61 "target_out_dir", // SUBSTITUTION_TARGET_OUT_DIR | 63 "target_out_dir", // SUBSTITUTION_TARGET_OUT_DIR |
| 62 "target_output_name", // SUBSTITUTION_TARGET_OUTPUT_NAME | 64 "target_output_name", // SUBSTITUTION_TARGET_OUTPUT_NAME |
| 63 | 65 |
| 64 "cflags", // SUBSTITUTION_CFLAGS | 66 "cflags", // SUBSTITUTION_CFLAGS |
| 65 "cflags_c", // SUBSTITUTION_CFLAGS_C | 67 "cflags_c", // SUBSTITUTION_CFLAGS_C |
| 66 "cflags_cc", // SUBSTITUTION_CFLAGS_CC | 68 "cflags_cc", // SUBSTITUTION_CFLAGS_CC |
| 67 "cflags_objc", // SUBSTITUTION_CFLAGS_OBJC | 69 "cflags_objc", // SUBSTITUTION_CFLAGS_OBJC |
| 68 "cflags_objcc", // SUBSTITUTION_CFLAGS_OBJCC | 70 "cflags_objcc", // SUBSTITUTION_CFLAGS_OBJCC |
| 69 "defines", // SUBSTITUTION_DEFINES | 71 "defines", // SUBSTITUTION_DEFINES |
| 70 "include_dirs", // SUBSTITUTION_INCLUDE_DIRS | 72 "include_dirs", // SUBSTITUTION_INCLUDE_DIRS |
| 71 | 73 |
| 72 "inputs", // SUBSTITUTION_LINKER_INPUTS | 74 // LINKER_INPUTS expands to the same Ninja var as SUBSTITUTION_SOURCE. These |
| 75 // are used in different contexts and are named differently to keep things |
| 76 // clear, but they both expand to the "set of input files" for a build rule. |
| 77 "in", // SUBSTITUTION_LINKER_INPUTS |
| 73 "ldflags", // SUBSTITUTION_LDFLAGS | 78 "ldflags", // SUBSTITUTION_LDFLAGS |
| 74 "libs", // SUBSTITUTION_LIBS | 79 "libs", // SUBSTITUTION_LIBS |
| 75 "output_extension", // SUBSTITUTION_OUTPUT_EXTENSION | 80 "output_extension", // SUBSTITUTION_OUTPUT_EXTENSION |
| 76 "solibs", // SUBSTITUTION_SOLIBS | 81 "solibs", // SUBSTITUTION_SOLIBS |
| 77 }; | 82 }; |
| 78 | 83 |
| 84 SubstitutionBits::SubstitutionBits() : used() { |
| 85 } |
| 86 |
| 87 void SubstitutionBits::MergeFrom(const SubstitutionBits& other) { |
| 88 for (size_t i = 0; i < SUBSTITUTION_NUM_TYPES; i++) |
| 89 used[i] |= other.used[i]; |
| 90 } |
| 91 |
| 92 void SubstitutionBits::FillVector(std::vector<SubstitutionType>* vect) const { |
| 93 for (size_t i = SUBSTITUTION_FIRST_PATTERN; i < SUBSTITUTION_NUM_TYPES; i++) { |
| 94 if (used[i]) |
| 95 vect->push_back(static_cast<SubstitutionType>(i)); |
| 96 } |
| 97 } |
| 98 |
| 79 bool SubstitutionIsInOutputDir(SubstitutionType type) { | 99 bool SubstitutionIsInOutputDir(SubstitutionType type) { |
| 80 return type == SUBSTITUTION_SOURCE_GEN_DIR || | 100 return type == SUBSTITUTION_SOURCE_GEN_DIR || |
| 81 type == SUBSTITUTION_SOURCE_OUT_DIR; | 101 type == SUBSTITUTION_SOURCE_OUT_DIR || |
| 102 type == SUBSTITUTION_ROOT_GEN_DIR || |
| 103 type == SUBSTITUTION_ROOT_OUT_DIR || |
| 104 type == SUBSTITUTION_TARGET_GEN_DIR || |
| 105 type == SUBSTITUTION_TARGET_OUT_DIR; |
| 82 } | 106 } |
| 83 | 107 |
| 84 bool IsValidSourceSubstitution(SubstitutionType type) { | 108 bool IsValidSourceSubstitution(SubstitutionType type) { |
| 85 return type == SUBSTITUTION_SOURCE || | 109 return type == SUBSTITUTION_LITERAL || |
| 110 type == SUBSTITUTION_SOURCE || |
| 86 type == SUBSTITUTION_SOURCE_NAME_PART || | 111 type == SUBSTITUTION_SOURCE_NAME_PART || |
| 87 type == SUBSTITUTION_SOURCE_FILE_PART || | 112 type == SUBSTITUTION_SOURCE_FILE_PART || |
| 88 type == SUBSTITUTION_SOURCE_DIR || | 113 type == SUBSTITUTION_SOURCE_DIR || |
| 89 type == SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR || | 114 type == SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR || |
| 90 type == SUBSTITUTION_SOURCE_GEN_DIR || | 115 type == SUBSTITUTION_SOURCE_GEN_DIR || |
| 91 type == SUBSTITUTION_SOURCE_OUT_DIR; | 116 type == SUBSTITUTION_SOURCE_OUT_DIR; |
| 92 } | 117 } |
| 93 | 118 |
| 94 bool IsValidToolSubstutition(SubstitutionType type) { | 119 bool IsValidToolSubstutition(SubstitutionType type) { |
| 95 return type == SUBSTITUTION_OUTPUT || | 120 return type == SUBSTITUTION_LITERAL || |
| 121 type == SUBSTITUTION_OUTPUT || |
| 122 type == SUBSTITUTION_LABEL || |
| 96 type == SUBSTITUTION_ROOT_GEN_DIR || | 123 type == SUBSTITUTION_ROOT_GEN_DIR || |
| 97 type == SUBSTITUTION_ROOT_OUT_DIR || | 124 type == SUBSTITUTION_ROOT_OUT_DIR || |
| 98 type == SUBSTITUTION_TARGET_GEN_DIR || | 125 type == SUBSTITUTION_TARGET_GEN_DIR || |
| 99 type == SUBSTITUTION_TARGET_OUT_DIR || | 126 type == SUBSTITUTION_TARGET_OUT_DIR || |
| 100 type == SUBSTITUTION_TARGET_OUTPUT_NAME; | 127 type == SUBSTITUTION_TARGET_OUTPUT_NAME; |
| 101 } | 128 } |
| 102 | 129 |
| 103 bool IsValidCompilerSubstitution(SubstitutionType type) { | 130 bool IsValidCompilerSubstitution(SubstitutionType type) { |
| 104 return IsValidToolSubstutition(type) || | 131 return IsValidToolSubstutition(type) || |
| 132 IsValidSourceSubstitution(type) || |
| 133 type == SUBSTITUTION_SOURCE || |
| 105 type == SUBSTITUTION_CFLAGS || | 134 type == SUBSTITUTION_CFLAGS || |
| 106 type == SUBSTITUTION_CFLAGS_C || | 135 type == SUBSTITUTION_CFLAGS_C || |
| 107 type == SUBSTITUTION_CFLAGS_CC || | 136 type == SUBSTITUTION_CFLAGS_CC || |
| 108 type == SUBSTITUTION_CFLAGS_OBJC || | 137 type == SUBSTITUTION_CFLAGS_OBJC || |
| 109 type == SUBSTITUTION_CFLAGS_OBJCC || | 138 type == SUBSTITUTION_CFLAGS_OBJCC || |
| 110 type == SUBSTITUTION_DEFINES || | 139 type == SUBSTITUTION_DEFINES || |
| 111 type == SUBSTITUTION_INCLUDE_DIRS; | 140 type == SUBSTITUTION_INCLUDE_DIRS; |
| 112 } | 141 } |
| 113 | 142 |
| 114 bool IsValidCompilerOutputsSubstitution(SubstitutionType type) { | 143 bool IsValidCompilerOutputsSubstitution(SubstitutionType type) { |
| 115 // All tool types except "output" (which would be infinitely recursive). | 144 // All tool types except "output" (which would be infinitely recursive). |
| 116 return IsValidToolSubstutition(type) && | 145 return (IsValidToolSubstutition(type) && type != SUBSTITUTION_OUTPUT) || |
| 117 type != SUBSTITUTION_OUTPUT; | 146 IsValidSourceSubstitution(type); |
| 118 } | 147 } |
| 119 | 148 |
| 120 bool IsValidLinkerSubstitution(SubstitutionType type) { | 149 bool IsValidLinkerSubstitution(SubstitutionType type) { |
| 121 return IsValidToolSubstutition(type) || | 150 return IsValidToolSubstutition(type) || |
| 122 type == SUBSTITUTION_LINKER_INPUTS || | 151 type == SUBSTITUTION_LINKER_INPUTS || |
| 123 type == SUBSTITUTION_LDFLAGS || | 152 type == SUBSTITUTION_LDFLAGS || |
| 124 type == SUBSTITUTION_LIBS || | 153 type == SUBSTITUTION_LIBS || |
| 125 type == SUBSTITUTION_OUTPUT_EXTENSION || | 154 type == SUBSTITUTION_OUTPUT_EXTENSION || |
| 126 type == SUBSTITUTION_SOLIBS; | 155 type == SUBSTITUTION_SOLIBS; |
| 127 } | 156 } |
| 128 | 157 |
| 129 bool IsValidLinkerOutputsSubstitution(SubstitutionType type) { | 158 bool IsValidLinkerOutputsSubstitution(SubstitutionType type) { |
| 130 // All valid compiler outputs plus the output extension. | 159 // All valid compiler outputs plus the output extension. |
| 131 return IsValidCompilerOutputsSubstitution(type) || | 160 return IsValidCompilerOutputsSubstitution(type) || |
| 132 type == SUBSTITUTION_OUTPUT_EXTENSION; | 161 type == SUBSTITUTION_OUTPUT_EXTENSION; |
| 133 } | 162 } |
| 134 | 163 |
| 164 bool IsValidCopySubstitution(SubstitutionType type) { |
| 165 return IsValidToolSubstutition(type) || |
| 166 type == SUBSTITUTION_SOURCE; |
| 167 } |
| 168 |
| 135 bool EnsureValidSourcesSubstitutions( | 169 bool EnsureValidSourcesSubstitutions( |
| 136 const std::vector<SubstitutionType>& types, | 170 const std::vector<SubstitutionType>& types, |
| 137 const ParseNode* origin, | 171 const ParseNode* origin, |
| 138 Err* err) { | 172 Err* err) { |
| 139 for (size_t i = 0; i < types.size(); i++) { | 173 for (size_t i = 0; i < types.size(); i++) { |
| 140 if (!IsValidSourceSubstitution(types[i])) { | 174 if (!IsValidSourceSubstitution(types[i])) { |
| 141 *err = Err(origin, "Invalid substitution type.", | 175 *err = Err(origin, "Invalid substitution type.", |
| 142 "The substitution " + std::string(kSubstitutionNames[i]) + | 176 "The substitution " + std::string(kSubstitutionNames[i]) + |
| 143 " isn't valid for something\n" | 177 " isn't valid for something\n" |
| 144 "operating on a source file such as this."); | 178 "operating on a source file such as this."); |
| 145 return false; | 179 return false; |
| 146 } | 180 } |
| 147 } | 181 } |
| 148 return true; | 182 return true; |
| 149 } | 183 } |
| OLD | NEW |