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