summaryrefslogtreecommitdiff
path: root/usr/src/tools/onbld/Checks/Mapfile.py
blob: 2a8cb74aed91dda774579f765931ceb7f6adcd1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#! /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