class_docstr: Abstract base class for defining command classes, the "worker bees"
  of the Distutils.  A useful analogy for command classes is to think of
  them as subroutines with local variables called "options".  The options
  are "declared" in 'initialize_options()' and "defined" (given their
  final values, aka "finalized") in 'finalize_options()', both of which
  must be defined by every command class.  The distinction between the
  two is necessary because option values might come from the outside
  world (command line, config file, ...), and any options dependent on
  other options must be computed *after* these outside influences have
  been processed -- hence 'finalize_options()'.  The "body" of the
  subroutine, where it does all its work based on the values of its
  options, is the 'run()' method, which must also be implemented by every
  command class.
docstr: Special case of 'execute()' for operations that process one or
  more input files and generate one output file.  Works just like
  'execute()', except the operation is skipped and a different
  message printed if 'outfile' already exists and is newer than all
  files listed in 'infiles'.  If the command defined 'self.force',
  and it is true, then the command is unconditionally run -- does no
  timestamp checks.
docstr_tok: ["Special","case","of","'execute","(",")","'","for","operations","that","process","one","or","more","input","files","and","generate","one","output","file",".","Works","just","like","'execute","(",")","'",",","except","the","operation","is","skipped","and","a","different","message","printed","if","'outfile","'","already","exists","and","is","newer","than","all","files","listed","in","'infiles","'",".","If","the","command","defined","'self.force","'",",","and","it","is","true",",","then","the","command","is","unconditionally","run","--","does","no","timestamp","checks","."]
code: def make_file(
      self,
      infiles,
      outfile,
      func,
      args,
      exec_msg=None,
      skip_msg=None,
      level=1,
  ):
      """Special case of 'execute()' for operations that process one or
      more input files and generate one output file.  Works just like
      'execute()', except the operation is skipped and a different
      message printed if 'outfile' already exists and is newer than all
      files listed in 'infiles'.  If the command defined 'self.force',
      and it is true, then the command is unconditionally run -- does no
      timestamp checks.
      """
      if skip_msg is None:
          skip_msg = "skipping %s (inputs unchanged)" % outfile
  
      # Allow 'infiles' to be a single string
      if isinstance(infiles, str):
          infiles = (infiles,)
      elif not isinstance(infiles, (list, tuple)):
          raise TypeError(
              "'infiles' must be a string, or a list or tuple of strings"
          )
  
      if exec_msg is None:
          exec_msg = "generating {} from {}".format(
              outfile, ", ".join(infiles)
          )
  
      # If 'outfile' must be regenerated (either because it doesn't
      # exist, is out-of-date, or the 'force' flag is true) then
      # perform the action that presumably regenerates it
      if self.force or _modified.newer_group(infiles, outfile):
          self.execute(func, args, exec_msg, level)
      # Otherwise, print the "skip" message
      else:
          log.debug(skip_msg)
  
imports: import sys
  import os
  import re
  import logging
  from .errors import DistutilsOptionError
  from .None import util, dir_util, file_util, archive_util, _modified
  from ._log import log
label_desc: Use image node_id 30 for calling the Command obj's underlying member method code with example usage: obj.make_file(infiles, outfile, func, args, exec_msg, skip_msg, level) without return types