mirror of
https://github.com/drasko/codezero.git
synced 2026-07-22 15:15:24 +02:00
Added functionality to create a bare container
This commit is contained in:
@@ -187,7 +187,7 @@ choices container1_type
|
|||||||
CONFIG_CONT1_TYPE_LINUX
|
CONFIG_CONT1_TYPE_LINUX
|
||||||
CONFIG_CONT1_TYPE_BARE
|
CONFIG_CONT1_TYPE_BARE
|
||||||
CONFIG_CONT1_TYPE_C0_POSIX
|
CONFIG_CONT1_TYPE_C0_POSIX
|
||||||
default CONFIG_CONT1_TYPE_LINUX
|
default CONFIG_CONT1_TYPE_BARE
|
||||||
|
|
||||||
menu cont0_menu
|
menu cont0_menu
|
||||||
container0_type
|
container0_type
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from projpaths import *
|
|||||||
|
|
||||||
class Container:
|
class Container:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.dirname = None
|
||||||
self.name = None
|
self.name = None
|
||||||
self.type = None
|
self.type = None
|
||||||
self.id = None
|
self.id = None
|
||||||
@@ -67,6 +68,10 @@ class configuration:
|
|||||||
self.containers[id].lma_start = val
|
self.containers[id].lma_start = val
|
||||||
elif param[:len("PHYS_END")] == "PHYS_END":
|
elif param[:len("PHYS_END")] == "PHYS_END":
|
||||||
self.containers[id].lma_end = val
|
self.containers[id].lma_end = val
|
||||||
|
elif param[:len("OPT_DIRNAME")] == "OPT_DIRNAME":
|
||||||
|
dirname = val[1:-1].lower()
|
||||||
|
self.containers[id].dirname = dirname
|
||||||
|
self.containers[id].name = dirname
|
||||||
else:
|
else:
|
||||||
param1, param2 = param.split("_", 1)
|
param1, param2 = param.split("_", 1)
|
||||||
if param1 == "TYPE":
|
if param1 == "TYPE":
|
||||||
|
|||||||
23
configure.py
23
configure.py
@@ -5,20 +5,21 @@ import os, sys, shelve, shutil
|
|||||||
from os.path import join
|
from os.path import join
|
||||||
from config.projpaths import *
|
from config.projpaths import *
|
||||||
from config.configuration import *
|
from config.configuration import *
|
||||||
|
from scripts.bare.bare_generator import *
|
||||||
|
|
||||||
|
|
||||||
def cml2_header_to_symbols(cml2_header, symbols):
|
def cml2_header_to_symbols(cml2_header, config):
|
||||||
with file(cml2_header) as header_file:
|
with file(cml2_header) as header_file:
|
||||||
for line in header_file:
|
for line in header_file:
|
||||||
pair = symbols.line_to_name_value(line)
|
pair = config.line_to_name_value(line)
|
||||||
if pair is not None:
|
if pair is not None:
|
||||||
name, value = pair
|
name, value = pair
|
||||||
symbols.get_all(name, value)
|
config.get_all(name, value)
|
||||||
symbols.get_arch(name, value)
|
config.get_arch(name, value)
|
||||||
symbols.get_subarch(name, value)
|
config.get_subarch(name, value)
|
||||||
symbols.get_platform(name, value)
|
config.get_platform(name, value)
|
||||||
symbols.get_ncontainers(name, value)
|
config.get_ncontainers(name, value)
|
||||||
symbols.get_container_parameters(name, value)
|
config.get_container_parameters(name, value)
|
||||||
|
|
||||||
def cml2_update_config_h(config_h_path, config):
|
def cml2_update_config_h(config_h_path, config):
|
||||||
with open(config_h_path, "a") as config_h:
|
with open(config_h_path, "a") as config_h:
|
||||||
@@ -43,7 +44,13 @@ def configure_kernel(cml_file):
|
|||||||
cml2_configure(cml_file)
|
cml2_configure(cml_file)
|
||||||
cml2_header_to_symbols(CML2_CONFIG_H, config)
|
cml2_header_to_symbols(CML2_CONFIG_H, config)
|
||||||
cml2_update_config_h(CONFIG_H, config)
|
cml2_update_config_h(CONFIG_H, config)
|
||||||
|
|
||||||
configuration_save(config)
|
configuration_save(config)
|
||||||
|
|
||||||
|
# Generate bare container files if new ones defined
|
||||||
|
bare_cont_gen = BareContGenerator()
|
||||||
|
bare_cont_gen.bare_container_generate(config)
|
||||||
|
|
||||||
#config.config_print()
|
#config.config_print()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
0
scripts/bare/SConstruct.in
Normal file
0
scripts/bare/SConstruct.in
Normal file
0
scripts/bare/__init__.py
Normal file
0
scripts/bare/__init__.py
Normal file
103
scripts/bare/bare_generator.py
Normal file
103
scripts/bare/bare_generator.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
#! /usr/bin/env python2.6
|
||||||
|
# -*- mode: python; coding: utf-8; -*-
|
||||||
|
#
|
||||||
|
# Codezero -- Virtualization microkernel for embedded systems.
|
||||||
|
#
|
||||||
|
# Copyright © 2009 B Labs Ltd
|
||||||
|
#
|
||||||
|
import os, sys, shelve, glob
|
||||||
|
from os.path import join
|
||||||
|
|
||||||
|
PROJRELROOT = '../../'
|
||||||
|
|
||||||
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), PROJRELROOT)))
|
||||||
|
sys.path.append(os.path.abspath("../"))
|
||||||
|
|
||||||
|
SCRIPTROOT = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
from config.projpaths import *
|
||||||
|
from config.configuration import *
|
||||||
|
|
||||||
|
class BareContGenerator:
|
||||||
|
def __init__(self):
|
||||||
|
self.CONT_SRC_DIR = '' # Set when container is selected
|
||||||
|
self.BARE_SRC_BASEDIR = join(PROJROOT, 'conts')
|
||||||
|
|
||||||
|
self.build_script_in = join(SCRIPTROOT, 'SConstruct.in')
|
||||||
|
self.build_readme_in = join(SCRIPTROOT, 'build.readme.in')
|
||||||
|
self.build_desc_in = join(SCRIPTROOT, 'container.desc.in')
|
||||||
|
|
||||||
|
self.build_script_name = 'SConstruct'
|
||||||
|
self.build_readme_name = 'build.readme'
|
||||||
|
self.build_desc_name = 'container.description'
|
||||||
|
|
||||||
|
self.build_script_out = None
|
||||||
|
self.build_readme_out = None
|
||||||
|
self.build_desc_out = None
|
||||||
|
self.main_builder_name = 'build.py'
|
||||||
|
self.main_configurator_name = 'configure.py'
|
||||||
|
self.mailing_list_url = 'http://lists.l4dev.org/mailman/listinfo/codezero-devel'
|
||||||
|
|
||||||
|
def create_bare_dirtree(self, config, cont):
|
||||||
|
# First, create the container directory structure
|
||||||
|
os.mkdir(self.CONT_SRC_DIR)
|
||||||
|
os.mkdir(join(self.CONT_SRC_DIR, 'src'))
|
||||||
|
os.mkdir(join(self.CONT_SRC_DIR, 'include'))
|
||||||
|
|
||||||
|
def copy_bare_build_desc(self, config, cont):
|
||||||
|
with open(self.build_desc_in) as fin:
|
||||||
|
str = fin.read()
|
||||||
|
with open(self.build_desc_out, 'w+') as fout:
|
||||||
|
# Make any manipulations here
|
||||||
|
fout.write(str)
|
||||||
|
|
||||||
|
def copy_bare_build_readme(self, config, cont):
|
||||||
|
with open(self.build_readme_in) as fin:
|
||||||
|
str = fin.read()
|
||||||
|
with open(self.build_readme_out, 'w+') as fout:
|
||||||
|
# Make any manipulations here
|
||||||
|
fout.write(str % (self.mailing_list_url, \
|
||||||
|
cont.name, \
|
||||||
|
self.build_desc_name, \
|
||||||
|
self.main_builder_name, \
|
||||||
|
self.main_configurator_name, \
|
||||||
|
self.main_configurator_name))
|
||||||
|
|
||||||
|
def copy_bare_build_script(self, config, cont):
|
||||||
|
with open(self.build_script_in) as fin:
|
||||||
|
str = fin.read()
|
||||||
|
with open(self.build_script_out, 'w+') as fout:
|
||||||
|
# Make any manipulations here
|
||||||
|
fout.write(str)
|
||||||
|
|
||||||
|
def create_bare_sources(self, config, cont):
|
||||||
|
# Determine container directory name.
|
||||||
|
self.CONT_SRC_DIR = join(self.BARE_SRC_BASEDIR, cont.dirname.lower())
|
||||||
|
print "container source dir: " + self.CONT_SRC_DIR
|
||||||
|
|
||||||
|
self.build_script_out = join(self.CONT_SRC_DIR, self.build_script_name)
|
||||||
|
self.build_readme_out = join(self.CONT_SRC_DIR, self.build_readme_name)
|
||||||
|
self.build_desc_out = join(self.CONT_SRC_DIR, self.build_desc_name)
|
||||||
|
|
||||||
|
self.create_bare_dirtree(config, cont)
|
||||||
|
self.copy_bare_build_script(config, cont)
|
||||||
|
self.copy_bare_build_readme(config, cont)
|
||||||
|
self.copy_bare_build_desc(config, cont)
|
||||||
|
#copy_bare_sources(config, cont)
|
||||||
|
|
||||||
|
def check_create_bare_sources(self, config):
|
||||||
|
for cont in config.containers:
|
||||||
|
if cont.type == "bare":
|
||||||
|
print "Cont type: " + cont.type
|
||||||
|
if not os.path.exists(join(self.BARE_SRC_BASEDIR, cont.dirname)):
|
||||||
|
print "Creating new at " + join(self.BARE_SRC_BASEDIR, cont.dirname)
|
||||||
|
self.create_bare_sources(config, cont)
|
||||||
|
|
||||||
|
def bare_container_generate(self, config):
|
||||||
|
self.check_create_bare_sources(config)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
config = configuration_retrieve()
|
||||||
|
bare_cont = BareContGenerator()
|
||||||
|
bare_cont.bare_container_generate(config)
|
||||||
|
|
||||||
115
scripts/bare/build.readme.in
Normal file
115
scripts/bare/build.readme.in
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
Codezero Buildsystem For This Container
|
||||||
|
|
||||||
|
Autogenerated by the Build system
|
||||||
|
|
||||||
|
|
||||||
|
This is an autogenerated file that is meant to walk you through the build
|
||||||
|
process. It is meant to be the most simple to get on with, therefore if
|
||||||
|
you feel any complications, please reach us on our l4dev.org mailing list
|
||||||
|
on %s
|
||||||
|
|
||||||
|
You have created a new container called `%s'.
|
||||||
|
|
||||||
|
The parameters you have supplied are described in the "%s" file
|
||||||
|
placed at the top-level directory. Note, that this is only an informative
|
||||||
|
file for your reference, and it can be optionally removed.
|
||||||
|
|
||||||
|
|
||||||
|
1. Directory Structure:
|
||||||
|
|
||||||
|
1.1) Directory tree:
|
||||||
|
.
|
||||||
|
|-- SConstruct
|
||||||
|
|-- build.readme
|
||||||
|
|-- container.desc
|
||||||
|
|-- include
|
||||||
|
| `-- linker.lds.example
|
||||||
|
|-- main.c
|
||||||
|
`-- src
|
||||||
|
|-- test.c
|
||||||
|
|-- test1.c
|
||||||
|
|-- test2.c
|
||||||
|
`-- test3.c
|
||||||
|
|
||||||
|
In the above directory tree:
|
||||||
|
|
||||||
|
1.2) |-- SConstruct
|
||||||
|
|
||||||
|
This is the top-level build file, that will build your project in its current
|
||||||
|
state. You may freely reorganize directories, but must reflect changes in this
|
||||||
|
file. For more, please see the SCons build tool at http://www.scons.org/
|
||||||
|
|
||||||
|
The build system will search for this file, and execute it by the:
|
||||||
|
|
||||||
|
`scons'
|
||||||
|
|
||||||
|
command at the root of the directory. You may issue the same command manually
|
||||||
|
for building and testing your build. If you choose to use another build tool
|
||||||
|
such as make, you may freely replace scons, and the build system will search
|
||||||
|
and call your custom build command.
|
||||||
|
|
||||||
|
1.3) |--include
|
||||||
|
`--src
|
||||||
|
|
||||||
|
These are the directories that include your header files and sources. You may
|
||||||
|
freely change and reorganize these, but make sure to have a valid build file
|
||||||
|
that reflects those changes at the top-level directory.
|
||||||
|
|
||||||
|
1.4) |-- include
|
||||||
|
| `-- linker.lds.example
|
||||||
|
|
||||||
|
This is an example linker script for your project. Using this as your default
|
||||||
|
linker script is often useful, since it has been autogenerated to contain all
|
||||||
|
the parameters you need for the memory regions of your application defined at
|
||||||
|
configuration time. You may freely replace it, but make sure to edit the
|
||||||
|
top-level build script accordingly.
|
||||||
|
|
||||||
|
|
||||||
|
2. Build Process
|
||||||
|
|
||||||
|
2.1) Build overview
|
||||||
|
|
||||||
|
The complete Codezero system will be built from a top-level `%s' script by
|
||||||
|
that resides in the top-level directory of Codezero sources.
|
||||||
|
|
||||||
|
The Codezero system build script will build this container at a certain stage
|
||||||
|
during the build, by referring to build script file named such as `SConstruct'
|
||||||
|
or `Makefile' that resides in this container's top-level directory.
|
||||||
|
|
||||||
|
Once the executables are built, it will search for all files with a .elf
|
||||||
|
extension in any of the subdirectories, and recognize those as loadable
|
||||||
|
executables. There may be more than one of these files present after the build.
|
||||||
|
|
||||||
|
In the future this behaviour may change such that the loadable executable files
|
||||||
|
are also specified in the configuration.
|
||||||
|
|
||||||
|
Finally, executables of all containers will be picked up and built into the
|
||||||
|
final.elf file, which is a self-loading elf executable.
|
||||||
|
|
||||||
|
|
||||||
|
3. Reconfiguring this container
|
||||||
|
|
||||||
|
If you want to reconfigure the container with new parameters, you may do so by
|
||||||
|
executing the `%s' script at the top-level Codezero directory by:
|
||||||
|
|
||||||
|
'./%s'
|
||||||
|
|
||||||
|
This will populate only brand new container directories with new files. It will
|
||||||
|
update it's existing internal configuration for existing containers (such as
|
||||||
|
container memory regions) but it won't touch any files that exist under an
|
||||||
|
already-defined container.
|
||||||
|
|
||||||
|
If you want to start from scratch, specify a new directory name, if you want
|
||||||
|
to reconfigure existing container parameters, run this on an existing directory,
|
||||||
|
and it will only update its internal records for this container, but not touch
|
||||||
|
the directory.
|
||||||
|
|
||||||
|
|
||||||
|
4. Example source files
|
||||||
|
|
||||||
|
Example source files populated by the configuration contain valid examples
|
||||||
|
of how the generic libl4 userspace library can be used. Each test contains a
|
||||||
|
valid example from the available API, and may be modified, changed and removed
|
||||||
|
freely.
|
||||||
|
|
||||||
|
|
||||||
0
scripts/bare/container.desc.in
Normal file
0
scripts/bare/container.desc.in
Normal file
Reference in New Issue
Block a user