140 lines
5.2 KiB
Python
140 lines
5.2 KiB
Python
# TODO: need a function to get the newest config file older than us from
|
|
# the repo.
|
|
|
|
import shutil, os
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.common_lib import error, kernel_versions
|
|
|
|
def apply_overrides(orig_file, changes_file, output_file):
|
|
override = dict()
|
|
|
|
# First suck all the changes into a dictionary.
|
|
input = file(changes_file, 'r')
|
|
for line in input.readlines():
|
|
if line.startswith('CONFIG_'):
|
|
key = line.split('=')[0]
|
|
override[key] = line;
|
|
elif line.startswith('# CONFIG_'):
|
|
key = line.split(' ')[1]
|
|
override[key] = line;
|
|
input.close()
|
|
|
|
# Now go through the input file, overriding lines where need be
|
|
input = file(orig_file, 'r')
|
|
output = file(output_file, 'w')
|
|
for line in input.readlines():
|
|
if line.startswith('CONFIG_'):
|
|
key = line.split('=')[0]
|
|
elif line.startswith('# CONFIG_'):
|
|
key = line.split(' ')[1]
|
|
else:
|
|
key = None
|
|
if key and key in override:
|
|
output.write(override[key])
|
|
else:
|
|
output.write(line)
|
|
input.close()
|
|
output.close()
|
|
|
|
|
|
def diff_configs(old, new):
|
|
utils.system('diff -u %s %s > %s' % (old, new, new + '.diff'),
|
|
ignore_status=True)
|
|
|
|
|
|
|
|
def modules_needed(config):
|
|
return (utils.grep('CONFIG_MODULES=y', config) and utils.grep('=m', config))
|
|
|
|
|
|
def config_by_name(name, set):
|
|
version = kernel_versions.version_choose_config(name, set[1:])
|
|
if version:
|
|
return set[0] + version
|
|
return None
|
|
|
|
|
|
class kernel_config(object):
|
|
# Build directory must be ready before init'ing config.
|
|
#
|
|
# Stages:
|
|
# 1. Get original config file
|
|
# 2. Apply overrides
|
|
# 3. Do 'make oldconfig' to update it to current source code
|
|
# (gets done implicitly during the process)
|
|
#
|
|
# You may specifiy the a defconfig within the tree to build,
|
|
# or a custom config file you want, or None, to get machine's
|
|
# default config file from the repo.
|
|
|
|
build_dir = '' # the directory we're building in
|
|
config_dir = '' # local repository for config_file data
|
|
|
|
build_config = '' # the config file in the build directory
|
|
orig_config = '' # the original config file
|
|
over_config = '' # config file + overrides
|
|
|
|
|
|
def __init__(self, job, build_dir, config_dir, orig_file,
|
|
overrides, defconfig = False, name = None, make = None):
|
|
self.build_dir = build_dir
|
|
self.config_dir = config_dir
|
|
|
|
# 1. Get original config file
|
|
self.build_config = build_dir + '/.config'
|
|
if (orig_file == '' and not defconfig and not make): # use user default
|
|
set = job.config_get("kernel.default_config_set")
|
|
defconf = None
|
|
if set and name:
|
|
defconf = config_by_name(name, set)
|
|
if not defconf:
|
|
defconf = job.config_get("kernel.default_config")
|
|
if defconf:
|
|
orig_file = defconf
|
|
if (orig_file == '' and not make and defconfig): # use defconfig
|
|
make = 'defconfig'
|
|
if (orig_file == '' and make): # use the config command
|
|
print "kernel_config: using " + make + " to configure kernel"
|
|
os.chdir(build_dir)
|
|
make_return = utils.system('make %s > /dev/null' % make)
|
|
self.config_record(make)
|
|
if (make_return):
|
|
raise error.TestError('make % failed' % make)
|
|
else:
|
|
print "kernel_config: using " + orig_file + \
|
|
" to configure kernel"
|
|
self.orig_config = config_dir + '/config.orig'
|
|
utils.get_file(orig_file, self.orig_config)
|
|
self.update_config(self.orig_config, self.orig_config+'.new')
|
|
diff_configs(self.orig_config, self.orig_config+'.new')
|
|
|
|
|
|
# 2. Apply overrides
|
|
if overrides:
|
|
print "kernel_config: using " + overrides + \
|
|
" to re-configure kernel"
|
|
self.over_config = config_dir + '/config.over'
|
|
overrides_local = self.over_config + '.changes'
|
|
utils.get_file(overrides, overrides_local)
|
|
apply_overrides(self.build_config, overrides_local, self.over_config)
|
|
self.update_config(self.over_config, self.over_config+'.new')
|
|
diff_configs(self.over_config, self.over_config+'.new')
|
|
else:
|
|
self.over_config = self.orig_config
|
|
|
|
|
|
def update_config(self, old_config, new_config = 'None'):
|
|
os.chdir(self.build_dir)
|
|
shutil.copyfile(old_config, self.build_config)
|
|
utils.system('yes "" | make oldconfig > /dev/null')
|
|
if new_config:
|
|
shutil.copyfile(self.build_config, new_config)
|
|
|
|
def config_record(self, name):
|
|
#Copy the current .config file to the config.<name>[.<n>]
|
|
i = 1
|
|
to = self.config_dir + '/config.%s' % name
|
|
while os.path.exists(to):
|
|
i += 1
|
|
to = self.config_dir + '/config.%s.%d' % (name,i)
|
|
shutil.copyfile(self.build_dir + '/.config', to)
|