+#!/usr/bin/env python3
import os
import sys
import subprocess
+import shutil
import utils
+import database
from conf import conf
-from exceptions import MissingFile
-
-def kconfig_parser():
- "Execute kconfig_parser in linux_sources directory and parsed output is placed to build_folder."
- env = dict(os.environ)
- env['SRCARCH'] = conf.SRCARCH
- env['ARCH'] = conf.ARCH
- env['KERNELVERSION'] = 'KERNELVERSION' # hides error
- wd = os.getcwd()
- os.chdir(conf.linux_sources)
- if conf.kconfig_parser_output:
- subprocess.call([conf.kconfig_parser, conf.linux_kconfig_head, conf.build_folder, "-v", "-v"], env=env)
- else:
- subprocess.call([conf.kconfig_parser, conf.linux_kconfig_head, conf.build_folder], env=env)
+from conf import sf
+import exceptions
+import configurations
+
+def all():
+ try:
+ utils.dirtycheck()
+ except exceptions.DirtyRepository as e:
+ print("Warning: " + str(e))
+ gen_fixed()
+ checkmeasure()
+ database.database() # check if database is initialized
+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_requred():
- "Generates required depenpency from required file."
- utils.build_symbol_map()
- srmap = {value:key for key, value in utils.smap.items()}
-
- if not os.path.isfile(conf.required):
- raise MissingFile(conf.required, None)
+def gen_fixed():
+ "Generates fixed depenpency from dot_config file."
+ print('Generating required configuration...')
- try:
- os.remove(conf.required_file)
- except OSError:
- pass
+ if not os.path.isfile(sf(conf.dot_config)):
+ raise exceptions.MissingFile(sf(conf.dot_config),
+ 'Generate fixed configuration. Use make dot_config.')
- with open(conf.required_file, 'w') as fout:
- with open(conf.required, 'r') as f:
+ 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:
- for word in line.rstrip().split():
- if word[0] == '-':
- fout.write('-')
- word = word[1:]
- fout.write(srmap[word] + " ")
- fout.write("\n")
+ 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()