Bare container type is converted to Examples container type.

Examples container type is designed to keep applications using codezero
userspace libraries, which is aiming to help newcomers who would like to
develop programs on top of the l4 microkernel.

Now bare bone application is one of the examples. In the near future, lots of
new programs will be introduced to show the various aspects of codezero
eco-system.
This commit is contained in:
Bora Sahin
2009-10-28 14:11:43 +02:00
parent b7e575817d
commit 050f537884
22 changed files with 162 additions and 66 deletions

View File

View File

@@ -0,0 +1,146 @@
#! /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 *
from config.lib import *
class ExamplesContGenerator:
def __init__(self):
self.CONT_SRC_DIR = '' # Set when container is selected
self.EXAMPLES_SRC_BASEDIR = join(PROJROOT, 'conts')
self.EXAMPLES_PROJ_SRC_DIR = join(PROJROOT, 'conts/examples')
self.main_builder_name = 'build.py'
self.main_configurator_name = 'configure.py'
self.mailing_list_url = 'http://lists.l4dev.org/mailman/listinfo/codezero-devel'
self.build_script_in = join(SCRIPTROOT, 'files/SConstruct.in')
self.build_readme_in = join(SCRIPTROOT, 'files/build.readme.in')
self.build_desc_in = join(SCRIPTROOT, 'files/container.desc.in')
self.linker_lds_in = join(SCRIPTROOT, 'files/linker.lds.in')
self.container_h_in = join(SCRIPTROOT, 'files/container.h.in')
self.build_script_name = 'SConstruct'
self.build_readme_name = 'build.readme'
self.build_desc_name = '.container'
self.linker_lds_name = 'linker.lds'
self.container_h_name = 'container.h'
self.container_h_out = None
self.build_script_out = None
self.build_readme_out = None
self.build_desc_out = None
self.src_main_out = None
def create_examples_srctree(self, config, cont):
# First, create the base project directory and sources
str = 'example' + cont.example_id
shutil.copytree(join(self.EXAMPLES_PROJ_SRC_DIR, str), self.CONT_SRC_DIR)
def copy_examples_build_desc(self, config, cont):
id_header = '[Container ID]\n'
type_header = '\n[Container Type]\n'
name_header = '\n[Container Name]\n'
pager_lma_header = '\n[Container Pager LMA]\n'
pager_vma_header = '\n[Container Pager VMA]\n'
pager_virtmem_header = '\n[Container Virtmem Region %s]\n'
pager_physmem_header = '\n[Container Physmem Region %s]\n'
with open(self.build_desc_out, 'w+') as fout:
fout.write(id_header)
fout.write('\t' + str(cont.id) + '\n')
fout.write(type_header)
fout.write('\t' + cont.type + '\n')
fout.write(name_header)
fout.write('\t' + cont.name + '\n')
fout.write(pager_lma_header)
fout.write('\t' + conv_hex(cont.pager_lma) + '\n')
fout.write(pager_vma_header)
fout.write('\t' + conv_hex(cont.pager_vma) + '\n')
for ireg in range(cont.virt_regions):
fout.write(pager_virtmem_header % ireg)
fout.write('\t' + cont.virtmem["START"][ireg] + ' - ' + cont.virtmem["END"][ireg] + '\n')
for ireg in range(cont.phys_regions):
fout.write(pager_physmem_header % ireg)
fout.write('\t' + cont.physmem["START"][ireg] + ' - ' + cont.physmem["END"][ireg] + '\n')
def copy_examples_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_examples_container_h(self, config, cont):
with open(self.container_h_in) as fin:
str = fin.read()
with open(self.container_h_out, 'w+') as fout:
# Make any manipulations here
fout.write(str % (cont.name, cont.id, cont.id))
def create_examples_sources(self, config, cont):
self.create_examples_srctree(config, cont)
self.copy_examples_build_readme(config, cont)
self.copy_examples_build_desc(config, cont)
self.generate_linker_script(config, cont)
self.copy_examples_container_h(config, cont)
def update_configuration(self, config, cont):
self.copy_examples_build_desc(config, cont)
self.generate_linker_script(config, cont)
self.copy_examples_container_h(config, cont)
def check_create_examples_sources(self, config):
for cont in config.containers:
if cont.type == "examples":
# Determine container directory name.
self.CONT_SRC_DIR = join(self.EXAMPLES_SRC_BASEDIR, cont.dirname.lower())
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.linker_lds_out = join(join(self.CONT_SRC_DIR, 'include'), \
self.linker_lds_name)
self.container_h_out = join(join(self.CONT_SRC_DIR, 'include'), \
self.container_h_name)
if not os.path.exists(join(self.EXAMPLES_SRC_BASEDIR, cont.dirname)):
self.create_examples_sources(config, cont)
else:
# Don't create new sources but update configuration
self.update_configuration(config, cont)
def generate_linker_script(self, config, cont):
with open(self.linker_lds_in) as fin:
str = fin.read()
with open(self.linker_lds_out, 'w+') as fout:
fout.write(str % (conv_hex(cont.pager_vma), \
conv_hex(cont.pager_lma)))
def examples_container_generate(self, config):
self.check_create_examples_sources(config)
if __name__ == "__main__":
config = configuration_retrieve()
config.config_print()
examples_cont = ExamplesContGenerator()
examples_cont.examples_container_generate(config)

View File

View File

@@ -0,0 +1,112 @@
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
|-- include
| `-- linker.lds.example
|-- main.c
`-- src
|-- test.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.

View File

@@ -0,0 +1,8 @@
[Container Name]
[Container LMA]
[Container VMA]
[Container Type]

View File

@@ -0,0 +1,13 @@
/*
* Autogenerated definitions for this container.
*/
#ifndef __CONTAINER_H__
#define __CONTAINER_H__
#define __CONTAINER_NAME__ "%s"
#define __CONTAINER_ID__ %d
#define __CONTAINER__ "cont%d"
#endif /* __CONTAINER_H__ */

View File

@@ -0,0 +1,29 @@
/*
* Example working linker script for this container.
*
* Copyright (C) 2009 B Labs Ltd.
*/
vma_start = %s;
lma_start = %s;
offset = vma_start - lma_start;
ENTRY(_start)
SECTIONS
{
. = vma_start;
.text : AT (ADDR(.text) - offset) { *(.text.head) *(.text) }
.rodata : AT (ADDR(.rodata) - offset) { *(.rodata) }
.rodata1 : AT (ADDR(.rodata1) - offset) { *(.rodata1) }
. = ALIGN(4K);
.data : AT (ADDR(.data) - offset) { *(.data) }
.bss : AT (ADDR(.bss) - offset)
{
*(.bss)
. += 0x1000;
. = ALIGN(8);
__stack = .;
}
}