summaryrefslogtreecommitdiff
path: root/usr/src/tools/onbld/Checks/Mapfile.py
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/tools/onbld/Checks/Mapfile.py')
-rw-r--r--usr/src/tools/onbld/Checks/Mapfile.py55
1 files changed, 50 insertions, 5 deletions
diff --git a/usr/src/tools/onbld/Checks/Mapfile.py b/usr/src/tools/onbld/Checks/Mapfile.py
index a215e674bf..2a8cb74aed 100644
--- a/usr/src/tools/onbld/Checks/Mapfile.py
+++ b/usr/src/tools/onbld/Checks/Mapfile.py
@@ -21,8 +21,7 @@
#
#
-# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
@@ -39,10 +38,56 @@ You should not be making modifications here until you've read the most current
copy of that file. If you need help, contact a gatekeeper for guidance.
'''
-import sys, CmtBlk
+import re, sys, CmtBlk
MAPFILE = MAPFILE.splitlines()[1:] # Don't include initial \n
def mapfilechk(fh, filename=None, verbose=False, output=sys.stderr):
- return CmtBlk.cmtblkchk(fh, 'MAPFILE', MAPFILE, filename=filename,
- verbose=verbose, output=output)
+ if filename:
+ name = filename
+ else:
+ name = fh.name
+
+ # Verify that the mapfile is using version 2 syntax. Read and discard
+ # comment and empty lines until the first non-empty line is seen.
+ # This line must be '$mapfile_version 2'.
+ CmtRE = re.compile(r'#.*$')
+ LeadingWSRE = re.compile(r'^\s+')
+ VersionRE = re.compile(r'^\$mapfile_version\s+2\s*$')
+ for line in fh:
+ line = CmtRE.sub(r'', line)
+ line = LeadingWSRE.sub(r'', line)
+ if line == '' :
+ continue
+
+ # First non=empty line must be version declaration
+ if not VersionRE.match(line):
+ output.write("Warning: mapfile version 2 syntax"
+ " expected in file %s\n" % name)
+ return 1
+
+ # We have verified version 2 syntax. Exit the loop
+ break
+
+
+ # If the mapfile contains a SYMBOL_VERSION directive, the file
+ # must include a copy of the MAPFILE warning comment above. The
+ # comment is specific to symbol versioning, so we don't harrass
+ # the authors of mapfiles used exclusively for other purposes.
+ SymVerRE = re.compile(r'^\s*symbol_version\s+', re.IGNORECASE)
+ for line in fh:
+ # If we find a SYMBOL_VERSION, then verify that the comment
+ # is present. The comment usually precedes the mapfile_version
+ # comment and any mapfile directives (including SYMBOL_VERSION),
+ # so we need to rewind the file. This is more efficient than it
+ # might seem: All of these items are near the top of the file,
+ # so not not many lines are read, and file contents are
+ # bufferred.
+ if SymVerRE.match(line):
+ fh.seek(0);
+ return CmtBlk.cmtblkchk(fh, 'MAPFILE', MAPFILE,
+ filename=filename, verbose=verbose,
+ output=output)
+
+ # Comment is not required.
+ return 0