aboutsummaryrefslogtreecommitdiff
path: root/scripts/initialize.py
blob: 877aeba100c634d2bf3162acbe8f07fa1d47e4cf (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python3
import os
import sys
import subprocess
import shutil

import utils
import database
from conf import conf
from conf import sf
import exceptions
import configurations

def all():
	try:
		utils.dirtycheck()
	except exceptions.DirtyRepository as e:
		print("Warning: " + str(e))
	base()
	parse_kconfig()
	gen_fixed()
	checkmeasure()
	database.database() # check if database is initialized

def base():
	print('Initialize base...')
	try:
		os.mkdir(sf(conf.build_folder))
	except FileExistsError:
		pass
	try:
		os.mkdir(sf(conf.log_folder))
	except FileExistsError:
		pass

def parse_kconfig():
	"Execute parse_kconfig in linux_sources directory."
	if os.path.isfile(sf(conf.symbol_map_file)) and \
			os.path.isfile(sf(conf.rules_file)) and \
			os.path.isfile(sf(conf.variable_count_file)):
		print('Warning: parse_kconfig not executed. Files already exists.')
		return
	print('Executing parse_kconfig...')
	wd = os.getcwd()
	os.chdir(sf(conf.linux_sources))
	parse_kconfig_cmd = [sf(conf.parse_kconfig)]
	parse_kconfig_cmd += ['Kconfig', sf(conf.build_folder)]
	parse_kconfig_cmd += ['-v', '-v']
	utils.callsubprocess("parse_kconfig", parse_kconfig_cmd,
			conf.parse_kconfig_output, env=utils.get_kernel_env())
	os.chdir(wd)


def __gen_allconfig_fixed__():
	wd = os.getcwd()
	os.chdir(sf(conf.linux_sources))
	allconfig_cmd = [sf(conf.allconfig)]
	allconfig_cmd += ['Kconfig', sf(conf.dot_config), sf(conf.dot_measure_file)]
	allconfig_cmd += ['--inv']
	utils.callsubprocess("allconfig_fixed", allconfig_cmd, False,
			env = utils.get_kernel_env())
	os.chdir(wd)

def gen_fixed():
	"Generates fixed depenpency from dot_config file."
	print('Generating required configuration...')

	if not os.path.isfile(sf(conf.dot_config)):
		raise exceptions.MissingFile(sf(conf.dot_config),
				'Generate fixed configuration. Use make dot_config.')

	utils.build_symbol_map() # Ensure smap existence
	srmap = {value:key for key, value in utils.smap.items()} # swap dictionary

	shutil.copy(sf(conf.dot_config), sf(conf.dot_config_back_file))
	__gen_allconfig_fixed__()

	with open(sf(conf.dot_config), 'r') as f:
		with open(sf(conf.fixed_file), 'w') as ffix:
			for line in f:
				if (line[0] == '#') or (not '=' in line):
					continue
				indx = line.index('=')
				if (line[indx + 1] == 'y'):
					if line[7:indx] == "MODULES": # exception if modules set
						raise exceptions.ConfigurationError("Fixed kernel configuration must have MODULES disabled.")
					ffix.write(str(srmap[line[7:indx]]) + "\n")
				elif (line[indx + 1] == 'n' or line[indx + 1] == 'm'):
					ffix.write("-" + str(srmap[line[7:indx]]) + "\n")
	with open(sf(conf.dot_measure_file), 'r') as f:
		with open(sf(conf.measure_file), 'w') as fmes:
			for line in f:
				if (line[0] == '#') or (not '=' in line):
					continue
				indx = line.index('=')
				if line[7:indx] == "MODULES":
					raise exceptions.ConfigurationError("Can't measure configuraion option MODULES. Not supported.")
				fmes.write(str(srmap[line[7:indx]]) + "\n")

def checkmeasure():
	if os.path.isfile(sf(conf.measurechecked_file)):
		print("Checking if all configurations can be measured skiped.")
		print("  For new check remove file " + sf(conf.measurechecked_file))
		return
	print("Checking if all configurations can be measured...")
	utils.build_symbol_map()
	measure_list = set()
	with open(sf(conf.variable_count_file)) as f:
		var_num = f.readline().rstrip()
		conf_num = f.readline().rstrip()
	with open(sf(conf.measure_file), 'r') as fi:
		for ln in fi:
			measure_list.add(int(ln))
	for measure in measure_list:
		tfile1 = configurations.__buildtempcnf__(var_num, (sf(conf.rules_file),
			sf(conf.fixed_file)), [str(measure)])
		tfile2 = configurations.__buildtempcnf__(var_num, (sf(conf.rules_file),
			sf(conf.fixed_file)), [str(-1 * measure)])
		try:
			configurations.__exec_sat__(tfile1, [], conf_num)
		except exceptions.NoSolution:
			print("W: " + utils.smap[measure] + " won't be measured! Can't select.")
		try:
			configurations.__exec_sat__(tfile2, [], conf_num)
		except exceptions.NoSolution:
			print("W: " + utils.smap[measure] + " won't be measured! Can't unselect.")
	with open(sf(conf.measurechecked_file), 'w') as f:
		f.write("Remove this file if you wanna execute check if all configurations can be measured once again.\n")

#################################################################################

if __name__ == '__main__':
	all()