~martin-decky/helenos/rcu

188 by Martin Decky
remove Stanse-specific constructs from makefiles
1
#!/usr/bin/env python
2
#
3
# Copyright (c) 2010 Martin Decky
4
# All rights reserved.
5
#
6
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions
8
# are met:
9
#
10
# - Redistributions of source code must retain the above copyright
11
#   notice, this list of conditions and the following disclaimer.
12
# - Redistributions in binary form must reproduce the above copyright
13
#   notice, this list of conditions and the following disclaimer in the
14
#   documentation and/or other materials provided with the distribution.
15
# - The name of the author may not be used to endorse or promote products
16
#   derived from this software without specific prior written permission.
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
29
"""
30
Wrapper for Stanse static checker
31
"""
32
33
import sys
34
import os
35
import subprocess
190 by U-ALPHA\Administrator
move checker tools one directory up
36
import jobfile
188 by Martin Decky
remove Stanse-specific constructs from makefiles
37
38
jobs = [
39
	"kernel/kernel.job",
40
	"uspace/srv/clip/clip.job"
41
]
42
43
def usage(prname):
44
	"Print usage syntax"
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
45
	print(prname + " <ROOT>")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
46
47
def stanse(root, job):
48
	"Run Stanse on a jobfile"
49
	
50
	# Convert generic jobfile to Stanse-specific jobfile format
51
	
52
	inname = os.path.join(root, job)
53
	outname = os.path.join(root, "_%s" % os.path.basename(job))
54
	
55
	if (not os.path.isfile(inname)):
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
56
		print("Unable to open %s" % inname)
57
		print("Did you run \"make precheck\" on the source tree?")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
58
		return False
59
	
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
60
	inf = open(inname, "r")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
61
	records = inf.read().splitlines()
62
	inf.close()
63
	
64
	output = []
65
	for record in records:
190 by U-ALPHA\Administrator
move checker tools one directory up
66
		arg = jobfile.parse_arg(record)
188 by Martin Decky
remove Stanse-specific constructs from makefiles
67
		if (not arg):
68
			return False
69
		
70
		if (len(arg) < 6):
690 by Jiri Svoboda
Enough is enough (i.e. fix the spelling).
71
			print("Not enough jobfile record arguments")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
72
			return False
73
		
74
		srcfname = arg[0]
75
		tgtfname = arg[1]
306 by Martin Decky
slightly better code
76
		tool = arg[2]
77
		category = arg[3]
188 by Martin Decky
remove Stanse-specific constructs from makefiles
78
		base = arg[4]
79
		options = arg[5]
80
		
81
		srcfqname = os.path.join(base, srcfname)
82
		if (not os.path.isfile(srcfqname)):
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
83
			print("Source %s not found" % srcfqname)
188 by Martin Decky
remove Stanse-specific constructs from makefiles
84
			return False
85
		
86
		# Only C files are interesting for us
306 by Martin Decky
slightly better code
87
		if (tool != "cc"):
188 by Martin Decky
remove Stanse-specific constructs from makefiles
88
			continue
89
		
90
		output.append([srcfname, tgtfname, base, options])
91
	
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
92
	outf = open(outname, "w")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
93
	for record in output:
94
		outf.write("{%s},{%s},{%s},{%s}\n" % (record[0], record[1], record[2], record[3]))
95
	outf.close()
96
	
97
	# Run Stanse
98
	
99
	retval = subprocess.Popen(['stanse', '--checker', 'ReachabilityChecker', '--jobfile', outname]).wait()
100
	
101
	# Cleanup
102
	
103
	os.remove(outname)
104
	for record in output:
105
		tmpfile = os.path.join(record[2], "%s.preproc" % record[1])
106
		if (os.path.isfile(tmpfile)):
107
			os.remove(tmpfile)
108
	
109
	if (retval == 0):
110
		return True
111
	
112
	return False
113
114
def main():
115
	if (len(sys.argv) < 2):
116
		usage(sys.argv[0])
117
		return
118
	
119
	rootdir = os.path.abspath(sys.argv[1])
120
	config = os.path.join(rootdir, "HelenOS.config")
121
	
122
	if (not os.path.isfile(config)):
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
123
		print("%s not found." % config)
124
		print("Please specify the path to HelenOS build tree root as the first argument.")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
125
		return
126
	
127
	for job in jobs:
128
		if (not stanse(rootdir, job)):
129
			print
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
130
			print("Failed job: %s" % job)
188 by Martin Decky
remove Stanse-specific constructs from makefiles
131
			return
132
	
133
	print
686 by Vojtech Horky
update scripts for compatibility with Python 3 (thx Vojtech Horky and Martin Sucha)
134
	print("All jobs passed")
188 by Martin Decky
remove Stanse-specific constructs from makefiles
135
136
if __name__ == '__main__':
137
	main()