Home | History | Annotate | Download | only in gn
      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 #ifndef TOOLS_GN_FUNCTIONS_H_
      6 #define TOOLS_GN_FUNCTIONS_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/strings/string_piece.h"
     13 
     14 class Err;
     15 class BlockNode;
     16 class FunctionCallNode;
     17 class Label;
     18 class ListNode;
     19 class ParseNode;
     20 class Scope;
     21 class Token;
     22 class Value;
     23 
     24 // -----------------------------------------------------------------------------
     25 
     26 namespace functions {
     27 
     28 // This type of function invocation has no block and evaluates its arguments
     29 // itself rather than taking a pre-executed list. This allows us to implement
     30 // certain built-in functions.
     31 typedef Value (*SelfEvaluatingArgsFunction)(Scope* scope,
     32                                             const FunctionCallNode* function,
     33                                             const ListNode* args_list,
     34                                             Err* err);
     35 
     36 // This type of function invocation takes a block node that it will execute.
     37 typedef Value (*GenericBlockFunction)(Scope* scope,
     38                                       const FunctionCallNode* function,
     39                                       const std::vector<Value>& args,
     40                                       BlockNode* block,
     41                                       Err* err);
     42 
     43 // This type of function takes a block, but does not need to control execution
     44 // of it. The dispatch function will pre-execute the block and pass the
     45 // resulting block_scope to the function.
     46 typedef Value(*ExecutedBlockFunction)(const FunctionCallNode* function,
     47                                       const std::vector<Value>& args,
     48                                       Scope* block_scope,
     49                                       Err* err);
     50 
     51 // This type of function does not take a block. It just has arguments.
     52 typedef Value (*NoBlockFunction)(Scope* scope,
     53                                  const FunctionCallNode* function,
     54                                  const std::vector<Value>& args,
     55                                  Err* err);
     56 
     57 extern const char kAction[];
     58 extern const char kAction_HelpShort[];
     59 extern const char kAction_Help[];
     60 Value RunAction(Scope* scope,
     61                 const FunctionCallNode* function,
     62                 const std::vector<Value>& args,
     63                 BlockNode* block,
     64                 Err* err);
     65 
     66 extern const char kActionForEach[];
     67 extern const char kActionForEach_HelpShort[];
     68 extern const char kActionForEach_Help[];
     69 Value RunActionForEach(Scope* scope,
     70                        const FunctionCallNode* function,
     71                        const std::vector<Value>& args,
     72                        BlockNode* block,
     73                        Err* err);
     74 
     75 extern const char kAssert[];
     76 extern const char kAssert_HelpShort[];
     77 extern const char kAssert_Help[];
     78 Value RunAssert(Scope* scope,
     79                 const FunctionCallNode* function,
     80                 const std::vector<Value>& args,
     81                 Err* err);
     82 
     83 extern const char kConfig[];
     84 extern const char kConfig_HelpShort[];
     85 extern const char kConfig_Help[];
     86 Value RunConfig(const FunctionCallNode* function,
     87                 const std::vector<Value>& args,
     88                 Scope* block_scope,
     89                 Err* err);
     90 
     91 extern const char kCopy[];
     92 extern const char kCopy_HelpShort[];
     93 extern const char kCopy_Help[];
     94 Value RunCopy(const FunctionCallNode* function,
     95               const std::vector<Value>& args,
     96               Scope* block_scope,
     97               Err* err);
     98 
     99 extern const char kDeclareArgs[];
    100 extern const char kDeclareArgs_HelpShort[];
    101 extern const char kDeclareArgs_Help[];
    102 Value RunDeclareArgs(Scope* scope,
    103                      const FunctionCallNode* function,
    104                      const std::vector<Value>& args,
    105                      BlockNode* block,
    106                      Err* err);
    107 
    108 extern const char kDefined[];
    109 extern const char kDefined_HelpShort[];
    110 extern const char kDefined_Help[];
    111 Value RunDefined(Scope* scope,
    112                  const FunctionCallNode* function,
    113                  const ListNode* args_list,
    114                  Err* err);
    115 
    116 extern const char kExecScript[];
    117 extern const char kExecScript_HelpShort[];
    118 extern const char kExecScript_Help[];
    119 Value RunExecScript(Scope* scope,
    120                     const FunctionCallNode* function,
    121                     const std::vector<Value>& args,
    122                     Err* err);
    123 
    124 extern const char kExecutable[];
    125 extern const char kExecutable_HelpShort[];
    126 extern const char kExecutable_Help[];
    127 Value RunExecutable(Scope* scope,
    128                     const FunctionCallNode* function,
    129                     const std::vector<Value>& args,
    130                     BlockNode* block,
    131                     Err* err);
    132 
    133 extern const char kForEach[];
    134 extern const char kForEach_HelpShort[];
    135 extern const char kForEach_Help[];
    136 Value RunForEach(Scope* scope,
    137                  const FunctionCallNode* function,
    138                  const ListNode* args_list,
    139                  Err* err);
    140 
    141 extern const char kGetEnv[];
    142 extern const char kGetEnv_HelpShort[];
    143 extern const char kGetEnv_Help[];
    144 Value RunGetEnv(Scope* scope,
    145                 const FunctionCallNode* function,
    146                 const std::vector<Value>& args,
    147                 Err* err);
    148 
    149 extern const char kGetLabelInfo[];
    150 extern const char kGetLabelInfo_HelpShort[];
    151 extern const char kGetLabelInfo_Help[];
    152 Value RunGetLabelInfo(Scope* scope,
    153                       const FunctionCallNode* function,
    154                       const std::vector<Value>& args,
    155                       Err* err);
    156 
    157 extern const char kGetPathInfo[];
    158 extern const char kGetPathInfo_HelpShort[];
    159 extern const char kGetPathInfo_Help[];
    160 Value RunGetPathInfo(Scope* scope,
    161                      const FunctionCallNode* function,
    162                      const std::vector<Value>& args,
    163                      Err* err);
    164 
    165 extern const char kGetTargetOutputs[];
    166 extern const char kGetTargetOutputs_HelpShort[];
    167 extern const char kGetTargetOutputs_Help[];
    168 Value RunGetTargetOutputs(Scope* scope,
    169                           const FunctionCallNode* function,
    170                           const std::vector<Value>& args,
    171                           Err* err);
    172 
    173 extern const char kGroup[];
    174 extern const char kGroup_HelpShort[];
    175 extern const char kGroup_Help[];
    176 Value RunGroup(Scope* scope,
    177                const FunctionCallNode* function,
    178                const std::vector<Value>& args,
    179                BlockNode* block,
    180                Err* err);
    181 
    182 extern const char kImport[];
    183 extern const char kImport_HelpShort[];
    184 extern const char kImport_Help[];
    185 Value RunImport(Scope* scope,
    186                 const FunctionCallNode* function,
    187                 const std::vector<Value>& args,
    188                 Err* err);
    189 
    190 extern const char kPrint[];
    191 extern const char kPrint_HelpShort[];
    192 extern const char kPrint_Help[];
    193 Value RunPrint(Scope* scope,
    194                const FunctionCallNode* function,
    195                const std::vector<Value>& args,
    196                Err* err);
    197 
    198 extern const char kProcessFileTemplate[];
    199 extern const char kProcessFileTemplate_HelpShort[];
    200 extern const char kProcessFileTemplate_Help[];
    201 Value RunProcessFileTemplate(Scope* scope,
    202                              const FunctionCallNode* function,
    203                              const std::vector<Value>& args,
    204                              Err* err);
    205 
    206 extern const char kReadFile[];
    207 extern const char kReadFile_HelpShort[];
    208 extern const char kReadFile_Help[];
    209 Value RunReadFile(Scope* scope,
    210                   const FunctionCallNode* function,
    211                   const std::vector<Value>& args,
    212                   Err* err);
    213 
    214 extern const char kRebasePath[];
    215 extern const char kRebasePath_HelpShort[];
    216 extern const char kRebasePath_Help[];
    217 Value RunRebasePath(Scope* scope,
    218                     const FunctionCallNode* function,
    219                     const std::vector<Value>& args,
    220                     Err* err);
    221 
    222 extern const char kSetDefaults[];
    223 extern const char kSetDefaults_HelpShort[];
    224 extern const char kSetDefaults_Help[];
    225 Value RunSetDefaults(Scope* scope,
    226                      const FunctionCallNode* function,
    227                      const std::vector<Value>& args,
    228                      BlockNode* block,
    229                      Err* err);
    230 
    231 extern const char kSetDefaultToolchain[];
    232 extern const char kSetDefaultToolchain_HelpShort[];
    233 extern const char kSetDefaultToolchain_Help[];
    234 Value RunSetDefaultToolchain(Scope* scope,
    235                              const FunctionCallNode* function,
    236                              const std::vector<Value>& args,
    237                              Err* err);
    238 
    239 extern const char kSetSourcesAssignmentFilter[];
    240 extern const char kSetSourcesAssignmentFilter_HelpShort[];
    241 extern const char kSetSourcesAssignmentFilter_Help[];
    242 Value RunSetSourcesAssignmentFilter(Scope* scope,
    243                                     const FunctionCallNode* function,
    244                                     const std::vector<Value>& args,
    245                                     Err* err);
    246 
    247 extern const char kSharedLibrary[];
    248 extern const char kSharedLibrary_HelpShort[];
    249 extern const char kSharedLibrary_Help[];
    250 Value RunSharedLibrary(Scope* scope,
    251                        const FunctionCallNode* function,
    252                        const std::vector<Value>& args,
    253                        BlockNode* block,
    254                        Err* err);
    255 
    256 extern const char kSourceSet[];
    257 extern const char kSourceSet_HelpShort[];
    258 extern const char kSourceSet_Help[];
    259 Value RunSourceSet(Scope* scope,
    260                    const FunctionCallNode* function,
    261                    const std::vector<Value>& args,
    262                    BlockNode* block,
    263                    Err* err);
    264 
    265 extern const char kStaticLibrary[];
    266 extern const char kStaticLibrary_HelpShort[];
    267 extern const char kStaticLibrary_Help[];
    268 Value RunStaticLibrary(Scope* scope,
    269                        const FunctionCallNode* function,
    270                        const std::vector<Value>& args,
    271                        BlockNode* block,
    272                        Err* err);
    273 
    274 extern const char kTemplate[];
    275 extern const char kTemplate_HelpShort[];
    276 extern const char kTemplate_Help[];
    277 Value RunTemplate(Scope* scope,
    278                   const FunctionCallNode* function,
    279                   const std::vector<Value>& args,
    280                   BlockNode* block,
    281                   Err* err);
    282 
    283 extern const char kTool[];
    284 extern const char kTool_HelpShort[];
    285 extern const char kTool_Help[];
    286 Value RunTool(Scope* scope,
    287               const FunctionCallNode* function,
    288               const std::vector<Value>& args,
    289               BlockNode* block,
    290               Err* err);
    291 
    292 extern const char kToolchain[];
    293 extern const char kToolchain_HelpShort[];
    294 extern const char kToolchain_Help[];
    295 Value RunToolchain(Scope* scope,
    296                    const FunctionCallNode* function,
    297                    const std::vector<Value>& args,
    298                    BlockNode* block,
    299                    Err* err);
    300 
    301 extern const char kToolchainArgs[];
    302 extern const char kToolchainArgs_HelpShort[];
    303 extern const char kToolchainArgs_Help[];
    304 Value RunToolchainArgs(Scope* scope,
    305                        const FunctionCallNode* function,
    306                        const std::vector<Value>& args,
    307                        BlockNode* block,
    308                        Err* err);
    309 
    310 extern const char kWriteFile[];
    311 extern const char kWriteFile_HelpShort[];
    312 extern const char kWriteFile_Help[];
    313 Value RunWriteFile(Scope* scope,
    314                    const FunctionCallNode* function,
    315                    const std::vector<Value>& args,
    316                    Err* err);
    317 
    318 // -----------------------------------------------------------------------------
    319 
    320 // One function record. Only one of the given runner types will be non-null
    321 // which indicates the type of function it is.
    322 struct FunctionInfo {
    323   FunctionInfo();
    324   FunctionInfo(SelfEvaluatingArgsFunction seaf,
    325                const char* in_help_short,
    326                const char* in_help,
    327                bool in_is_target);
    328   FunctionInfo(GenericBlockFunction gbf,
    329                const char* in_help_short,
    330                const char* in_help,
    331                bool in_is_target);
    332   FunctionInfo(ExecutedBlockFunction ebf,
    333                const char* in_help_short,
    334                const char* in_help,
    335                bool in_is_target);
    336   FunctionInfo(NoBlockFunction nbf,
    337                const char* in_help_short,
    338                const char* in_help,
    339                bool in_is_target);
    340 
    341   SelfEvaluatingArgsFunction self_evaluating_args_runner;
    342   GenericBlockFunction generic_block_runner;
    343   ExecutedBlockFunction executed_block_runner;
    344   NoBlockFunction no_block_runner;
    345 
    346   const char* help_short;
    347   const char* help;
    348 
    349   bool is_target;
    350 };
    351 
    352 typedef std::map<base::StringPiece, FunctionInfo> FunctionInfoMap;
    353 
    354 // Returns the mapping of all built-in functions.
    355 const FunctionInfoMap& GetFunctions();
    356 
    357 // Runs the given function.
    358 Value RunFunction(Scope* scope,
    359                   const FunctionCallNode* function,
    360                   const ListNode* args_list,
    361                   BlockNode* block,  // Optional.
    362                   Err* err);
    363 
    364 }  // namespace functions
    365 
    366 // Helper functions -----------------------------------------------------------
    367 
    368 // Verifies that the current scope is not processing an import. If it is, it
    369 // will set the error, blame the given parse node for it, and return false.
    370 bool EnsureNotProcessingImport(const ParseNode* node,
    371                                const Scope* scope,
    372                                Err* err);
    373 
    374 // Like EnsureNotProcessingImport but checks for running the build config.
    375 bool EnsureNotProcessingBuildConfig(const ParseNode* node,
    376                                     const Scope* scope,
    377                                     Err* err);
    378 
    379 // Sets up the |block_scope| for executing a target (or something like it).
    380 // The |scope| is the containing scope. It should have been already set as the
    381 // parent for the |block_scope| when the |block_scope| was created.
    382 //
    383 // This will set up the target defaults and set the |target_name| variable in
    384 // the block scope to the current target name, which is assumed to be the first
    385 // argument to the function.
    386 //
    387 // On success, returns true. On failure, sets the error and returns false.
    388 bool FillTargetBlockScope(const Scope* scope,
    389                           const FunctionCallNode* function,
    390                           const std::string& target_type,
    391                           const BlockNode* block,
    392                           const std::vector<Value>& args,
    393                           Scope* block_scope,
    394                           Err* err);
    395 
    396 // Sets the given error to a message explaining that the function call requires
    397 // a block.
    398 void FillNeedsBlockError(const FunctionCallNode* function, Err* err);
    399 
    400 // Validates that the given function call has one string argument. This is
    401 // the most common function signature, so it saves space to have this helper.
    402 // Returns false and sets the error on failure.
    403 bool EnsureSingleStringArg(const FunctionCallNode* function,
    404                            const std::vector<Value>& args,
    405                            Err* err);
    406 
    407 // Returns the name of the toolchain for the given scope.
    408 const Label& ToolchainLabelForScope(const Scope* scope);
    409 
    410 // Generates a label for the given scope, using the current directory and
    411 // toolchain, and the given name.
    412 Label MakeLabelForScope(const Scope* scope,
    413                         const FunctionCallNode* function,
    414                         const std::string& name);
    415 
    416 #endif  // TOOLS_GN_FUNCTIONS_H_
    417