code: def _program_files_from_executable(self, executable, required_paths, parent_dir=False):
          
          base_dir = os.path.dirname(executable)
          if parent_dir:
              base_dir = os.path.join(base_dir, os.path.pardir)
          return util.flatten(
              util.expand_filename_pattern(path, base_dir) for path in required_paths)
docs: Get a list of program files by expanding a list of path patterns
          and interpreting it as relative to the executable.
          This method can be used as helper for implementing the method program_files().
          Contrary to the default implementation of program_files(), this method does not explicitly
          add the executable to the list of returned files, it assumes that required_paths
          contains a path that covers the executable.
          @param executable: the path to the executable of the tool (typically the result of executable())
          @param required_paths: a list of required path patterns
          @param parent_dir: whether required_paths are relative to the directory of executable or the parent directory
          @return a list of paths as strings, suitable for result of program_files()