def test_sources(self): self.assertIsNone(sut.classify_source('file.o')) self.assertIsNone(sut.classify_source('file.exe')) self.assertIsNone(sut.classify_source('/path/file.o')) self.assertIsNone(sut.classify_source('clang')) self.assertEqual('c', sut.classify_source('file.c')) self.assertEqual('c', sut.classify_source('./file.c')) self.assertEqual('c', sut.classify_source('/path/file.c')) self.assertEqual('c++', sut.classify_source('file.c', False)) self.assertEqual('c++', sut.classify_source('./file.c', False)) self.assertEqual('c++', sut.classify_source('/path/file.c', False))
def language_check(opts, continuation=filter_debug_flags): """ Find out the language from command line parameters or file name extension. The decision also influenced by the compiler invocation. """ accepted = frozenset({ 'c', 'c++', 'objective-c', 'objective-c++', 'c-cpp-output', 'c++-cpp-output', 'objective-c-cpp-output' }) # language can be given as a parameter... language = opts.pop('language') compiler = opts.pop('compiler') # ... or find out from source file extension if language is None and compiler is not None: language = classify_source(opts['file'], compiler == 'c') if language is None: logging.debug('skip analysis, language not known') return None elif language not in accepted: logging.debug('skip analysis, language not supported') return None else: logging.debug('analysis, language: %s', language) opts.update({'language': language, 'flags': ['-x', language] + opts['flags']}) return continuation(opts)
def classify_parameters(command): """ Prepare compiler flags (filters some and add others) and take out language (-x) and architecture (-arch) flags for future processing. """ result = { 'flags': [], # the filtered compiler flags 'arch_list': [], # list of architecture flags 'language': None, # compilation language, None, if not specified 'compiler': compiler_language(command) # 'c' or 'c++' } # iterate on the compile options args = iter(command[1:]) for arg in args: # take arch flags into a separate basket if arg == '-arch': result['arch_list'].append(next(args)) # take language elif arg == '-x': result['language'] = next(args) # parameters which looks source file are not flags elif re.match(r'^[^-].+', arg) and classify_source(arg): pass # ignore some flags elif arg in IGNORED_FLAGS: count = IGNORED_FLAGS[arg] for _ in range(count): next(args) # we don't care about extra warnings, but we should suppress ones # that we don't want to see. elif re.match(r'^-W.+', arg) and not re.match(r'^-Wno-.+', arg): pass # and consider everything else as compilation flag. else: result['flags'].append(arg) return result
def assert_cxx_source(self, filename, force): result = sut.classify_source(filename, force) self.assertEqual('c++', result)
def assert_non_source(self, filename): result = sut.classify_source(filename) self.assertIsNone(result)