# 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)