summaryrefslogtreecommitdiff
path: root/giscanner/sourcescanner.py
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner/sourcescanner.py')
-rw-r--r--giscanner/sourcescanner.py57
1 files changed, 36 insertions, 21 deletions
diff --git a/giscanner/sourcescanner.py b/giscanner/sourcescanner.py
index db282f84..dab16027 100644
--- a/giscanner/sourcescanner.py
+++ b/giscanner/sourcescanner.py
@@ -32,6 +32,10 @@ with LibtoolImporter(None, None):
else:
from giscanner._giscanner import SourceScanner as CSourceScanner
+HEADER_EXTS = ['.h', '.hpp', '.hxx']
+SOURCE_EXTS = ['.c', '.cpp', '.cc', '.cxx']
+ALL_EXTS = SOURCE_EXTS + HEADER_EXTS
+
(CSYMBOL_TYPE_INVALID,
CSYMBOL_TYPE_ELLIPSIS,
CSYMBOL_TYPE_CONST,
@@ -89,8 +93,7 @@ def symbol_type_name(symbol_type):
CSYMBOL_TYPE_UNION: 'union',
CSYMBOL_TYPE_ENUM: 'enum',
CSYMBOL_TYPE_TYPEDEF: 'typedef',
- CSYMBOL_TYPE_MEMBER: 'member',
- }.get(symbol_type)
+ CSYMBOL_TYPE_MEMBER: 'member'}.get(symbol_type)
def ctype_name(ctype):
@@ -104,8 +107,7 @@ def ctype_name(ctype):
CTYPE_ENUM: 'enum',
CTYPE_POINTER: 'pointer',
CTYPE_ARRAY: 'array',
- CTYPE_FUNCTION: 'function',
- }.get(ctype)
+ CTYPE_FUNCTION: 'function'}.get(ctype)
class SourceType(object):
@@ -152,8 +154,8 @@ class SourceType(object):
class SourceSymbol(object):
- __members__ = ['const_int', 'const_double', 'const_string', 'ident',
- 'type', 'base_type']
+ __members__ = ['const_int', 'const_double', 'const_string', 'const_boolean',
+ 'ident', 'type', 'base_type']
def __init__(self, scanner, symbol):
self._scanner = scanner
@@ -184,6 +186,10 @@ class SourceSymbol(object):
return self._symbol.const_string
@property
+ def const_boolean(self):
+ return self._symbol.const_boolean
+
+ @property
def ident(self):
return self._symbol.ident
@@ -223,8 +229,9 @@ class SourceScanner(object):
# Public API
- def set_cpp_options(self, includes, defines, undefines):
- for prefix, args in [('-I', includes),
+ def set_cpp_options(self, includes, defines, undefines, cflags=[]):
+ self._cpp_options.extend(cflags)
+ for prefix, args in [('-I', [os.path.realpath(f) for f in includes]),
('-D', defines),
('-U', undefines)]:
for arg in (args or []):
@@ -234,15 +241,14 @@ class SourceScanner(object):
def parse_files(self, filenames):
for filename in filenames:
- filename = os.path.abspath(filename)
+ # self._scanner expects file names to be canonicalized and symlinks to be resolved
+ filename = os.path.realpath(filename)
self._scanner.append_filename(filename)
self._filenames.append(filename)
headers = []
- for filename in filenames:
- if (filename.endswith('.c') or filename.endswith('.cpp') or
- filename.endswith('.cc') or filename.endswith('.cxx')):
- filename = os.path.abspath(filename)
+ for filename in self._filenames:
+ if os.path.splitext(filename)[1] in SOURCE_EXTS:
self._scanner.lex_filename(filename)
else:
headers.append(filename)
@@ -251,7 +257,8 @@ class SourceScanner(object):
def parse_macros(self, filenames):
self._scanner.set_macro_scan(True)
- self._scanner.parse_macros(filenames)
+ # self._scanner expects file names to be canonicalized and symlinks to be resolved
+ self._scanner.parse_macros([os.path.realpath(f) for f in filenames])
self._scanner.set_macro_scan(False)
def get_symbols(self):
@@ -262,7 +269,7 @@ class SourceScanner(object):
return self._scanner.get_comments()
def dump(self):
- print '-'*30
+ print '-' * 30
for symbol in self._scanner.get_symbols():
print symbol.ident, symbol.base_type.name, symbol.type
@@ -274,10 +281,19 @@ class SourceScanner(object):
defines = ['__GI_SCANNER__']
undefs = []
- cpp_args = os.environ.get('CC', 'cc').split()
+ cpp_args = os.environ.get('CC', 'cc').split() # support CC="ccache gcc"
+ if 'cl' in cpp_args:
+ # The Microsoft compiler/preprocessor (cl) does not accept
+ # source input from stdin (the '-' flag), so we need
+ # some help from gcc from MinGW/Cygwin or so.
+ # Note that the generated dumper program is
+ # still built and linked by Visual C++.
+ cpp_args = ['gcc']
+ cpp_args += os.environ.get('CPPFLAGS', '').split()
+ cpp_args += os.environ.get('CFLAGS', '').split()
cpp_args += ['-E', '-C', '-I.', '-']
-
cpp_args += self._cpp_options
+
proc = subprocess.Popen(cpp_args,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
@@ -289,12 +305,11 @@ class SourceScanner(object):
for undef in undefs:
proc.stdin.write('#undef %s\n' % (undef, ))
for filename in filenames:
- filename = os.path.abspath(filename)
proc.stdin.write('#include <%s>\n' % (filename, ))
proc.stdin.close()
- tmp = tempfile.mktemp()
- fp = open(tmp, 'w+')
+ tmp_fd, tmp_name = tempfile.mkstemp()
+ fp = os.fdopen(tmp_fd, 'w+b')
while True:
data = proc.stdout.read(4096)
if data is None:
@@ -311,4 +326,4 @@ class SourceScanner(object):
self._scanner.parse_file(fp.fileno())
fp.close()
- os.unlink(tmp)
+ os.unlink(tmp_name)