dumber/kernel/build-kernel.py

214 lines
No EOL
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
import os
from statistics import median
import time
import sys
from datetime import datetime
from shutil import copytree
from shutil import rmtree
import paramiko
from getpass import getpass
# Parameters to configure
TEMPORARY_DIRECTORY = '~/tmp/rpi-kernel'
BUILD_DIRECTORY = '/rt-kernel'
GET_SOURCES_CMDS = ['git clone https://github.com/raspberrypi/linux.git',
'git clone https://github.com/raspberrypi/tools.git --depth 3',
'wget http://xenomai.org/downloads/xenomai/stable/xenomai-3.0.7.tar.bz2',
'tar jxf xenomai-3.0.7.tar.bz2',
'cp %s/ipipe-core-4.14.37-rpi.patch .',
'cp %s/config-4.14.37-xenomai .']
CONFIGURE_CMDS = ['cd ./linux',
'git reset --hard 29653ef5475124316b9284adb6cbfc97e9cae48f',
'cd ..',
'xenomai-3.0.7/scripts/prepare-kernel.sh --linux=linux/ --arch=arm --ipipe=ipipe-core-4.14.37-rpi.patch --verbose',
'cp config-4.14.37-xenomai ./linux/.config']
BUILD_CMDS = ['cd ./linux',
'make %s zImage',
'make %s modules',
'make %s dtbs',
'make %s modules_install',
'make %s dtbs_install',
'mkdir $INSTALL_MOD_PATH/boot',
'cp ./arch/arm/boot/zImage $INSTALL_MOD_PATH/boot/$KERNEL.img',
'cd ..']
XENOMAI_BUILD_CMDS = ['cd xenomai-3.0.7',
'./scripts/bootstrap --with-core=cobalt disable-debug',
'mkdir ./build',
'cd ./build',
'../configure CFLAGS="-march=armv7-a -mfpu=vfp3" LDFLAGS="-mtune=cortex-a53" --build=i686-pc-linux-gnu --host=arm-linux-gnueabihf --with-core=cobalt --enable-smp CC=${CROSS_COMPILE}gcc LD=${CROSS_COMPILE}ld',
'make -j4 install'
]
PATH_TO_IMAGE = '/media/dimercur'
#
# Nothing to configure or modify under this line
#
def getSources(tmp_dir, script_dir, sourcesCmd):
for cmd in sourcesCmd:
if "%s" in cmd:
os.system (cmd % script_dir)
else:
os.system (cmd)
def configureKernel(tmp_dir, build_dir, configureCmd):
for cmd in configureCmd:
if 'cd ' in cmd:
os.chdir(cmd.split()[1])
else:
os.system (cmd)
def buildKernel(tmp_dir, build_dir, buildCmd, nb_threads=4):
# Set environment variables
os.environ["ARCH"] = "arm"
os.environ["CROSS_COMPILE"] = tmp_dir+"/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-"
os.environ["INSTALL_MOD_PATH"] = build_dir
os.environ["INSTALL_DTBS_PATH"] = build_dir
os.environ["KERNEL"] = "kernel7"
for cmd in buildCmd:
if 'cd ' in cmd:
os.chdir(cmd.split()[1])
else:
if '%s' in cmd:
threadOption = '-j'+str(nb_threads)
print (cmd%threadOption)
os.system(cmd%threadOption)
else:
os.system (cmd)
os.chdir(build_dir)
os.system('tar czf ../xenomai-kernel.tgz *')
os.chdir(tmp_dir)
def installKernel(tmp_dir, build_dir, image_path):
os.chdir(tmp_dir)
print (".... Install *.dtb")
os.system('sudo cp %s/*.dtb %s/boot/'%(build_dir,image_path))
print (".... Install kernel")
os.system('sudo cp -rd %s/boot/* %s/boot/'%(build_dir,image_path))
print (".... Install libraries (modules)")
os.system('sudo cp -rd %s/lib/* %s/rootfs/lib/'%(build_dir,image_path))
print (".... Install overlays")
os.system('sudo cp -d %s/overlays/* %s/boot/overlays/'%(build_dir,image_path))
print (".... Install bcm* files")
os.system('sudo cp -d %s/bcm** %s/boot/'%(build_dir,image_path))
print (".... Update config.txt file")
file = open("%s/boot/config.txt"%image_path, "a") # append mode
file.write("kernel=${zImage name}\ndevice_tree=bcm2710-rpi-3-b.dtb\n")
file.close()
print (".... Update cmdline.txt file")
file = open("%s/boot/cmdline.txt"%image_path, "a") # append mode
file.write(" dwc_otg.fiq_enable=0 dwc_otg.fiq_fsm_enable=0 dwc_otg.nak_holdoff=0")
file.close()
def buildXenomai(tmp_dir, build_dir, buildCmd):
os.chdir(tmp_dir+"/xenomai-3.0.7")
#for cmd in buildCmd:
# if 'cd ' in cmd:
# os.chdir(cmd.split()[1])
# else:
# os.system (cmd)
# Set environment variables
os.environ["ARCH"] = "arm"
os.environ["CROSS_COMPILE"] = tmp_dir+"/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-"
os.environ["INSTALL_MOD_PATH"] = build_dir
os.environ["INSTALL_DTBS_PATH"] = build_dir
os.environ["KERNEL"] = "kernel7"
print (".... Bootstrap")
os.system("./scripts/bootstrap --with-core=cobalt disable-debug")
print (".... Configure")
os.system ("mkdir ./build")
os.chdir("./build")
os.system('../configure CFLAGS="-march=armv7-a -mfpu=vfp3" LDFLAGS="-mtune=cortex-a53" --build=i686-pc-linux-gnu --host=arm-linux-gnueabihf --with-core=cobalt --enable-smp CC=${CROSS_COMPILE}gcc LD=${CROSS_COMPILE}ld')
print (".... Building")
os.system('make -j4 install DESTDIR=${PWD}/target')
def installXenomai(tmp_dir, build_dir, image_path ):
os.chdir(tmp_dir+"/xenomai-3.0.7/build/target")
os.system('sudo cp -a dev/* %s/rootfs/dev/'%image_path)
os.system('sudo cp -a usr/* %s/rootfs/usr/'%image_path)
def main():
# prepare build environment
temp_dir = os.path.expanduser (TEMPORARY_DIRECTORY)
build_dir = temp_dir + BUILD_DIRECTORY
script_dir=""
for arg in sys.argv:
if os.path.basename(__file__) in arg:
script_dir = os.path.dirname(arg)
break
if script_dir == "":
print ("Can't find directory of script (%s). Exit"%os.path.basename(__file__))
return 2
print ("Temp directory : " + temp_dir)
print ("Build directory : " + build_dir)
print ("Script directory : " + script_dir)
print()
if not os.path.exists(temp_dir):
print ('Create temp directory "%s"'%temp_dir)
os.makedirs(build_dir)
else:
val=input('Directory "%s" already exists. Ok to remove all contents ? [Y/n/c] '%temp_dir)
if val=='n' or val=='N':
return 1
elif val=='c' or val=='C':
pass
else:
print ('Purge temp directory "%s"'%temp_dir)
rmtree(temp_dir, ignore_errors=True)
os.makedirs(build_dir)
currentdir = os.getcwd()
os.chdir(temp_dir)
print ("Retrieve sources")
getSources(temp_dir,script_dir,GET_SOURCES_CMDS)
print ("\nConfigure kernel")
configureKernel(temp_dir, build_dir, CONFIGURE_CMDS)
print ("\nBuild kernel")
buildKernel(temp_dir,build_dir,BUILD_CMDS,nb_threads=4)
print ('\nBuild Xenomai libraries')
buildXenomai(temp_dir, build_dir, [])
print ('\nInstalling kernel')
installKernel(temp_dir, build_dir, PATH_TO_IMAGE)
print ('\nInstall Xenomai libraries')
installXenomai(temp_dir, build_dir, PATH_TO_IMAGE)
os.chdir(currentdir)
if __name__ == '__main__':
val=main()
if val ==None:
val =0
print ("\nBye bye")
exit(val)