def consume_finished(self): CommonBackend.consume_finished(self) db = [] for (directory, filename, unified), cmd in self._db.iteritems(): env = self._envs[directory] cmd = list(cmd) if unified is None: cmd.append(filename) else: cmd.append(unified) local_extra = list(self._extra_includes[directory]) if directory not in self._gyp_dirs: for var in ( 'NSPR_CFLAGS', 'NSS_CFLAGS', 'MOZ_JPEG_CFLAGS', 'MOZ_PNG_CFLAGS', 'MOZ_ZLIB_CFLAGS', 'MOZ_PIXMAN_CFLAGS', ): f = env.substs.get(var) if f: local_extra.extend(f) variables = { 'LOCAL_INCLUDES': self._includes[directory], 'DEFINES': self._defines[directory], 'EXTRA_INCLUDES': local_extra, 'DIST': mozpath.join(env.topobjdir, 'dist'), 'DEPTH': env.topobjdir, 'MOZILLA_DIR': env.topsrcdir, 'topsrcdir': env.topsrcdir, 'topobjdir': env.topobjdir, } variables.update(self._local_flags[directory]) c = [] for a in cmd: a = expand_variables(a, variables).split() if not a: continue if isinstance(a, types.StringTypes): c.append(a) else: c.extend(a) per_source_flags = self._per_source_flags.get(filename) if per_source_flags is not None: c.extend(per_source_flags) db.append({ 'directory': directory, 'command': ' '.join(shell_quote(a) for a in c), 'file': mozpath.join(directory, filename), }) import json # Output the database (a JSON file) to objdir/compile_commands.json outputfile = os.path.join(self.environment.topobjdir, 'compile_commands.json') with self._write_file(outputfile) as jsonout: json.dump(db, jsonout, indent=0)
def consume_finished(self): CommonBackend.consume_finished(self) db = [] for (directory, filename, unified), cmd in self._db.items(): env = self._envs[directory] cmd = self._build_cmd(cmd, filename, unified) variables = { "DIST": mozpath.join(env.topobjdir, "dist"), "DEPTH": env.topobjdir, "MOZILLA_DIR": env.topsrcdir, "topsrcdir": env.topsrcdir, "topobjdir": env.topobjdir, } variables.update(self._local_flags[directory]) c = [] for a in cmd: accum = "" for word in expand_variables(a, variables).split(): # We can't just split() the output of expand_variables since # there can be spaces enclosed by quotes, e.g. '"foo bar"'. # Handle that case by checking whether there are an even # number of double-quotes in the word and appending it to # the accumulator if not. Meanwhile, shlex.split() and # mozbuild.shellutil.split() aren't able to properly handle # this and break in various ways, so we can't use something # off-the-shelf. has_quote = bool(word.count('"') % 2) if accum and has_quote: c.append(accum + " " + word) accum = "" elif accum and not has_quote: accum += " " + word elif not accum and has_quote: accum = word else: c.append(word) # Tell clangd to keep parsing to the end of a file, regardless of # how many errors are encountered. (Unified builds mean that we # encounter a lot of errors parsing some files.) c.insert(-1, "-ferror-limit=0") per_source_flags = self._per_source_flags.get(filename) if per_source_flags is not None: c.extend(per_source_flags) db.append( { "directory": directory, "command": " ".join(shell_quote(a) for a in c), "file": mozpath.join(directory, filename), } ) import json outputfile = self._outputfile_path() with self._write_file(outputfile) as jsonout: json.dump(db, jsonout, indent=0)
def consume_finished(self): CommonBackend.consume_finished(self) db = [] for (directory, filename, unified), cmd in self._db.iteritems(): env = self._envs[directory] cmd = list(cmd) if unified is None: cmd.append(filename) else: cmd.append(unified) local_extra = list(self._extra_includes[directory]) if directory not in self._gyp_dirs: for var in ( 'NSPR_CFLAGS', 'NSS_CFLAGS', 'MOZ_JPEG_CFLAGS', 'MOZ_PNG_CFLAGS', 'MOZ_ZLIB_CFLAGS', 'MOZ_PIXMAN_CFLAGS', ): f = env.substs.get(var) if f: local_extra.extend(f) variables = { 'LOCAL_INCLUDES': self._includes[directory], 'DEFINES': self._defines[directory], 'EXTRA_INCLUDES': local_extra, 'DIST': mozpath.join(env.topobjdir, 'dist'), 'DEPTH': env.topobjdir, 'MOZILLA_DIR': env.topsrcdir, 'topsrcdir': env.topsrcdir, 'topobjdir': env.topobjdir, } variables.update(self._local_flags[directory]) c = [] for a in cmd: a = expand_variables(a, variables).split() if not a: continue if isinstance(a, types.StringTypes): c.append(a) else: c.extend(a) per_source_flags = self._per_source_flags.get(filename) if per_source_flags is not None: c.extend(per_source_flags) db.append({ 'directory': directory, 'command': ' '.join(shell_quote(a) for a in c), 'file': filename, }) import json # Output the database (a JSON file) to objdir/compile_commands.json outputfile = os.path.join(self.environment.topobjdir, 'compile_commands.json') with self._write_file(outputfile) as jsonout: json.dump(db, jsonout, indent=0)
def _init(self): CommonBackend._init(self) log_manager = LoggingManager() self._cmd = MozbuildObject(self.environment.topsrcdir, ConfigSettings(), log_manager, self.environment.topobjdir) self._install_mapping = {} self.manifest_handler = ChromeManifestHandler()
def consume_finished(self): CommonBackend.consume_finished(self) import json # Output the database (a JSON file) to objdir/compile_commands.json outputfile = os.path.join(self.environment.topobjdir, 'compile_commands.json') with self._write_file(outputfile) as jsonout: json.dump(self._db, jsonout, indent=0)
def consume_finished(self): CommonBackend.consume_finished(self) db = [] for (directory, filename, unified), cmd in self._db.iteritems(): env = self._envs[directory] cmd = list(cmd) if unified is None: cmd.append(filename) else: cmd.append(unified) variables = { 'DIST': mozpath.join(env.topobjdir, 'dist'), 'DEPTH': env.topobjdir, 'MOZILLA_DIR': env.topsrcdir, 'topsrcdir': env.topsrcdir, 'topobjdir': env.topobjdir, } variables.update(self._local_flags[directory]) c = [] for a in cmd: accum = '' for word in expand_variables(a, variables).split(): # We can't just split() the output of expand_variables since # there can be spaces enclosed by quotes, e.g. '"foo bar"'. # Handle that case by checking whether there are an even # number of double-quotes in the word and appending it to # the accumulator if not. Meanwhile, shlex.split() and # mozbuild.shellutil.split() aren't able to properly handle # this and break in various ways, so we can't use something # off-the-shelf. has_quote = bool(word.count('"') % 2) if accum and has_quote: c.append(accum + ' ' + word) accum = '' elif accum and not has_quote: accum += ' ' + word elif not accum and has_quote: accum = word else: c.append(word) per_source_flags = self._per_source_flags.get(filename) if per_source_flags is not None: c.extend(per_source_flags) db.append({ 'directory': directory, 'command': ' '.join(shell_quote(a) for a in c), 'file': mozpath.join(directory, filename), }) import json # Output the database (a JSON file) to objdir/compile_commands.json outputfile = os.path.join(self.environment.topobjdir, 'compile_commands.json') with self._write_file(outputfile) as jsonout: json.dump(db, jsonout, indent=0)
def _init(self): CommonBackend._init(self) # The database we're going to dump out to. self._db = OrderedDict() # The cache for per-directory flags self._flags = {} self._envs = {} self._local_flags = defaultdict(dict) self._per_source_flags = defaultdict(list)
def _init(self): CommonBackend._init(self) if not util.check_top_objdir(self.environment.topobjdir): raise Exception() # The database we're going to dump out to. self._db = [] # The cache for per-directory flags self._flags = {} log_manager = LoggingManager() self._cmd = MozbuildObject(self.environment.topsrcdir, ConfigSettings(), log_manager, self.environment.topobjdir)
def _init(self): CommonBackend._init(self) if not util.check_top_objdir(self.environment.topobjdir): raise Exception() # The database we're going to dump out to. self._db = OrderedDict() # The cache for per-directory flags self._flags = {} self._envs = {} self._local_flags = defaultdict(dict) self._per_source_flags = defaultdict(list)
def consume_object(self, obj): # Those are difficult directories, that will be handled later. if obj.relativedir in ( 'build/unix/elfhack', 'build/unix/elfhack/inject', 'build/clang-plugin', 'build/clang-plugin/tests', 'toolkit/crashreporter/google-breakpad/src/common'): return True consumed = CommonBackend.consume_object(self, obj) if consumed: return True if isinstance(obj, DirectoryTraversal): self._envs[obj.objdir] = obj.config for var in ('STL_FLAGS', 'VISIBILITY_FLAGS', 'WARNINGS_AS_ERRORS'): value = obj.config.substs.get(var) if value: self._local_flags[obj.objdir][var] = value elif isinstance(obj, (Sources, GeneratedSources)): # For other sources, include each source file. for f in obj.files: self._build_db_line(obj.objdir, obj.relativedir, obj.config, f, obj.canonical_suffix) elif isinstance(obj, LocalInclude): self._includes[obj.objdir].append('-I%s' % mozpath.normpath( obj.path.full_path)) elif isinstance(obj, Linkable): if isinstance(obj.defines, Defines): # As opposed to HostDefines for d in obj.defines.get_defines(): if d not in self._defines[obj.objdir]: self._defines[obj.objdir].append(d) self._defines[obj.objdir].extend(obj.lib_defines.get_defines()) if isinstance(obj, SimpleProgram) and obj.is_unit_test: if (self._dist_include_testing not in self._extra_includes[obj.objdir]): self._extra_includes[obj.objdir].append( self._dist_include_testing) elif isinstance(obj, VariablePassthru): if obj.variables.get('IS_GYP_DIR'): self._gyp_dirs.add(obj.objdir) for var in ('MOZBUILD_CFLAGS', 'MOZBUILD_CXXFLAGS', 'MOZBUILD_CMFLAGS', 'MOZBUILD_CMMFLAGS', 'RTL_FLAGS', 'VISIBILITY_FLAGS'): if var in obj.variables: self._local_flags[obj.objdir][var] = obj.variables[var] if (obj.variables.get('DISABLE_STL_WRAPPING') and 'STL_FLAGS' in self._local_flags[obj.objdir]): del self._local_flags[obj.objdir]['STL_FLAGS'] if (obj.variables.get('ALLOW_COMPILER_WARNINGS') and 'WARNINGS_AS_ERRORS' in self._local_flags[obj.objdir]): del self._local_flags[obj.objdir]['WARNINGS_AS_ERRORS'] return True
def consume_object(self, obj): # Those are difficult directories, that will be handled later. if obj.relsrcdir in ('build/unix/elfhack', 'build/unix/elfhack/inject', 'build/clang-plugin', 'build/clang-plugin/tests'): return True consumed = CommonBackend.consume_object(self, obj) if consumed: return True if isinstance(obj, DirectoryTraversal): self._envs[obj.objdir] = obj.config elif isinstance(obj, (Sources, GeneratedSources)): # For other sources, include each source file. for f in obj.files: self._build_db_line(obj.objdir, obj.relsrcdir, obj.config, f, obj.canonical_suffix) elif isinstance(obj, VariablePassthru): for var in ('MOZBUILD_CMFLAGS', 'MOZBUILD_CMMFLAGS'): if var in obj.variables: self._local_flags[obj.objdir][var] = obj.variables[var] elif isinstance(obj, PerSourceFlag): self._per_source_flags[obj.file_name].extend(obj.flags) elif isinstance(obj, ComputedFlags): for var, flags in obj.get_flags(): self._local_flags[obj.objdir]['COMPUTED_%s' % var] = flags return True
def consume_finished(self): CommonBackend.consume_finished(self) db = [] for (directory, filename, unified), cmd in self._db.iteritems(): env = self._envs[directory] cmd = list(cmd) if unified is None: cmd.append(filename) else: cmd.append(unified) variables = { 'DIST': mozpath.join(env.topobjdir, 'dist'), 'DEPTH': env.topobjdir, 'MOZILLA_DIR': env.topsrcdir, 'topsrcdir': env.topsrcdir, 'topobjdir': env.topobjdir, } variables.update(self._local_flags[directory]) c = [] for a in cmd: a = expand_variables(a, variables).split() if not a: continue if isinstance(a, types.StringTypes): c.append(a) else: c.extend(a) per_source_flags = self._per_source_flags.get(filename) if per_source_flags is not None: c.extend(per_source_flags) db.append({ 'directory': directory, 'command': ' '.join(shell_quote(a) for a in c), 'file': mozpath.join(directory, filename), }) import json # Output the database (a JSON file) to objdir/compile_commands.json outputfile = os.path.join(self.environment.topobjdir, 'compile_commands.json') with self._write_file(outputfile) as jsonout: json.dump(db, jsonout, indent=0)
def _init(self): CommonBackend._init(self) if not util.check_top_objdir(self.environment.topobjdir): raise Exception() # The database we're going to dump out to. self._db = OrderedDict() # The cache for per-directory flags self._flags = {} self._envs = {} self._includes = defaultdict(list) self._defines = defaultdict(list) self._local_flags = defaultdict(dict) self._extra_includes = defaultdict(list) self._gyp_dirs = set() self._dist_include_testing = '-I%s' % mozpath.join( self.environment.topobjdir, 'dist', 'include', 'testing')
def consume_object(self, obj): consumed = CommonBackend.consume_object(self, obj) if consumed: return True if isinstance(obj, Sources) or isinstance(obj, HostSources) or \ isinstance(obj, GeneratedSources): # For other sources, include each source file. for f in obj.files: flags = self._get_dir_flags(obj.objdir) self._build_db_line(obj.objdir, self.environment, f, obj.canonical_suffix, flags, isinstance(obj, HostSources)) return True
def consume_object(self, obj): # Those are difficult directories, that will be handled later. if obj.relsrcdir in ( 'build/unix/elfhack', 'build/unix/elfhack/inject', 'build/clang-plugin', 'build/clang-plugin/tests'): return True consumed = CommonBackend.consume_object(self, obj) if consumed: return True if isinstance(obj, DirectoryTraversal): self._envs[obj.objdir] = obj.config elif isinstance(obj, (Sources, GeneratedSources)): # For other sources, include each source file. for f in obj.files: self._build_db_line(obj.objdir, obj.relsrcdir, obj.config, f, obj.canonical_suffix) elif isinstance(obj, VariablePassthru): for var in ('MOZBUILD_CMFLAGS', 'MOZBUILD_CMMFLAGS'): if var in obj.variables: self._local_flags[obj.objdir][var] = obj.variables[var] elif isinstance(obj, PerSourceFlag): self._per_source_flags[obj.file_name].extend(obj.flags) elif isinstance(obj, ComputedFlags): for var, flags in obj.get_flags(): self._local_flags[obj.objdir]['COMPUTED_%s' % var] = flags return True
def consume_object(self, obj): # Those are difficult directories, that will be handled later. if obj.relativedir in ( 'build/unix/elfhack', 'build/unix/elfhack/inject', 'build/clang-plugin', 'build/clang-plugin/tests', 'security/sandbox/win/wow_helper', 'toolkit/crashreporter/google-breakpad/src/common'): return True consumed = CommonBackend.consume_object(self, obj) if consumed: return True if isinstance(obj, DirectoryTraversal): self._envs[obj.objdir] = obj.config for var in ('STL_FLAGS', 'VISIBILITY_FLAGS', 'WARNINGS_AS_ERRORS'): value = obj.config.substs.get(var) if value: self._local_flags[obj.objdir][var] = value elif isinstance(obj, (Sources, GeneratedSources)): # For other sources, include each source file. for f in obj.files: self._build_db_line(obj.objdir, obj.relativedir, obj.config, f, obj.canonical_suffix) elif isinstance(obj, LocalInclude): self._includes[obj.objdir].append('-I%s' % mozpath.normpath( obj.path.full_path)) elif isinstance(obj, Linkable): if isinstance(obj.defines, Defines): # As opposed to HostDefines for d in obj.defines.get_defines(): if d not in self._defines[obj.objdir]: self._defines[obj.objdir].append(d) self._defines[obj.objdir].extend(obj.lib_defines.get_defines()) if isinstance(obj, SimpleProgram) and obj.is_unit_test: if (self._dist_include_testing not in self._extra_includes[obj.objdir]): self._extra_includes[obj.objdir].append( self._dist_include_testing) elif isinstance(obj, VariablePassthru): if obj.variables.get('IS_GYP_DIR'): self._gyp_dirs.add(obj.objdir) for var in ('MOZBUILD_CFLAGS', 'MOZBUILD_CXXFLAGS', 'MOZBUILD_CMFLAGS', 'MOZBUILD_CMMFLAGS', 'RTL_FLAGS', 'VISIBILITY_FLAGS'): if var in obj.variables: self._local_flags[obj.objdir][var] = obj.variables[var] if (obj.variables.get('DISABLE_STL_WRAPPING') and 'STL_FLAGS' in self._local_flags[obj.objdir]): del self._local_flags[obj.objdir]['STL_FLAGS'] if (obj.variables.get('ALLOW_COMPILER_WARNINGS') and 'WARNINGS_AS_ERRORS' in self._local_flags[obj.objdir]): del self._local_flags[obj.objdir]['WARNINGS_AS_ERRORS'] return True