#! /usr/bin/python
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Check that link-editor mapfiles contain a valid mapfile header block
#
MAPFILE = '''
WARNING: STOP NOW. DO NOT MODIFY THIS FILE.
Object versioning must comply with the rules detailed in
usr/src/lib/README.mapfiles
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 re, sys, CmtBlk
MAPFILE = MAPFILE.splitlines()[1:] # Don't include initial \n
def mapfilechk(fh, filename=None, verbose=False, output=sys.stderr):
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