diff --git a/.gitignore b/.gitignore index 4fb5911..916f4b4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build .sconsign.dblite *.pyc config.log +crt0.o diff --git a/SConstruct b/SConstruct index c009bf7..863b62e 100644 --- a/SConstruct +++ b/SConstruct @@ -169,7 +169,7 @@ else : Alias('kernel', startAxf) -########## Build the tasks ######################## +########## Build the task libraries ######################## taskSupportLibraryEnvironment = baseEnvironment.Clone( CC = 'arm-none-linux-gnueabi-gcc', @@ -188,22 +188,51 @@ else : Depends(taskLibraries, taskSupportLibraryEnvironment['configFiles']) Alias ('tasklibs', taskLibraries) - + +########## Build the tasks ######################## + + def buildTask(programName, sources, environment, previousImage, extraCppPath=None): + e = environment.Clone() + e.Append(LINKFLAGS=['-Ttasks/' + programName + '/include/linker.lds']) + e.Append(LIBPATH=['#build/tasks/' + programName, '#build/lib/c/userspace/crt/sys-userspace/arch-arm']) + if extraCppPath: e.Append(CPPPATH=extraCppPath) + objects = e.StaticObject(sources) + Depends(objects, e['configFiles']) + program = e.Program(programName, objects + ['#' + e['crt0'][0].name]) + physicalBaseLinkerScript = Command('include/physical_base.lds', previousImage, 'tools/pyelf/readelf.py --first-free-page ' + previousImage[0].path + ' >> $TARGET') + Depends(program, [physicalBaseLinkerScript, e['crt0']]) + return program + tasksEnvironment = baseEnvironment.Clone( CC = 'arm-none-linux-gnueabi-gcc', CCFLAGS = ['-g', '-nostdlib', '-ffreestanding', '-std=gnu99', '-Wall', '-Werror'], LINKFLAGS = ['-nostdlib'], ASFLAGS = ['-D__ASSEMBLY__'], - LIBS = taskLibraries + ['gcc', libs['userspace']], + LIBS = [libs['userspace']] + taskLibraries + ['gcc', libs['userspace']], #### TODO: Why have the userspace C library twice? PROGSUFFIX = '.axf', CPPDEFINES = ['__USERSPACE__'], CPPPATH = ['#' + buildDirectory, '#' + buildDirectory + '/l4', '#' + includeDirectory, 'include', '#tasks/libl4/include', '#tasks/libmem', '#tasks/libposix/include'], - kernel = startAxf) + buildTask = buildTask) +#### +#### TODO: Why doe the linker require crt0.o to be in the current directory and named as such. Is it +#### because of the text in the linker script? +#### + + userspaceRuntime = Command(crts['userspace'][0].name, crts['userspace'][0], 'ln -s $SOURCE.path $TARGET') + + execfile('tasks/taskOrder.py') + imageOrderData = [(taskName, []) for taskName in taskOrder] + imageOrderData[0][1].append(startAxf) tasks = [] - for task in [f.name for f in Glob('tasks/*') if f.name not in taskLibraryNames + ['bootdesc']]: - tasks.append(SConscript('tasks/' + task + '/SConscript', variant_dir = buildDirectory + '/tasks/' + task, duplicate = 0, exports = {'environment': tasksEnvironment})) - + for i in range(len(imageOrderData)): + taskName = imageOrderData[i][0] + dependency = imageOrderData[i][1] + program = SConscript('tasks/' + taskName + '/SConscript', variant_dir = buildDirectory + '/tasks/' + taskName, duplicate = 0, exports = {'environment': tasksEnvironment, 'previousImage': dependency[0]}) + Depends(program, userspaceRuntime) + tasks.append(program) + if i < len(imageOrderData) - 1: + imageOrderData[i+1][1].append(program) Depends(tasks, tasksEnvironment['configFiles']) Alias ('tasks', tasks) diff --git a/tasks/fs0/SConscript b/tasks/fs0/SConscript index e96df6a..10c9c26 100644 --- a/tasks/fs0/SConscript +++ b/tasks/fs0/SConscript @@ -17,16 +17,8 @@ # # Author: Russel Winder -Import('environment') +Import('environment', 'previousImage') -e = environment.Clone() -e.Append(LINKFLAGS = ['-Ttasks/fs0/include/linker.lds']) -e.Append(LIBPATH=['#build/tasks/fs0', '#build/lib/c/userspace/crt/sys-userspace/arch-arm']) - -objects = e.StaticObject(Glob('*.c') + [Glob(directory + '/*.c') for directory in [ 'src', 'src/lib', 'src/memfs']]) -Depends(objects, e['configFiles']) -program = e.Program('fs0', objects) -physicalBaseLinkerScript = Command('include/physical_base.lds', e['kernel'], 'tools/pyelf/readelf.py --first-free-page ' + e['kernel'][0].path + ' >> $TARGET') -Depends(program, [physicalBaseLinkerScript, e['crt0']]) +program = environment['buildTask']('fs0', Glob('*.c') + [Glob(directory + '/*.c') for directory in [ 'src', 'src/lib', 'src/lib/elf', 'src/memfs']], environment, previousImage) Return('program') diff --git a/tasks/mm0/SConscript b/tasks/mm0/SConscript index f7d19eb..5c1ca07 100644 --- a/tasks/mm0/SConscript +++ b/tasks/mm0/SConscript @@ -17,16 +17,8 @@ # # Author: Russel Winder -Import('environment') +Import('environment', 'previousImage') -e = environment.Clone() -e.Append(LINKFLAGS=['-Ttasks/mm0/include/linker.lds']) -e.Append(LIBPATH=['#build/tasks/mm0', '#build/lib/c/userspace/crt/sys-userspace/arch-arm']) - -objects = e.StaticObject(Glob('*.c') + Glob('src/*.c') + Glob('src/lib/*.c') + Glob('src/arch/*.c')) -Depends(objects, e['configFiles']) -program = e.Program('mm0', objects) -physicalBaseLinkerScript = Command('include/physical_base.lds', e['kernel'], 'tools/pyelf/readelf.py --first-free-page ' + e['kernel'][0].path + ' >> $TARGET') -Depends(program, [physicalBaseLinkerScript, e['crt0']]) +program = environment['buildTask']('mm0', Glob('*.c') + [Glob(directory + '/*.c') for directory in [ 'src', 'src/lib', 'src/lib/elf', 'src/arch-' + environment['ARCH']]], environment, previousImage) Return('program') diff --git a/tasks/taskOrder.py b/tasks/taskOrder.py new file mode 100644 index 0000000..b6550ec --- /dev/null +++ b/tasks/taskOrder.py @@ -0,0 +1,22 @@ +# -*- mode: python; coding: utf-8; -*- + +# Codezero -- a microkernel for embedded systems. +# +# Copyright © 2009 B Labs Ltd +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU +# General Public License as published by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even +# the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# You should have received a copy of the GNU General Public License along with this program. If not, see +# . +# +# Author: Russel Winder + +# A sequence determining the order of tasks in the packing. + +taskOrder = ('mm0', 'fs0', 'test0') diff --git a/tasks/test0/SConscript b/tasks/test0/SConscript index 25fb263..68267ef 100644 --- a/tasks/test0/SConscript +++ b/tasks/test0/SConscript @@ -17,16 +17,8 @@ # # Author: Russel Winder -Import('environment') +Import('environment', 'previousImage') -e = environment.Clone() -e.Append(LINKFLAGS = ['-Ttasks/test0/include/linker.lds']) -e.Append(LIBPATH=['#build/tasks/test0', '#build/lib/c/userspace/crt/sys-userspace/arch-arm']) - -objects = e.StaticObject(Glob('*.c') + Glob('src/*.c')) -Depends(objects, e['configFiles']) -program = e.Program('test0', objects) -physicalBaseLinkerScript = Command('include/physical_base.lds', e['kernel'], 'tools/pyelf/readelf.py --first-free-page ' + e['kernel'][0].path + ' >> $TARGET') -Depends(program, [physicalBaseLinkerScript, e['crt0']]) +program = environment['buildTask']('test0', Glob('*.c') + Glob('src/*.c'), environment, previousImage, ['#tasks/libposix/include/posix']) Return('program')