1 // Copyright (c) 2013 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 #include "tools/gn/variables.h" 6 7 namespace variables { 8 9 // Built-in variables ---------------------------------------------------------- 10 11 extern const char kCurrentToolchain[] = "current_toolchain"; 12 extern const char kCurrentToolchain_HelpShort[] = 13 "current_toolchain: [string] Label of the current toolchain."; 14 extern const char kCurrentToolchain_Help[] = 15 "current_toolchain: Label of the current toolchain.\n" 16 "\n" 17 " A fully-qualified label representing the current toolchain. You can\n" 18 " use this to make toolchain-related decisions in the build. See also\n" 19 " \"default_toolchain\".\n" 20 "\n" 21 "Example:\n" 22 "\n" 23 " if (current_toolchain == \"//build:64_bit_toolchain\") {\n" 24 " executable(\"output_thats_64_bit_only\") {\n" 25 " ...\n"; 26 27 extern const char kDefaultToolchain[] = "default_toolchain"; 28 extern const char kDefaultToolchain_HelpShort[] = 29 "default_toolchain: [string] Label of the default toolchain."; 30 extern const char kDefaultToolchain_Help[] = 31 "default_toolchain: [string] Label of the default toolchain.\n" 32 "\n" 33 " A fully-qualified label representing the default toolchain, which may\n" 34 " not necessarily be the current one (see \"current_toolchain\").\n"; 35 36 extern const char kPythonPath[] = "python_path"; 37 extern const char kPythonPath_HelpShort[] = 38 "python_path: [string] Absolute path of Python."; 39 extern const char kPythonPath_Help[] = 40 "python_path: Absolute path of Python.\n" 41 "\n" 42 " Normally used in toolchain definitions if running some command\n" 43 " requires Python. You will normally not need this when invoking scripts\n" 44 " since GN automatically finds it for you.\n"; 45 46 extern const char kRelativeRootGenDir[] = "relative_root_gen_dir"; 47 extern const char kRelativeRootGenDir_HelpShort[] = 48 "relative_root_gen_dir: [string] Relative root dir for generated files."; 49 extern const char kRelativeRootGenDir_Help[] = 50 "relative_root_gen_dir: Relative root for generated files.\n" 51 "\n" 52 " Relative path from the directory of the current build file to the\n" 53 " root of the generated file directory hierarchy for the current\n" 54 " toolchain.\n" 55 "\n" 56 " Generally scripts should use \"relative_target_output_dir\" instead.\n" 57 "\n" 58 "Example:\n" 59 "\n" 60 " If your current build file is in \"//tools\", you might write\n" 61 " args = [ \"$relative_root_gen_dir/output.txt\" ]\n"; 62 63 extern const char kRelativeRootOutputDir[] = "relative_root_output_dir"; 64 extern const char kRelativeRootOutputDir_HelpShort[] = 65 "relative_root_output_dir: [string] Relative dir for output files."; 66 extern const char kRelativeRootOutputDir_Help[] = 67 "relative_root_output_dir: Relative dir for output files.\n" 68 "\n" 69 " Relative path from the directory of the current build file to the\n" 70 " current toolchain's root build output directory.\n" 71 "\n" 72 " Generally scripts should use \"relative_target_output_dir\" instead.\n"; 73 74 extern const char kRelativeTargetGenDir[] = "relative_target_gen_dir"; 75 extern const char kRelativeTargetGenDir_HelpShort[] = 76 "relative_target_gen_dir: [string] Relative dir for generated files."; 77 extern const char kRelativeTargetGenDir_Help[] = 78 "relative_target_gen_dir: Relative dir for generated files.\n" 79 "\n" 80 " Relative path from the directory of the current build file to the\n" 81 " current target's generated file directory.\n" 82 "\n" 83 " Normally used when invoking scripts (the current directory of which is\n" 84 " that of the invoking buildfile) that need to write files.\n" 85 "\n" 86 " Scripts generating final rather than intermetiate files should use the\n" 87 " \"relative_target_output_dir\" instead.\n" 88 "\n" 89 "Example:\n" 90 "\n" 91 " If your current build file is in \"//tools\", you might write\n" 92 " args = [ \"$relative_root_gen_dir/output.txt\" ]\n"; 93 94 extern const char kRelativeTargetOutputDir[] = "relative_target_output_dir"; 95 extern const char kRelativeTargetOutputDir_HelpShort[] = 96 "relative_target_output_dir: [string] Relative dir for build results."; 97 extern const char kRelativeTargetOutputDir_Help[] = 98 "relative_target_output_dir: Relative dir for build results." 99 "\n" 100 " Relative path from the directory of the current build file to the\n" 101 " current target's generated file directory.\n" 102 "\n" 103 " Normally used when invoking scripts (the current directory of which is\n" 104 " that of the invoking buildfile) that need to write files.\n" 105 "\n" 106 " Scripts generating intermediate files rather than final output files\n" 107 " should use the \"relative_target_output_dir\" instead.\n" 108 "\n" 109 "Example:\n" 110 "\n" 111 " If your current build file is in \"//tools\", you might write\n" 112 " args = [ \"$relative_target_output_dir/final.lib\" ]\n"; 113 114 // Target variables ------------------------------------------------------------ 115 116 const char kAllDependentConfigs[] = "all_dependent_configs"; 117 const char kAllDependentConfigs_HelpShort[] = 118 "all_dependent_configs: [label list] Configs to be forced on dependents."; 119 const char kAllDependentConfigs_Help[] = 120 "all_dependent_configs: Configs to be forced on dependents.\n" 121 "\n" 122 " A list of config labels.\n" 123 "\n" 124 " All targets depending on this one, and recursively, all targets\n" 125 " depending on those, will have the configs listed in this variable\n" 126 " added to them.\n" 127 "\n" 128 " This addition happens in a second phase once a target and all of its\n" 129 " dependencies have been resolved. Therefore, a target will not see\n" 130 " these force-added configs in their \"configs\" variable while the\n" 131 " script is running, and then can not be removed. As a result, this\n" 132 " capability should generally only be used to add defines and include\n" 133 " directories necessary to compile a target's headers.\n" 134 "\n" 135 " See also \"direct_dependent_configs\".\n"; 136 137 const char kCflags[] = "cflags"; 138 const char kCflags_HelpShort[] = 139 "cflags: [string list] Flags passed to all C compiler variants."; 140 // Avoid writing long help for each variant. 141 const char kCommonCflagsHelp[] = 142 "cflags*: Flags passed to the C compiler.\n" 143 "\n" 144 " A list of strings.\n" 145 "\n" 146 " \"cflags\" are passed to all invocations of the C, C++, Objective C,\n" 147 " and Objective C++ compilers.\n" 148 "\n" 149 " To target one of these variants individually, use \"cflags_c\",\n" 150 " \"cflags_cc\", \"cflags_objc\", and \"cflags_objcc\", respectively.\n" 151 " These variant-specific versions will be appended to the \"cflags\".\n"; 152 const char* kCflags_Help = kCommonCflagsHelp; 153 154 const char kCflagsC[] = "cflags_c"; 155 const char kCflagsC_HelpShort[] = 156 "cflags_c: [string list] Flags passed to the C compiler."; 157 const char* kCflagsC_Help = kCommonCflagsHelp; 158 159 const char kCflagsCC[] = "cflags_cc"; 160 const char kCflagsCC_HelpShort[] = 161 "cflags_cc: [string list] Flags passed to the C++ compiler."; 162 const char* kCflagsCC_Help = kCommonCflagsHelp; 163 164 const char kCflagsObjC[] = "cflags_objc"; 165 const char kCflagsObjC_HelpShort[] = 166 "cflags_objc: [string list] Flags passed to the Objective C compiler."; 167 const char* kCflagsObjC_Help = kCommonCflagsHelp; 168 169 const char kCflagsObjCC[] = "cflags_objcc"; 170 const char kCflagsObjCC_HelpShort[] = 171 "cflags_objcc: [string list] Flags passed to the Objective C++ compiler."; 172 const char* kCflagsObjCC_Help = kCommonCflagsHelp; 173 174 const char kConfigs[] = "configs"; 175 const char kConfigs_HelpShort[] = 176 "configs: [label list] Configs applying to this target."; 177 const char kConfigs_Help[] = 178 "configs: Configs applying to this target.\n" 179 "\n" 180 " A list of config labels.\n" 181 "\n" 182 " The includes, defines, etc. in each config are appended in the order\n" 183 " they appear to the compile command for each file in the target. They\n" 184 " will appear after the includes, defines, etc. that the target sets\n" 185 " directly.\n" 186 "\n" 187 " The build configuration script will generally set up the default\n" 188 " configs applying to a given target type (see \"set_defaults\").\n" 189 " When a target is being defined, it can add to or remove from this\n" 190 " list.\n" 191 "\n" 192 "Example:\n" 193 " static_library(\"foo\") {\n" 194 " configs -= \"//build:no_rtti\" # Don't use the default RTTI config.\n" 195 " configs += \":mysettings\" # Add some of our own settings.\n" 196 " }\n"; 197 198 const char kDatadeps[] = "datadeps"; 199 const char kDatadeps_HelpShort[] = 200 "datadeps: [label list] Non-linked dependencies."; 201 const char kDatadeps_Help[] = 202 "datadeps: Non-linked dependencies.\n" 203 "\n" 204 " A list of target labels.\n" 205 "\n" 206 " Specifies dependencies of a target that are not actually linked into\n" 207 " the current target. Such dependencies will built and will be available\n" 208 " at runtime.\n" 209 "\n" 210 " This is normally used for things like plugins or helper programs that\n" 211 " a target needs at runtime.\n" 212 "\n" 213 " See also \"deps\".\n"; 214 215 const char kDefines[] = "defines"; 216 const char kDefines_HelpShort[] = 217 "defines: [string list] C preprocessor defines."; 218 const char kDefines_Help[] = 219 "defines: C preprocessor defines.\n" 220 "\n" 221 " A list of strings\n" 222 "\n" 223 " These strings will be passed to the C/C++ compiler as #defines. The\n" 224 " strings may or may not include an \"=\" to assign a value.\n" 225 "\n" 226 "Example:\n" 227 " defines = [ \"AWESOME_FEATURE\", \"LOG_LEVEL=3\" ]\n"; 228 229 const char kDeps[] = "deps"; 230 const char kDeps_HelpShort[] = 231 "deps: [label list] Linked dependencies."; 232 const char kDeps_Help[] = 233 "deps: Linked dependencies.\n" 234 "\n" 235 " A list of target labels.\n" 236 "\n" 237 " Specifies dependencies of a target. Shared and dynamic libraries will\n" 238 " be linked into the current target. Other target types that can't be\n" 239 " linked (like custom scripts and groups) listed in \"deps\" will be\n" 240 " treated as \"datadeps\". Likewise, if the current target isn't\n" 241 " linkable, then all deps will be treated as \"datadeps\".\n" 242 "\n" 243 " See also \"datadeps\".\n"; 244 245 const char kDirectDependentConfigs[] = "direct_dependent_configs"; 246 const char kDirectDependentConfigs_HelpShort[] = 247 "direct_dependent_configs: [label list] Configs to be forced on " 248 "dependents."; 249 const char kDirectDependentConfigs_Help[] = 250 "direct_dependent_configs: Configs to be forced on dependents.\n" 251 "\n" 252 " A list of config labels.\n" 253 "\n" 254 " Targets directly referencing this one will have the configs listed in\n" 255 " this variable added to them.\n" 256 "\n" 257 " This addition happens in a second phase once a target and all of its\n" 258 " dependencies have been resolved. Therefore, a target will not see\n" 259 " these force-added configs in their \"configs\" variable while the\n" 260 " script is running, and then can not be removed. As a result, this\n" 261 " capability should generally only be used to add defines and include\n" 262 " directories necessary to compile a target's headers.\n" 263 "\n" 264 " See also \"all_dependent_configs\".\n"; 265 266 const char kLdflags[] = "ldflags"; 267 const char kLdflags_HelpShort[] = 268 "ldflags: [string list] Flags passed to the linker."; 269 const char kLdflags_Help[] = 270 "ldflags: Flags passed to the linker.\n" 271 "\n" 272 " A list of strings.\n" 273 "\n" 274 " These flags are passed on the command-line to the linker.\n"; 275 276 const char kSources[] = "sources"; 277 const char kSources_HelpShort[] = 278 "sources: [file list] Source files for a target."; 279 const char kSources_Help[] = 280 "sources: Source files for a target\n" 281 "\n" 282 " A list of files relative to the current buildfile.\n"; 283 284 // ----------------------------------------------------------------------------- 285 286 VariableInfo::VariableInfo() 287 : help_short(NULL), 288 help(NULL) { 289 } 290 291 VariableInfo::VariableInfo(const char* in_help_short, const char* in_help) 292 : help_short(in_help_short), 293 help(in_help) { 294 } 295 296 #define INSERT_VARIABLE(var) \ 297 info_map[k##var] = VariableInfo(k##var##_HelpShort, k##var##_Help); 298 299 const VariableInfoMap& GetBuiltinVariables() { 300 static VariableInfoMap info_map; 301 if (info_map.empty()) { 302 INSERT_VARIABLE(CurrentToolchain) 303 INSERT_VARIABLE(DefaultToolchain) 304 INSERT_VARIABLE(PythonPath) 305 INSERT_VARIABLE(RelativeRootGenDir) 306 INSERT_VARIABLE(RelativeRootOutputDir) 307 INSERT_VARIABLE(RelativeTargetGenDir) 308 INSERT_VARIABLE(RelativeTargetOutputDir) 309 } 310 return info_map; 311 } 312 313 const VariableInfoMap& GetTargetVariables() { 314 static VariableInfoMap info_map; 315 if (info_map.empty()) { 316 INSERT_VARIABLE(AllDependentConfigs) 317 INSERT_VARIABLE(Cflags) 318 INSERT_VARIABLE(CflagsC) 319 INSERT_VARIABLE(CflagsCC) 320 INSERT_VARIABLE(CflagsObjC) 321 INSERT_VARIABLE(CflagsObjCC) 322 INSERT_VARIABLE(Configs) 323 INSERT_VARIABLE(Datadeps) 324 INSERT_VARIABLE(Deps) 325 INSERT_VARIABLE(DirectDependentConfigs) 326 INSERT_VARIABLE(Ldflags) 327 INSERT_VARIABLE(Sources) 328 } 329 return info_map; 330 } 331 332 #undef INSERT_VARIABLE 333 334 } // namespace variables 335