DebianLinux交互式内核编译脚本


DebianLinux交互式内核编译脚本
 
001
#!/usr/bin/env python3
002
# -*- coding: UTF-8 -*-
003
"""
004
An interactive script for building linux kernel automatically
005
"""
006
__author__ = 'M@llon'
007
__version__ = ''
008
 
009
import os
010
import re
011
import shutil
012
import time
013
 
014
 
015
def test(v):
016
    test.result = v
017
    return v
018
 
019
 
020
if __name__ == '__main__':
021
    os.chdir(os.path.dirname(__file__))
022
 
023
    source_list = list()
024
 
025
    for entry_name in sorted(os.listdir()):
026
        if os.path.isfile(entry_name) and test(re.match('^(linux-(\d+\.\d+\.\d+))\.tar\.\w+$', entry_name)):
027
            m = test.result
028
            source_list.append({
029
                'file': entry_name,
030
                'dir': m.group(1),
031
                'version': m.group(2)
032
            })
033
 
034
    if not len(source_list):
035
        print('No source archive found.')
036
        exit(-1)
037
 
038
    index_list = list(range(0, len(source_list)))
039
 
040
    print('List of available source archives:')
041
    for i in index_list:
042
        print('    %d - %s' % (i, source_list[i]['file']))
043
 
044
    prompt = 'Choose one %s: ' % str(index_list)
045
    selected_index = None
046
    while True:
047
        try:
048
            selected_index = int(input(prompt))
049
            if selected_index in index_list:
050
                break
051
        except ValueError:
052
            pass
053
 
054
    selected_source = source_list[selected_index]
055
 
056
    extrace_package = None
057
    if os.path.exists(selected_source['dir']):
058
        if input('Directory "%s" already exists, remove and re-extract [y/N]? ' % selected_source['dir']).lower() == 'y':
059
            print('Removing directory "%s" ...' % selected_source['dir'])
060
            shutil.rmtree(selected_source['dir'])
061
            extrace_package = True
062
        else:
063
            extrace_package = False
064
    else:
065
        extrace_package = True
066
         
067
    if extrace_package:
068
        print('Extracting "%s" ...' % selected_source['file'])
069
        os.system('tar -axf %s' % selected_source['file'])
070
 
071
    os.chdir(selected_source['dir'])
072
 
073
    create_config = None
074
    if os.path.exists('.config'):
075
        if input('File ".config" already exists, re-create it [y/N]? ').lower() == 'y':
076
            os.remove('.config')
077
            create_config = True
078
        else:
079
            create_config = False
080
    else:
081
        create_config = True
082
     
083
    if create_config:
084
        print('Create configuration:')
085
        print('    0 - minimal config by detecting only loaded module on current system (make localmodconfig)')
086
        print('    1 - copy config from current system, usualy from "/boot/"')
087
        print('    2 - default config from source distribution (make defconfig)')
088
         
089
        create_method = None
090
        while True:
091
            create_method = input('Choose one [0, 1, 2]: ')
092
            if create_method in ('0', '1', '2'):
093
                break
094
        if create_method == '0':
095
            os.system('make localmodconfig')
096
        elif create_method == '1':
097
            uname = os.popen('uname -r').read().split()[0]
098
            shutil.copyfile('/boot/config-%s' % uname, './.config')
099
        elif create_method == '2':
100
            os.system('make defconfig')
101
 
102
    print('Edit configuration:')
103
    print('    0 - menuconfig (console)')
104
    print('    1 - gconfig (gtk)')
105
    print('    2 - xconfig (qt)')
106
 
107
    edit_method = None
108
    while True:
109
        edit_method = input('Choose one [0, 1, 2]: ')
110
        if edit_method in ('0', '1', '2'):
111
            break
112
    if edit_method == '0':
113
        os.system('make menuconfig')
114
    elif edit_method == '1':
115
        os.system('make gconfig')
116
    elif edit_method == '2':
117
        os.system('make xconfig')
118
 
119
    input('Press any key to start building, Ctrl-C to exit ...')
120
 
121
    start_time = time.time()
122
     
123
    os.system('make-kpkg clean')
124
    os.system('fakeroot make-kpkg -j5 --initrd --revision=%s --append-to-version=-amd64 kernel_image kernel_headers' % selected_source['version'])
125
 
126
    os.chdir('..')
127
     
128
    end_time = time.time()
129
     
130
    print('Time used: %.1f minutes' % ((end_time - start_time) / 60,))
 

相关内容

    暂无相关文章