'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.'

def make_file(self, infiles, outfile, func, args, exec_msg=None, skip_msg=None, level=1):

    if (skip_msg is None):
        skip_msg = ('skipping    %s    (inputs    unchanged)' % outfile)
    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    %s    from    %s' % (outfile, ',    '.join(infiles)))
    if (self.force or dep_util.newer_group(infiles, outfile)):
        self.execute(func, args, exec_msg, level)
    else:
        log.debug(skip_msg)
