parameters: (self, name, args, description, is_cygwin, env, pool,
                          depfile=None)
return_statement: return rule_name, args
docstring: Write out a new ninja "rule" statement for a given command.
  
      Returns the name of the new rule, and a copy of |args| with variables
      expanded.
docstring_summary: Write out a new ninja "rule" statement for a given command.
docstring_tokens: Write out a new ninja rule statement for a given command .
function: def WriteNewNinjaRule(self, name, args, description, is_cygwin, env, pool,
                          depfile=None):
      """Write out a new ninja "rule" statement for a given command.
  
      Returns the name of the new rule, and a copy of |args| with variables
      expanded."""
  
      if self.flavor == 'win':
        args = [self.msvs_settings.ConvertVSMacros(
                    arg, self.base_to_build, config=self.config_name)
                for arg in args]
        description = self.msvs_settings.ConvertVSMacros(
            description, config=self.config_name)
      elif self.flavor == 'mac':
        # |env| is an empty list on non-mac.
        args = [gyp.xcode_emulation.ExpandEnvVars(arg, env) for arg in args]
        description = gyp.xcode_emulation.ExpandEnvVars(description, env)
  
      # TODO: we shouldn't need to qualify names; we do it because
      # currently the ninja rule namespace is global, but it really
      # should be scoped to the subninja.
      rule_name = self.name
      if self.toolset == 'target':
        rule_name += '.' + self.toolset
      rule_name += '.' + name
      rule_name = re.sub('[^a-zA-Z0-9_]', '_', rule_name)
  
      # Remove variable references, but not if they refer to the magic rule
      # variables.  This is not quite right, as it also protects these for
      # actions, not just for rules where they are valid. Good enough.
      protect = [ '${root}', '${dirname}', '${source}', '${ext}', '${name}' ]
      protect = '(?!' + '|'.join(map(re.escape, protect)) + ')'
      description = re.sub(protect + r'\$', '_', description)
  
      # gyp dictates that commands are run from the base directory.
      # cd into the directory before running, and adjust paths in
      # the arguments to point to the proper locations.
      rspfile = None
      rspfile_content = None
      args = [self.ExpandSpecial(arg, self.base_to_build) for arg in args]
      if self.flavor == 'win':
        rspfile = rule_name + '.$unique_name.rsp'
        # The cygwin case handles this inside the bash sub-shell.
        run_in = '' if is_cygwin else ' ' + self.build_to_base
        if is_cygwin:
          rspfile_content = self.msvs_settings.BuildCygwinBashCommandLine(
              args, self.build_to_base)
        else:
          rspfile_content = gyp.msvs_emulation.EncodeRspFileList(args)
        command = ('%s gyp-win-tool action-wrapper $arch ' % sys.executable +
                   rspfile + run_in)
      else:
        env = self.ComputeExportEnvString(env)
        command = gyp.common.EncodePOSIXShellList(args)
        command = 'cd %s; ' % self.build_to_base + env + command
  
      # GYP rules/actions express being no-ops by not touching their outputs.
      # Avoid executing downstream dependencies in this case by specifying
      # restat=1 to ninja.
      self.ninja.rule(rule_name, command, description, depfile=depfile,
                      restat=True, pool=pool,
                      rspfile=rspfile, rspfile_content=rspfile_content)
      self.ninja.newline()
  
      return rule_name, args
function_tokens: def WriteNewNinjaRule ( self , name , args , description , is_cygwin , env , pool , depfile = None ) : if self . flavor == 'win' : args = [ self . msvs_settings . ConvertVSMacros ( arg , self . base_to_build , config = self . config_name ) for arg in args ] description = self . msvs_settings . ConvertVSMacros ( description , config = self . config_name ) elif self . flavor == 'mac' : # |env| is an empty list on non-mac. args = [ gyp . xcode_emulation . ExpandEnvVars ( arg , env ) for arg in args ] description = gyp . xcode_emulation . ExpandEnvVars ( description , env ) # TODO: we shouldn't need to qualify names; we do it because # currently the ninja rule namespace is global, but it really # should be scoped to the subninja. rule_name = self . name if self . toolset == 'target' : rule_name += '.' + self . toolset rule_name += '.' + name rule_name = re . sub ( '[^a-zA-Z0-9_]' , '_' , rule_name ) # Remove variable references, but not if they refer to the magic rule # variables.  This is not quite right, as it also protects these for # actions, not just for rules where they are valid. Good enough. protect = [ '${root}' , '${dirname}' , '${source}' , '${ext}' , '${name}' ] protect = '(?!' + '|' . join ( map ( re . escape , protect ) ) + ')' description = re . sub ( protect + r'\$' , '_' , description ) # gyp dictates that commands are run from the base directory. # cd into the directory before running, and adjust paths in # the arguments to point to the proper locations. rspfile = None rspfile_content = None args = [ self . ExpandSpecial ( arg , self . base_to_build ) for arg in args ] if self . flavor == 'win' : rspfile = rule_name + '.$unique_name.rsp' # The cygwin case handles this inside the bash sub-shell. run_in = '' if is_cygwin else ' ' + self . build_to_base if is_cygwin : rspfile_content = self . msvs_settings . BuildCygwinBashCommandLine ( args , self . build_to_base ) else : rspfile_content = gyp . msvs_emulation . EncodeRspFileList ( args ) command = ( '%s gyp-win-tool action-wrapper $arch ' % sys . executable + rspfile + run_in ) else : env = self . ComputeExportEnvString ( env ) command = gyp . common . EncodePOSIXShellList ( args ) command = 'cd %s; ' % self . build_to_base + env + command # GYP rules/actions express being no-ops by not touching their outputs. # Avoid executing downstream dependencies in this case by specifying # restat=1 to ninja. self . ninja . rule ( rule_name , command , description , depfile = depfile , restat = True , pool = pool , rspfile = rspfile , rspfile_content = rspfile_content ) self . ninja . newline ( ) return rule_name , args