build: Separate the kernel and user land include paths

- Provide support for separate user and kernel include paths in
  libbsd.py.

- Update all added files with a suitable context to build them
  with. Supported contexts are `kernel` and `user`.

- Kernel source use the kernel, CPU, and build header paths in
  this order.

- User source use the user, kernel, CPU and build header paths
  in this order. The FreeBSD /usr/include tree has some kernel
  header files installed as well as user land header files. This
  complicates the separation as some kernel header files are not
  visible to user land code while other are. This is handled by
  appending the kernel header paths to the user header paths so
  user land code will include a user header with the same name as
  a kernel header over the kernel header but will find a kernel
  header if there is no matching user header file.

Closes #4067
This commit is contained in:
Chris Johns 2020-09-03 09:54:27 +10:00
parent 43742834c2
commit c38f93b0c6
6 changed files with 617 additions and 441 deletions

View File

@ -1,6 +1,6 @@
# SPDX-License-Identifier: BSD-2-Clause # SPDX-License-Identifier: BSD-2-Clause
'''Manage the libbsd build configuration data. """Manage the libbsd build configuration data.
''' """
# Copyright (c) 2015, 2020 Chris Johns <chrisj@rtems.org>. All rights reserved. # Copyright (c) 2015, 2020 Chris Johns <chrisj@rtems.org>. All rights reserved.
# #
@ -35,15 +35,12 @@
from __future__ import print_function from __future__ import print_function
import shutil import codecs
import copy
import difflib
import os import os
import re import re
import sys import sys
import getopt
import filecmp
import difflib
import codecs
import copy
# #
# Global controls. # Global controls.
@ -67,21 +64,6 @@ verboseMoreDetail = 3
verboseDebug = 4 verboseDebug = 4
def _cflagsIncludes(cflags, includes):
if type(cflags) is not list:
if cflags is not None:
_cflags = cflags.split(' ')
else:
_cflags = [None]
else:
_cflags = cflags
if type(includes) is not list:
_includes = [includes]
else:
_includes = includes
return _cflags, _includes
def verbose(level=verboseInfo): def verbose(level=verboseInfo):
return verboseLevel >= level return verboseLevel >= level
@ -530,7 +512,7 @@ class TargetSourceCPUDependentPathComposer(CPUDependentFreeBSDPathComposer):
return path return path
class BuildSystemFragmentComposer(object): class BuildSystemComposer(object):
def __init__(self, includes=None): def __init__(self, includes=None):
if type(includes) is not list: if type(includes) is not list:
self.includes = [includes] self.includes = [includes]
@ -540,7 +522,7 @@ class BuildSystemFragmentComposer(object):
def __str__(self): def __str__(self):
return '' return ''
def get_includes(self): def getIncludes(self):
if None in self.includes: if None in self.includes:
incs = [] incs = []
else: else:
@ -548,52 +530,70 @@ class BuildSystemFragmentComposer(object):
return incs return incs
def compose(self, path): def compose(self, path):
return '' """A None result means there is nothing to build."""
return None
@staticmethod
def filesAsDefines(files):
define_keys = ''
for f in files:
f = f.upper()
for c in '\/-.':
f = f.replace(c, '_')
define_keys += ' ' + f
return define_keys.strip()
@staticmethod
def cflagsIncludes(cflags, includes):
if type(cflags) is not list:
if cflags is not None:
_cflags = cflags.split(' ')
else:
_cflags = [None]
else:
_cflags = cflags
if type(includes) is not list:
_includes = [includes]
else:
_includes = includes
return _cflags, _includes
class SourceFileFragmentComposer(BuildSystemFragmentComposer): class SourceFileBuildComposer(BuildSystemComposer):
def __init__(self, cflags="default", includes=None): def __init__(self, cflags="default", includes=None):
self.cflags, self.includes = _cflagsIncludes(cflags, includes) self.cflags, self.includes = self.cflagsIncludes(cflags, includes)
def _get_flags(self):
return self.cflags + self.get_includes()
def __str__(self): def __str__(self):
return 'SF: ' + ' '.join(self._get_flags()) return 'SF: ' + ' '.join(self.getFlags())
def compose(self, path): def compose(self, path):
flags = self._get_flags() flags = self.getFlags()
return ['sources', flags, return ['sources', flags, ('default', None)], \
('default', None)], [path], self.cflags, self.includes [path], self.cflags, self.includes
def getFlags(self):
return self.cflags + self.getIncludes()
class SourceFileIfHeaderComposer(SourceFileFragmentComposer): class SourceFileIfHeaderComposer(SourceFileBuildComposer):
def __init__(self, headers, cflags="default", includes=None): def __init__(self, headers, cflags="default", includes=None):
if headers is not list: if headers is not list:
headers = [headers] headers = [headers]
self.headers = headers self.headers = headers
super(SourceFileIfHeaderComposer, self).__init__(cflags=cflags, super(SourceFileIfHeaderComposer, self).__init__(cflags=cflags,
includes=includes) includes=includes)
def __str__(self): def __str__(self):
incs = self.headers + self.get_includes return 'SFIH:' + ' '.join(self.getFlags()) + \
if len(incs) > 0: ' ' + self.filesAsDefines(self.headers)
return 'SFIH:' + ' '.join(incs)
else:
return ''
def compose(self, path): def compose(self, path):
r = SourceFileFragmentComposer.compose(self, path) r = SourceFileBuildComposer.compose(self, path)
define_keys = '' r[0][2] = (self.filesAsDefines(self.headers), self.headers)
for h in self.headers:
h = h.upper()
for c in '\/-.':
h = h.replace(c, '_')
define_keys += ' ' + h
r[0][2] = (define_keys.strip(), self.headers)
return r return r
class TestFragementComposer(BuildSystemFragmentComposer): class TestFragementComposer(BuildSystemComposer):
def __init__(self, def __init__(self,
testName, testName,
fileFragments, fileFragments,
@ -641,13 +641,7 @@ class TestIfHeaderComposer(TestFragementComposer):
def compose(self, path): def compose(self, path):
r = TestFragementComposer.compose(self, path) r = TestFragementComposer.compose(self, path)
define_keys = '' r[0][2] = (self.filesAsDefines(self.headers), self.headers)
for h in self.headers:
h = h.upper()
for c in '\/-.':
h = h.replace(c, '_')
define_keys += ' ' + h
r[0][2] = (define_keys.strip(), self.headers)
return r return r
@ -671,37 +665,33 @@ class TestIfLibraryComposer(TestFragementComposer):
def compose(self, path): def compose(self, path):
r = TestFragementComposer.compose(self, path) r = TestFragementComposer.compose(self, path)
define_keys = '' r[0][2] = (self.filesAsDefines(self.libraries), self.libraries)
for l in self.libraries:
l = l.upper()
for c in '\/-.':
l = l.replace(c, '_')
define_keys += ' ' + l
r[0][2] = (define_keys.strip(), self.libraries)
return r return r
class KVMSymbolsFragmentComposer(BuildSystemFragmentComposer): class KVMSymbolsBuildComposer(BuildSystemComposer):
def compose(self, path): def compose(self, path):
return ['KVMSymbols', 'files', return ['KVMSymbols', 'files', ('default', None)], \
('default', None)], [path], self.includes [path], self.includes
class RPCGENFragmentComposer(BuildSystemFragmentComposer): class RPCGENBuildComposer(BuildSystemComposer):
def compose(self, path): def compose(self, path):
return ['RPCGen', 'files', ('default', None)], [path] return ['RPCGen', 'files', ('default', None)], \
[path]
class RouteKeywordsFragmentComposer(BuildSystemFragmentComposer): class RouteKeywordsBuildComposer(BuildSystemComposer):
def compose(self, path): def compose(self, path):
return ['RouteKeywords', 'files', ('default', None)], [path] return ['RouteKeywords', 'files', ('default', None)], \
[path]
class LexFragmentComposer(BuildSystemFragmentComposer): class LexBuildComposer(BuildSystemComposer):
def __init__(self, sym, dep, cflags=None, includes=None, build=True): def __init__(self, sym, dep, cflags=None, includes=None, build=True):
self.sym = sym self.sym = sym
self.dep = dep self.dep = dep
self.cflags, self.includes = _cflagsIncludes(cflags, includes) self.cflags, self.includes = self.cflagsIncludes(cflags, includes)
self.build = build self.build = build
def compose(self, path): def compose(self, path):
@ -718,11 +708,11 @@ class LexFragmentComposer(BuildSystemFragmentComposer):
return ['lex', path, ('default', None)], d return ['lex', path, ('default', None)], d
class YaccFragmentComposer(BuildSystemFragmentComposer): class YaccBuildComposer(BuildSystemComposer):
def __init__(self, sym, header, cflags=None, includes=None, build=True): def __init__(self, sym, header, cflags=None, includes=None, build=True):
self.sym = sym self.sym = sym
self.header = header self.header = header
self.cflags, self.includes = _cflagsIncludes(cflags, includes) self.cflags, self.includes = self.cflagsIncludes(cflags, includes)
self.build = build self.build = build
def compose(self, path): def compose(self, path):
@ -741,14 +731,14 @@ class YaccFragmentComposer(BuildSystemFragmentComposer):
class File(object): class File(object):
'''A file of source we move backwards and forwards and build.''' '''A file of source we move backwards and forwards and build.'''
def __init__(self, space, path, pathComposer, forwardConverter,
def __init__(self, path, pathComposer, forwardConverter, reverseConverter, reverseConverter, buildSystemComposer):
buildSystemComposer):
if verbose(verboseMoreDetail): if verbose(verboseMoreDetail):
print("FILE: %-50s F:%-45s R:%-45s" % \ print("FILE: %-6s %-50s F:%-45s R:%-45s" % \
(path, (space, path,
forwardConverter.__class__.__name__, forwardConverter.__class__.__name__,
reverseConverter.__class__.__name__)) reverseConverter.__class__.__name__))
self.space = space
self.path = path self.path = path
self.pathComposer = pathComposer self.pathComposer = pathComposer
self.originPath = self.pathComposer.composeOriginPath(self.path) self.originPath = self.pathComposer.composeOriginPath(self.path)
@ -759,12 +749,22 @@ class File(object):
self.buildSystemComposer = buildSystemComposer self.buildSystemComposer = buildSystemComposer
def __str__(self): def __str__(self):
out = self.path out = self.space[0].upper() + ' ' + self.path
bsc = str(self.buildSystemComposer) bsc = str(self.buildSystemComposer)
if len(bsc) > 0: if len(bsc) > 0:
out += ' (' + bsc + ')' out += ' (' + bsc + ')'
return out return out
def __eq__(self, other):
state = self.space == other.space
state = state and (self.path == self.path)
state = state and (self.pathComposer == self.pathComposer)
state = state and (self.originPath == self.originPath)
state = state and (self.forwardConverter == self.forwardConverter)
state = state and (self.self.reverseConverter == self.self.reverseConverter)
state = state and (self.buildSystemComposer == self.buildSystemComposer)
return state
def processSource(self, forward): def processSource(self, forward):
if forward: if forward:
if verbose(verboseDetail): if verbose(verboseDetail):
@ -774,17 +774,23 @@ class File(object):
else: else:
if verbose(verboseDetail): if verbose(verboseDetail):
print("process source: %s => %s converter:%s" % \ print("process source: %s => %s converter:%s" % \
(self.libbsdPath, self.originPath, self.reverseConverter.__class__.__name__)) (self.libbsdPath, self.originPath,
self.reverseConverter.__class__.__name__))
self.reverseConverter.convert(self.libbsdPath, self.originPath) self.reverseConverter.convert(self.libbsdPath, self.originPath)
def getFragment(self): def getFragment(self):
return self.buildSystemComposer.compose( return self.buildSystemComposer.compose(
self.pathComposer.composeLibBSDPath(self.path, '')) self.pathComposer.composeLibBSDPath(self.path, ''))
def getPath(self):
return self.path
def getSpace(self):
return self.space
class Module(object): class Module(object):
'''Logical group of related files we can perform actions on''' '''Logical group of related files we can perform actions on'''
def __init__(self, manager, name, enabled=True): def __init__(self, manager, name, enabled=True):
self.manager = manager self.manager = manager
self.name = name self.name = name
@ -794,23 +800,42 @@ class Module(object):
self.dependencies = [] self.dependencies = []
def __str__(self): def __str__(self):
out = [self.name + ': ' + self.conditionalOn] out = [self.name + ': conditional-on=' + self.conditionalOn]
if len(self.dependencies) > 0: if len(self.dependencies) > 0:
out += [' Deps: ' + str(len(self.dependencies))] out += [' Deps: ' + str(len(self.dependencies))]
out += [' ' + type(d).__name__ for d in self.dependencies] out += [' ' + type(d).__name__ for d in self.dependencies]
if len(self.files) > 0: if len(self.files) > 0:
out += [' Files: ' + str(len(self.files))] counts = {}
for f in self.files:
space = f.getSpace()
if space not in counts:
counts[space] = 0
counts[space] += 1
count_str = ''
for space in sorted(counts.keys()):
count_str += '%s:%d ' % (space[0].upper(), counts[space])
count_str = count_str[:-1]
out += [' Files: %d (%s)' % (len(self.files), count_str)]
out += [' ' + str(f) for f in self.files] out += [' ' + str(f) for f in self.files]
if len(self.cpuDependentSourceFiles) > 0: if len(self.cpuDependentSourceFiles) > 0:
out += [' CPU Dep: ' + str(len(self.cpuDependentSourceFiles))] out += [' CPU Dep: ' + str(len(self.cpuDependentSourceFiles))]
for cpu in self.cpuDependentSourceFiles: for cpu in self.cpuDependentSourceFiles:
out += [' ' + cpu + ':' + str(f) for f in self.cpuDependentSourceFiles[cpu]] out += [' ' + cpu + ':']
out += [
' ' + str(f) for f in self.cpuDependentSourceFiles[cpu]
]
return os.linesep.join(out) return os.linesep.join(out)
def initCPUDependencies(self, cpu): def initCPUDependencies(self, cpu):
if cpu not in self.cpuDependentSourceFiles: if cpu not in self.cpuDependentSourceFiles:
self.cpuDependentSourceFiles[cpu] = [] self.cpuDependentSourceFiles[cpu] = []
def getName(self):
return self.name
def getFiles(self):
return (f for f in self.files)
def processSource(self, direction): def processSource(self, direction):
if verbose(verboseDetail): if verbose(verboseDetail):
print("process module: %s" % (self.name)) print("process module: %s" % (self.name))
@ -821,57 +846,64 @@ class Module(object):
f.processSource(direction) f.processSource(direction)
def addFile(self, f): def addFile(self, f):
if not isinstance(f, File):
raise TypeError('invalid type for addFiles: %s' % (type(f)))
self.files += [f] self.files += [f]
def addFiles(self, def addFiles(self,
space,
newFiles, newFiles,
pathComposer, pathComposer,
forwardConverter, forwardConverter,
reverseConverter, reverseConverter,
assertFile, assertFile,
buildSystemComposer=BuildSystemFragmentComposer()): buildSystemComposer=BuildSystemComposer()):
files = [] files = []
for newFile in newFiles: for newFile in newFiles:
assertFile(newFile) assertFile(newFile)
files += [ files += [
File(newFile, pathComposer, forwardConverter, reverseConverter, File(space, newFile, pathComposer, forwardConverter,
buildSystemComposer) reverseConverter, buildSystemComposer)
] ]
return files return files
def addPlainTextFile(self, files): def addPlainTextFile(self, files):
self.files += self.addFiles(files, self.files += self.addFiles('user', files,
FreeBSDPathComposer(), Converter(), FreeBSDPathComposer(), Converter(),
Converter(), assertNothing) Converter(), assertNothing)
def addKernelSpaceHeaderFiles(self, files): def addKernelSpaceHeaderFiles(self, files):
self.files += self.addFiles(files, FreeBSDPathComposer(), self.files += self.addFiles('kernel', files, FreeBSDPathComposer(),
FromFreeBSDToRTEMSHeaderConverter(), FromFreeBSDToRTEMSHeaderConverter(),
FromRTEMSToFreeBSDHeaderConverter(), FromRTEMSToFreeBSDHeaderConverter(),
assertHeaderOrSourceFile) assertHeaderOrSourceFile)
def addUserSpaceHeaderFiles(self, files): def addUserSpaceHeaderFiles(self, files):
self.files += self.addFiles( self.files += self.addFiles(
files, FreeBSDPathComposer(), 'user', files, FreeBSDPathComposer(),
FromFreeBSDToRTEMSUserSpaceHeaderConverter(), FromFreeBSDToRTEMSUserSpaceHeaderConverter(),
FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile) FromRTEMSToFreeBSDHeaderConverter(), assertHeaderFile)
def addRTEMSHeaderFiles(self, files): def addRTEMSHeaderFiles(self, files):
self.files += self.addFiles(files, RTEMSPathComposer(), NoConverter(), self.files += self.addFiles('user', files, RTEMSPathComposer(),
NoConverter(), assertHeaderFile) NoConverter(), NoConverter(),
assertHeaderFile)
def addLinuxHeaderFiles(self, files): def addLinuxHeaderFiles(self, files):
self.files += self.addFiles(files, PathComposer(), NoConverter(), self.files += self.addFiles('kernel', files, PathComposer(),
NoConverter(), assertHeaderFile) NoConverter(), NoConverter(),
assertHeaderFile)
def addCPUDependentFreeBSDHeaderFiles(self, files): def addCPUDependentFreeBSDHeaderFiles(self, files):
self.files += self.addFiles(files, CPUDependentFreeBSDPathComposer(), self.files += self.addFiles('kernel', files,
CPUDependentFreeBSDPathComposer(),
FromFreeBSDToRTEMSHeaderConverter(), FromFreeBSDToRTEMSHeaderConverter(),
FromRTEMSToFreeBSDHeaderConverter(), FromRTEMSToFreeBSDHeaderConverter(),
assertHeaderFile) assertHeaderFile)
def addCPUDependentLinuxHeaderFiles(self, files): def addCPUDependentLinuxHeaderFiles(self, files):
self.files += self.addFiles(files, CPUDependentLinuxPathComposer(), self.files += self.addFiles('kernel', files,
CPUDependentLinuxPathComposer(),
NoConverter(), NoConverter(), NoConverter(), NoConverter(),
assertHeaderFile) assertHeaderFile)
@ -879,73 +911,80 @@ class Module(object):
files): files):
for cpu in targetCPUs: for cpu in targetCPUs:
self.files += self.addFiles( self.files += self.addFiles(
files, TargetSourceCPUDependentPathComposer(cpu, sourceCPU), 'kernel', files,
TargetSourceCPUDependentPathComposer(cpu, sourceCPU),
FromFreeBSDToRTEMSHeaderConverter(), NoConverter(), FromFreeBSDToRTEMSHeaderConverter(), NoConverter(),
assertHeaderFile) assertHeaderFile)
def addSourceFiles(self, files, sourceFileFragmentComposer): def addSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles(files, PathComposer(), NoConverter(), self.files += self.addFiles('user',
files, PathComposer(), NoConverter(),
NoConverter(), assertSourceFile, NoConverter(), assertSourceFile,
sourceFileFragmentComposer) sourceFileBuildComposer)
def addKernelSpaceSourceFiles(self, files, sourceFileFragmentComposer): def addKernelSpaceSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles(files, FreeBSDPathComposer(), self.files += self.addFiles('kernel', files, FreeBSDPathComposer(),
FromFreeBSDToRTEMSSourceConverter(), FromFreeBSDToRTEMSSourceConverter(),
FromRTEMSToFreeBSDSourceConverter(), FromRTEMSToFreeBSDSourceConverter(),
assertSourceFile, assertSourceFile, sourceFileBuildComposer)
sourceFileFragmentComposer)
def addUserSpaceSourceFiles(self, files, sourceFileFragmentComposer): def addUserSpaceSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles( self.files += self.addFiles(
files, FreeBSDPathComposer(), 'user', files, FreeBSDPathComposer(),
FromFreeBSDToRTEMSUserSpaceSourceConverter(), FromFreeBSDToRTEMSUserSpaceSourceConverter(),
FromRTEMSToFreeBSDSourceConverter(), assertSourceFile, FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
sourceFileFragmentComposer) sourceFileBuildComposer)
def addRTEMSSourceFiles(self, files, sourceFileFragmentComposer): def addRTEMSKernelSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles(files, RTEMSPathComposer(), NoConverter(), self.files += self.addFiles('kernel', files, RTEMSPathComposer(),
NoConverter(), assertSourceFile, NoConverter(), NoConverter(),
sourceFileFragmentComposer) assertSourceFile, sourceFileBuildComposer)
def addLinuxSourceFiles(self, files, sourceFileFragmentComposer): def addRTEMSUserSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles(files, PathComposer(), NoConverter(), self.files += self.addFiles('user', files, RTEMSPathComposer(),
NoConverter(), assertSourceFile, NoConverter(), NoConverter(),
sourceFileFragmentComposer) assertSourceFile, sourceFileBuildComposer)
def addLinuxSourceFiles(self, files, sourceFileBuildComposer):
self.files += self.addFiles('kernel', files, PathComposer(),
NoConverter(), NoConverter(),
assertSourceFile, sourceFileBuildComposer)
def addCPUDependentFreeBSDSourceFiles(self, cpus, files, def addCPUDependentFreeBSDSourceFiles(self, cpus, files,
sourceFileFragmentComposer): sourceFileBuildComposer):
for cpu in cpus: for cpu in cpus:
self.initCPUDependencies(cpu) self.initCPUDependencies(cpu)
self.cpuDependentSourceFiles[cpu] += \ self.cpuDependentSourceFiles[cpu] += \
self.addFiles(files, self.addFiles(
CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(), 'kernel', files,
FromRTEMSToFreeBSDSourceConverter(), assertSourceFile, CPUDependentFreeBSDPathComposer(), FromFreeBSDToRTEMSSourceConverter(),
sourceFileFragmentComposer) FromRTEMSToFreeBSDSourceConverter(), assertSourceFile,
sourceFileBuildComposer)
def addCPUDependentRTEMSSourceFiles(self, cpus, files, def addCPUDependentRTEMSSourceFiles(self, cpus, files,
sourceFileFragmentComposer): sourceFileBuildComposer):
for cpu in cpus: for cpu in cpus:
self.initCPUDependencies(cpu) self.initCPUDependencies(cpu)
self.cpuDependentSourceFiles[cpu] += \ self.cpuDependentSourceFiles[cpu] += \
self.addFiles(files, self.addFiles('kernel', files,
CPUDependentRTEMSPathComposer(), NoConverter(), CPUDependentRTEMSPathComposer(), NoConverter(),
NoConverter(), assertSourceFile, NoConverter(), assertSourceFile,
sourceFileFragmentComposer) sourceFileBuildComposer)
def addCPUDependentLinuxSourceFiles(self, cpus, files, def addCPUDependentLinuxSourceFiles(self, cpus, files,
sourceFileFragmentComposer): sourceFileBuildComposer):
for cpu in cpus: for cpu in cpus:
self.initCPUDependencies(cpu) self.initCPUDependencies(cpu)
self.cpuDependentSourceFiles[cpu] += \ self.cpuDependentSourceFiles[cpu] += \
self.addFiles(files, self.addFiles('kernel', files,
CPUDependentLinuxPathComposer(), NoConverter(), CPUDependentLinuxPathComposer(), NoConverter(),
NoConverter(), assertSourceFile, NoConverter(), assertSourceFile,
sourceFileFragmentComposer) sourceFileBuildComposer)
def addTest(self, testFragementComposer): def addTest(self, testFragementComposer):
self.files += [ self.files += [
File(testFragementComposer.testName, PathComposer(), NoConverter(), File('user', testFragementComposer.testName, PathComposer(),
NoConverter(), testFragementComposer) NoConverter(), NoConverter(), testFragementComposer)
] ]
def addDependency(self, dep): def addDependency(self, dep):
@ -954,7 +993,6 @@ class Module(object):
class ModuleManager(object): class ModuleManager(object):
'''A manager for a collection of modules.''' '''A manager for a collection of modules.'''
def __init__(self): def __init__(self):
self.modules = {} self.modules = {}
self.generator = {} self.generator = {}
@ -995,7 +1033,7 @@ class ModuleManager(object):
self.configuration = copy.deepcopy(config) self.configuration = copy.deepcopy(config)
def getConfiguration(self): def getConfiguration(self):
return self.configuration return copy.deepcopy(self.configuration)
def updateConfiguration(self, config): def updateConfiguration(self, config):
self.configuration.update(config) self.configuration.update(config)
@ -1012,17 +1050,33 @@ class ModuleManager(object):
if only_enabled == False: if only_enabled == False:
modules_to_process = self.getAllModules() modules_to_process = self.getAllModules()
for m in modules_to_process: for m in modules_to_process:
if m not in self.modules:
raise KeyError('enabled module not registered: %s' % (m))
self.modules[m].generate() self.modules[m].generate()
def duplicateCheck(self):
dups = []
modules_to_check = sorted(self.getAllModules(), reverse=True)
while len(modules_to_check) > 1:
mod = modules_to_check.pop()
for m in modules_to_check:
if m not in self.modules:
raise KeyError('enabled module not registered: %s' % (m))
for fmod in self.modules[mod].getFiles():
for fm in self.modules[m].getFiles():
if fmod.getPath() == fm.getPath():
dups += [(m, mod, fm.getPath(), fm.getSpace())]
return dups
def setGenerators(self): def setGenerators(self):
self.generator['convert'] = Converter self.generator['convert'] = Converter
self.generator['no-convert'] = NoConverter self.generator['no-convert'] = NoConverter
self.generator[ self.generator[
'from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'] = FromFreeBSDToRTEMSUserSpaceSourceConverter 'from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'] = \
FromFreeBSDToRTEMSUserSpaceSourceConverter
self.generator[ self.generator[
'from-RTEMS-To-FreeBSD-SourceConverter'] = FromRTEMSToFreeBSDSourceConverter 'from-RTEMS-To-FreeBSD-SourceConverter'] = FromRTEMSToFreeBSDSourceConverter
self.generator[ self.generator['buildSystemComposer'] = BuildSystemComposer
'buildSystemFragmentComposer'] = BuildSystemFragmentComposer
self.generator['file'] = File self.generator['file'] = File
@ -1033,13 +1087,13 @@ class ModuleManager(object):
self.generator[ self.generator[
'target-src-cpu--path'] = TargetSourceCPUDependentPathComposer 'target-src-cpu--path'] = TargetSourceCPUDependentPathComposer
self.generator['source'] = SourceFileFragmentComposer self.generator['source'] = SourceFileBuildComposer
self.generator['test'] = TestFragementComposer self.generator['test'] = TestFragementComposer
self.generator['kvm-symbols'] = KVMSymbolsFragmentComposer self.generator['kvm-symbols'] = KVMSymbolsBuildComposer
self.generator['rpc-gen'] = RPCGENFragmentComposer self.generator['rpc-gen'] = RPCGENBuildComposer
self.generator['route-keywords'] = RouteKeywordsFragmentComposer self.generator['route-keywords'] = RouteKeywordsBuildComposer
self.generator['lex'] = LexFragmentComposer self.generator['lex'] = LexBuildComposer
self.generator['yacc'] = YaccFragmentComposer self.generator['yacc'] = YaccBuildComposer
self.generator['source-if-header'] = SourceFileIfHeaderComposer self.generator['source-if-header'] = SourceFileIfHeaderComposer
self.generator['test-if-header'] = TestIfHeaderComposer self.generator['test-if-header'] = TestIfHeaderComposer

View File

@ -53,11 +53,13 @@ net80211 = off
netinet = on netinet = on
netinet6 = on netinet6 = on
netipsec = off netipsec = off
nfsv2 = on
nvme = on nvme = on
opencrypto = on opencrypto = on
pci = on pci = on
pf = on pf = on
regulator = on regulator = on
rpc_user = on
rtems = on rtems = on
tests = on tests = on
tty = on tty = on

View File

@ -152,6 +152,18 @@ try:
libbsd.load(build) libbsd.load(build)
build.generateBuild(only_enabled=False) build.generateBuild(only_enabled=False)
dups = build.duplicateCheck()
if len(dups) > 0:
print()
print('Duplicates: %d' % (len(dups)))
mods = list(set([dup[0] for dup in dups]))
max_mod_len = max(len(dup[1]) for dup in dups)
for mod in mods:
print(' %s:' % (mod))
for dup in [dup for dup in dups if dup[0] == mod]:
print(' %-*s %s %s' % (max_mod_len, dup[1], dup[3][0].upper(), dup[2]))
print()
if isConfig: if isConfig:
print() print()
print(build) print(build)

545
libbsd.py
View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2015-2016, 2018 Chris Johns <chrisj@rtems.org>. # Copyright (c) 2015, 2020 Chris Johns <chrisj@rtems.org>.
# All rights reserved. # All rights reserved.
# #
# Copyright (c) 2009, 2018 embedded brains GmbH. All rights reserved. # Copyright (c) 2009, 2018 embedded brains GmbH. All rights reserved.
@ -56,42 +56,55 @@ _defaults = {
# #
# Includes # Includes
# #
'include-paths': ['rtemsbsd/include', 'include-paths': {
'freebsd/sys', # The path where headers will be copied during the build.
'freebsd/sys/contrib/ck/include', 'build': ['build-include'],
'freebsd/sys/contrib/libsodium/src/libsodium/include', # Kernel header paths
'freebsd/sys/contrib/libsodium/src/libsodium/include/sodium', 'kernel': ['rtemsbsd/include',
'freebsd/sys/contrib/pf', 'freebsd/sys',
'freebsd/crypto', 'freebsd/sys/contrib/ck/include',
'freebsd/crypto/openssl/include', 'freebsd/sys/contrib/libsodium/src/libsodium/include',
'freebsd/sys/net', 'freebsd/sys/contrib/libsodium/src/libsodium/include/sodium',
'freebsd/include', 'freebsd/sys/contrib/pf',
'freebsd/lib', 'freebsd/sys/net',
'freebsd/lib/libbsdstat', 'ipsec-tools/src/libipsec',
'freebsd/lib/libcapsicum', 'linux/include',
'freebsd/lib/libcasper', 'linux/drivers/net/ethernet/freescale/fman',
'freebsd/lib/libc/include', 'rtemsbsd/sys'],
'freebsd/lib/libc/isc/include', # User header paths
'freebsd/lib/libc/resolv', 'user': ['freebsd/crypto',
'freebsd/lib/libutil', 'freebsd/crypto/openssl/include',
'freebsd/lib/libkvm', 'freebsd/include',
'freebsd/lib/libmemstat', 'freebsd/lib',
'freebsd/contrib/expat/lib', 'freebsd/lib/libbsdstat',
'freebsd/contrib/libpcap', 'freebsd/lib/libcapsicum',
'freebsd/contrib/libxo', 'freebsd/lib/libcasper',
'ipsec-tools/src/libipsec', 'freebsd/lib/libc/include',
'linux/include', 'freebsd/lib/libc/isc/include',
'linux/drivers/net/ethernet/freescale/fman', 'freebsd/lib/libc/resolv',
'rtemsbsd/sys', 'freebsd/lib/libutil',
'mDNSResponder/mDNSCore', 'freebsd/lib/libkvm',
'mDNSResponder/mDNSShared', 'freebsd/lib/libmemstat',
'mDNSResponder/mDNSPosix', 'freebsd/contrib/expat/lib',
'testsuite/include'], 'freebsd/contrib/libpcap',
'cpu-include-paths': ['rtemsbsd/@CPU@/include', 'freebsd/contrib/libxo',
'freebsd/sys/@CPU@/include'], 'mDNSResponder/mDNSCore',
'mDNSResponder/mDNSShared',
'mDNSResponder/mDNSPosix',
'testsuite/include'],
# CPU specific path, assumed to be in the kernel context
'cpu': ['rtemsbsd/@CPU@/include',
'freebsd/sys/@CPU@/include'],
},
# The path where headers will be copied during build. #
'build-include-path': ['build-include'], # Map paths based on RTEMS naming to FreeBSD naming.
#
'path-mappings': [
# (source, [targets..])
# i386
('freebsd/sys/i386/include', ['freebsd/sys/x86/include', 'freebsd/sys/i386/include']),
],
# #
# Install headers # Install headers
@ -146,7 +159,7 @@ class rtems(builder.Module):
def generate(self): def generate(self):
mm = self.manager mm = self.manager
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/bus_if.c', 'local/bus_if.c',
'local/cryptodev_if.c', 'local/cryptodev_if.c',
@ -162,36 +175,11 @@ class rtems(builder.Module):
'local/mmcbr_if.c', 'local/mmcbr_if.c',
'local/if_dwc_if.c', 'local/if_dwc_if.c',
'local/gpio_if.c', 'local/gpio_if.c',
'rtems/ipsec_get_policylen.c',
'rtems/rtems-bsd-arp-processor.c',
'rtems/rtems-bsd-allocator-domain-size.c', 'rtems/rtems-bsd-allocator-domain-size.c',
'rtems/rtems-bsd-cxx.cc',
'rtems/rtems-bsd-get-allocator-domain-size.c', 'rtems/rtems-bsd-get-allocator-domain-size.c',
'rtems/rtems-bsd-get-ethernet-addr.c',
'rtems/rtems-bsd-get-mac-address.c', 'rtems/rtems-bsd-get-mac-address.c',
'rtems/rtems-bsd-get-task-priority.c', 'rtems/rtems-bsd-get-task-priority.c',
'rtems/rtems-bsd-get-task-stack-size.c', 'rtems/rtems-bsd-get-task-stack-size.c',
'rtems/rtems-bsd-ifconfig.c',
'rtems/rtems-bsd-ifconfig-lo0.c',
'rtems/rtems-bsd-init-dhcp.c',
'rtems/rtems-bsd-rc-conf-net.c',
'rtems/rtems-bsd-rc-conf-pf.c',
'rtems/rtems-bsd-rc-conf.c',
'rtems/rtems-bsd-set-if-input.c',
'rtems/rtems-bsd-shell-arp.c',
'rtems/rtems-bsd-shell-i2c.c',
'rtems/rtems-bsd-shell-ifconfig.c',
'rtems/rtems-bsd-shell-ifmcstat.c',
'rtems/rtems-bsd-shell-netstat.c',
'rtems/rtems-bsd-shell-nvmecontrol.c',
'rtems/rtems-bsd-shell-pfctl.c',
'rtems/rtems-bsd-shell-ping.c',
'rtems/rtems-bsd-shell-route.c',
'rtems/rtems-bsd-shell-stty.c',
'rtems/rtems-bsd-shell-sysctl.c',
'rtems/rtems-bsd-shell-tcpdump.c',
'rtems/rtems-bsd-shell-vmstat.c',
'rtems/rtems-bsd-shell-wlanstats.c',
'rtems/rtems-bsd-syscall-api.c', 'rtems/rtems-bsd-syscall-api.c',
'rtems/rtems-kernel-assert.c', 'rtems/rtems-kernel-assert.c',
'rtems/rtems-kernel-autoconf.c', 'rtems/rtems-kernel-autoconf.c',
@ -230,32 +218,6 @@ class rtems(builder.Module):
'rtems/rtems-legacy-rtrequest.c', 'rtems/rtems-legacy-rtrequest.c',
'rtems/rtems-legacy-newproc.c', 'rtems/rtems-legacy-newproc.c',
'rtems/rtems-legacy-mii.c', 'rtems/rtems-legacy-mii.c',
'rtems/rtems-kvm.c',
'rtems/rtems-program.c',
'rtems/rtems-program-socket.c',
'rtems/rtems-routes.c',
'rtems/syslog.c',
'ftpd/ftpd-service.c',
'nfsclient/mount_prot_xdr.c',
'nfsclient/nfs.c',
'nfsclient/nfs_prot_xdr.c',
'nfsclient/rpcio.c',
'pppd/auth.c',
'pppd/ccp.c',
'pppd/chap.c',
'pppd/chap_ms.c',
'pppd/chat.c',
'pppd/demand.c',
'pppd/fsm.c',
'pppd/ipcp.c',
'pppd/lcp.c',
'pppd/magic.c',
'pppd/options.c',
'pppd/rtemsmain.c',
'pppd/rtemspppd.c',
'pppd/sys-rtems.c',
'pppd/upap.c',
'pppd/utils.c',
'sys/arm/lpc/if_lpe.c', 'sys/arm/lpc/if_lpe.c',
'sys/arm/lpc/lpc_pwr.c', 'sys/arm/lpc/lpc_pwr.c',
'sys/dev/atsam/if_atsam.c', 'sys/dev/atsam/if_atsam.c',
@ -274,21 +236,75 @@ class rtems(builder.Module):
'sys/fs/devfs/devfs_devs.c', 'sys/fs/devfs/devfs_devs.c',
'sys/net/if_ppp.c', 'sys/net/if_ppp.c',
'sys/net/ppp_tty.c', 'sys/net/ppp_tty.c',
],
mm.generator['source']()
)
self.addRTEMSUserSourceFiles(
[
'rtems/ipsec_get_policylen.c',
'rtems/rtems-bsd-arp-processor.c',
'rtems/rtems-bsd-cxx.cc',
'rtems/rtems-bsd-get-ethernet-addr.c',
'rtems/rtems-bsd-ifconfig.c',
'rtems/rtems-bsd-ifconfig-lo0.c',
'rtems/rtems-bsd-init-dhcp.c',
'rtems/rtems-bsd-rc-conf-net.c',
'rtems/rtems-bsd-rc-conf-pf.c',
'rtems/rtems-bsd-rc-conf.c',
'rtems/rtems-bsd-set-if-input.c',
'rtems/rtems-bsd-shell-arp.c',
'rtems/rtems-bsd-shell-ifconfig.c',
'rtems/rtems-bsd-shell-ifmcstat.c',
'rtems/rtems-bsd-shell-netstat.c',
'rtems/rtems-bsd-shell-nvmecontrol.c',
'rtems/rtems-bsd-shell-pfctl.c',
'rtems/rtems-bsd-shell-ping.c',
'rtems/rtems-bsd-shell-route.c',
'rtems/rtems-bsd-shell-stty.c',
'rtems/rtems-bsd-shell-sysctl.c',
'rtems/rtems-bsd-shell-tcpdump.c',
'rtems/rtems-bsd-shell-vmstat.c',
'rtems/rtems-bsd-shell-wlanstats.c',
'rtems/rtems-kvm.c',
'rtems/rtems-program.c',
'rtems/rtems-program-socket.c',
'rtems/rtems-routes.c',
'rtems/syslog.c',
'ftpd/ftpd-service.c',
'pppd/auth.c',
'pppd/ccp.c',
'pppd/chap.c',
'pppd/chap_ms.c',
'pppd/chat.c',
'pppd/demand.c',
'pppd/fsm.c',
'pppd/ipcp.c',
'pppd/lcp.c',
'pppd/magic.c',
'pppd/options.c',
'pppd/rtemsmain.c',
'pppd/rtemspppd.c',
'pppd/sys-rtems.c',
'pppd/upap.c',
'pppd/utils.c',
'telnetd/telnetd-service.c', 'telnetd/telnetd-service.c',
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addFile(mm.generator['file']('rtems/rtems-kernel-kvm-symbols.c', self.addFile(mm.generator['file']('kernel',
'rtems/rtems-kernel-kvm-symbols.c',
mm.generator['rtems-path'](), mm.generator['rtems-path'](),
mm.generator['no-convert'](), mm.generator['no-convert'](),
mm.generator['no-convert'](), mm.generator['no-convert'](),
mm.generator['kvm-symbols'](includes = 'rtemsbsd/rtems'))) mm.generator['kvm-symbols'](includes = 'rtemsbsd/rtems')))
self.addFile(mm.generator['file']('lib/libc/net/nslexer.l', self.addFile(mm.generator['file']('user',
'lib/libc/net/nslexer.l',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['lex']('_nsyy', 'nsparser.c'))) mm.generator['lex']('_nsyy', 'nsparser.c')))
self.addFile(mm.generator['file']('lib/libc/net/nsparser.y', self.addFile(mm.generator['file']('user',
'lib/libc/net/nsparser.y',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -339,8 +355,6 @@ class base(builder.Module):
'sys/contrib/ck/include/gcc/x86/ck_f_pr.h', 'sys/contrib/ck/include/gcc/x86/ck_f_pr.h',
'sys/contrib/ck/include/gcc/x86/ck_pr.h', 'sys/contrib/ck/include/gcc/x86/ck_pr.h',
'sys/fs/devfs/devfs_int.h', 'sys/fs/devfs/devfs_int.h',
'sys/rpc/netconfig.h',
'sys/rpc/types.h',
'sys/security/audit/audit.h', 'sys/security/audit/audit.h',
'sys/security/mac/mac_framework.h', 'sys/security/mac/mac_framework.h',
'sys/sys/acl.h', 'sys/sys/acl.h',
@ -571,7 +585,7 @@ class fdt(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'rtems/ofw_machdep.c', 'rtems/ofw_machdep.c',
], ],
@ -608,7 +622,7 @@ class tty(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
# self.addRTEMSSourceFiles( # self.addRTEMSKernelSourceFiles(
# [ # [
# 'rtems/ofw_machdep.c', # 'rtems/ofw_machdep.c',
# ], # ],
@ -645,7 +659,7 @@ class mmc(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'sys/arm/at91/at91_mci.c', 'sys/arm/at91/at91_mci.c',
], ],
@ -684,7 +698,7 @@ class mmc_ti(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/sdhci_if.c', 'local/sdhci_if.c',
'local/gpiobus_if.c', 'local/gpiobus_if.c',
@ -774,7 +788,7 @@ class iic(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/iicbus_if.c', 'local/iicbus_if.c',
'sys/dev/iicbus/rtems-i2c.c', 'sys/dev/iicbus/rtems-i2c.c',
@ -828,7 +842,7 @@ class display(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/clknode_if.c', 'local/clknode_if.c',
'local/hdmi_if.c', 'local/hdmi_if.c',
@ -862,7 +876,7 @@ class pinmux(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/fdt_pinctrl_if.c', 'local/fdt_pinctrl_if.c',
], ],
@ -1206,7 +1220,7 @@ class dev_usb_wlan(builder.Module):
'sys/dev/usb/wlan/if_zydreg.h', 'sys/dev/usb/wlan/if_zydreg.h',
] ]
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/runfw.c', 'local/runfw.c',
], ],
@ -1318,7 +1332,7 @@ class dev_wlan_rtwn(builder.Module):
'sys/dev/rtwn/usb/rtwn_usb_var.h', 'sys/dev/rtwn/usb/rtwn_usb_var.h',
] ]
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/rtwn-rtl8192cfwT.c', 'local/rtwn-rtl8192cfwT.c',
'local/rtwn-rtl8188eufw.c', 'local/rtwn-rtl8188eufw.c',
@ -1523,7 +1537,7 @@ class dev_net(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'sys/dev/mii/ksz8091rnb_50MHz.c', 'sys/dev/mii/ksz8091rnb_50MHz.c',
], ],
@ -1822,7 +1836,7 @@ class nvme(builder.Module):
], ],
mm.generator['source']() mm.generator['source']()
) )
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'sys/dev/nvd/nvd.c', 'sys/dev/nvd/nvd.c',
], ],
@ -2231,14 +2245,16 @@ class netipsec(builder.Module):
], ],
mm.generator['source'](libipsec_cflags) mm.generator['source'](libipsec_cflags)
) )
self.addFile(mm.generator['file']('ipsec-tools/src/libipsec/policy_token.l', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/libipsec/policy_token.l',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['lex']('__libipsec', mm.generator['lex']('__libipsec',
'policy_parse.c', 'policy_parse.c',
libipsec_cflags))) libipsec_cflags)))
self.addFile(mm.generator['file']('ipsec-tools/src/libipsec/policy_parse.y', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/libipsec/policy_parse.y',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2300,7 +2316,8 @@ class netipsec(builder.Module):
mm.generator['source'](racoon_cflags, mm.generator['source'](racoon_cflags,
['freebsd/crypto/openssl']) ['freebsd/crypto/openssl'])
) )
self.addFile(mm.generator['file']('ipsec-tools/src/racoon/cftoken.l', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/racoon/cftoken.l',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2308,7 +2325,8 @@ class netipsec(builder.Module):
'cftoken.c', 'cftoken.c',
racoon_cflags, racoon_cflags,
build=False))) build=False)))
self.addFile(mm.generator['file']('ipsec-tools/src/racoon/cfparse.y', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/racoon/cfparse.y',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2316,7 +2334,8 @@ class netipsec(builder.Module):
'cfparse.h', 'cfparse.h',
racoon_cflags, racoon_cflags,
build=False))) build=False)))
self.addFile(mm.generator['file']('ipsec-tools/src/racoon/prsa_tok.l', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/racoon/prsa_tok.l',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2324,7 +2343,8 @@ class netipsec(builder.Module):
'prsa_tok.c', 'prsa_tok.c',
racoon_cflags, racoon_cflags,
build=False))) build=False)))
self.addFile(mm.generator['file']('ipsec-tools/src/racoon/prsa_par.y', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/racoon/prsa_par.y',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2337,7 +2357,7 @@ class netipsec(builder.Module):
'rtems/ipsec.h', 'rtems/ipsec.h',
] ]
) )
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-racoon.c', 'rtems/rtems-bsd-racoon.c',
'rtems/rtems-bsd-rc-conf-ipsec.c', 'rtems/rtems-bsd-rc-conf-ipsec.c',
@ -2357,7 +2377,8 @@ class netipsec(builder.Module):
], ],
mm.generator['source'](setkey_cflags) mm.generator['source'](setkey_cflags)
) )
self.addFile(mm.generator['file']('ipsec-tools/src/setkey/token.l', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/setkey/token.l',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2365,7 +2386,8 @@ class netipsec(builder.Module):
'token.c', 'token.c',
setkey_cflags, setkey_cflags,
build=False))) build=False)))
self.addFile(mm.generator['file']('ipsec-tools/src/setkey/parse.y', self.addFile(mm.generator['file']('user',
'ipsec-tools/src/setkey/parse.y',
mm.generator['path'](), mm.generator['path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2373,7 +2395,7 @@ class netipsec(builder.Module):
'parse.h', 'parse.h',
setkey_cflags, setkey_cflags,
build=False))) build=False)))
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-shell-setkey.c', 'rtems/rtems-bsd-shell-setkey.c',
], ],
@ -2715,6 +2737,156 @@ class pf(builder.Module):
mm.generator['source']() mm.generator['source']()
) )
#
# RPC for user space, remove when NFSv2 is removed
#
class rpc_user(builder.Module):
def __init__(self, manager):
super(rpc_user, self).__init__(manager, type(self).__name__)
def generate(self):
mm = self.manager
# User space support for legacy nfsv2 client, remove when nfsv2 is removed
self.addUserSpaceHeaderFiles(
[
'include/rpc/clnt.h',
'include/rpc/pmap_rmt.h',
'include/rpc/svc_soc.h',
'include/rpc/nettype.h',
'include/rpc/xdr.h',
'include/rpc/svc.h',
'include/rpc/rpc_msg.h',
'include/rpc/rpcsec_gss.h',
'include/rpc/raw.h',
'include/rpc/clnt_stat.h',
'include/rpc/auth.h',
'include/rpc/svc_dg.h',
'include/rpc/auth_kerb.h',
'include/rpc/auth_des.h',
'include/rpc/rpcb_clnt.h',
'include/rpc/rpc.h',
'include/rpc/des.h',
'include/rpc/des_crypt.h',
'include/rpc/svc_auth.h',
'include/rpc/pmap_clnt.h',
'include/rpc/clnt_soc.h',
'include/rpc/pmap_prot.h',
'include/rpc/auth_unix.h',
'include/rpc/rpc_com.h',
'include/rpc/rpcent.h',
'include/rpcsvc/nis_db.h',
'include/rpcsvc/nislib.h',
'include/rpcsvc/nis_tags.h',
'include/rpcsvc/ypclnt.h',
'include/rpcsvc/yp_prot.h',
'lib/libc/rpc/mt_misc.h',
'lib/libc/rpc/rpc_com.h',
]
)
self.addFile(mm.generator['file']('user',
'include/rpc/rpcb_prot.x',
mm.generator['freebsd-path'](),
mm.generator['convert'](),
mm.generator['convert'](),
mm.generator['rpc-gen']()))
self.addFile(mm.generator['file']('user',
'include/rpcsvc/nis.x',
mm.generator['freebsd-path'](),
mm.generator['convert'](),
mm.generator['convert'](),
mm.generator['rpc-gen']()))
self.addUserSpaceSourceFiles(
[
'lib/libc/rpc/auth_des.c',
'lib/libc/rpc/authdes_prot.c',
'lib/libc/rpc/auth_none.c',
'lib/libc/rpc/auth_time.c',
'lib/libc/rpc/auth_unix.c',
'lib/libc/rpc/authunix_prot.c',
'lib/libc/rpc/bindresvport.c',
'lib/libc/rpc/clnt_bcast.c',
'lib/libc/rpc/clnt_dg.c',
'lib/libc/rpc/clnt_generic.c',
'lib/libc/rpc/clnt_perror.c',
'lib/libc/rpc/clnt_raw.c',
'lib/libc/rpc/clnt_simple.c',
'lib/libc/rpc/clnt_vc.c',
'lib/libc/rpc/crypt_client.c',
'lib/libc/rpc/des_crypt.c',
'lib/libc/rpc/des_soft.c',
'lib/libc/rpc/getnetconfig.c',
'lib/libc/rpc/getnetpath.c',
'lib/libc/rpc/getpublickey.c',
'lib/libc/rpc/getrpcent.c',
'lib/libc/rpc/getrpcport.c',
'lib/libc/rpc/key_call.c',
'lib/libc/rpc/key_prot_xdr.c',
'lib/libc/rpc/mt_misc.c',
'lib/libc/rpc/netname.c',
'lib/libc/rpc/netnamer.c',
'lib/libc/rpc/pmap_clnt.c',
'lib/libc/rpc/pmap_getmaps.c',
'lib/libc/rpc/pmap_getport.c',
'lib/libc/rpc/pmap_prot2.c',
'lib/libc/rpc/pmap_prot.c',
'lib/libc/rpc/pmap_rmt.c',
'lib/libc/rpc/rpcb_clnt.c',
'lib/libc/rpc/rpcb_prot.c',
'lib/libc/rpc/rpcb_st_xdr.c',
'lib/libc/rpc/rpc_callmsg.c',
'lib/libc/rpc/rpc_commondata.c',
'lib/libc/rpc/rpcdname.c',
'lib/libc/rpc/rpc_dtablesize.c',
'lib/libc/rpc/rpc_generic.c',
'lib/libc/rpc/rpc_prot.c',
'lib/libc/rpc/rpcsec_gss_stub.c',
'lib/libc/rpc/rpc_soc.c',
'lib/libc/rpc/rtime.c',
'lib/libc/rpc/svc_auth.c',
'lib/libc/rpc/svc_auth_des.c',
'lib/libc/rpc/svc_auth_unix.c',
'lib/libc/rpc/svc.c',
'lib/libc/rpc/svc_dg.c',
'lib/libc/rpc/svc_generic.c',
'lib/libc/rpc/svc_raw.c',
'lib/libc/rpc/svc_run.c',
'lib/libc/rpc/svc_simple.c',
'lib/libc/rpc/svc_vc.c',
'lib/libc/xdr/xdr_array.c',
'lib/libc/xdr/xdr.c',
'lib/libc/xdr/xdr_float.c',
'lib/libc/xdr/xdr_mem.c',
'lib/libc/xdr/xdr_rec.c',
'lib/libc/xdr/xdr_reference.c',
'lib/libc/xdr/xdr_sizeof.c',
'lib/libc/xdr/xdr_stdio.c',
],
mm.generator['source'](['-DINET'])
)
#
# NFSv2 Client
#
class nfsv2(builder.Module):
def __init__(self, manager):
super(nfsv2, self).__init__(manager, type(self).__name__)
def generate(self):
mm = self.manager
self.addDependency(mm['rpc_user'])
self.addRTEMSUserSourceFiles(
[
'nfsclient/mount_prot_xdr.c',
'nfsclient/nfs.c',
'nfsclient/nfs_prot_xdr.c',
'nfsclient/rpcio.c',
],
mm.generator['source']()
)
# #
# PCI # PCI
# #
@ -2761,6 +2933,7 @@ class pci(builder.Module):
mm.generator['source']() mm.generator['source']()
) )
# #
# User space # User space
# #
@ -2797,36 +2970,6 @@ class user_space(builder.Module):
'include/nsswitch.h', 'include/nsswitch.h',
'include/resolv.h', 'include/resolv.h',
'include/res_update.h', 'include/res_update.h',
'include/rpc/clnt.h',
'include/rpc/pmap_rmt.h',
'include/rpc/svc_soc.h',
'include/rpc/nettype.h',
'include/rpc/xdr.h',
'include/rpc/svc.h',
'include/rpc/rpc_msg.h',
'include/rpc/rpcsec_gss.h',
'include/rpc/raw.h',
'include/rpc/clnt_stat.h',
'include/rpc/auth.h',
'include/rpc/svc_dg.h',
'include/rpc/auth_kerb.h',
'include/rpc/auth_des.h',
'include/rpc/rpcb_clnt.h',
'include/rpc/rpc.h',
'include/rpc/des.h',
'include/rpc/des_crypt.h',
'include/rpc/svc_auth.h',
'include/rpc/pmap_clnt.h',
'include/rpc/clnt_soc.h',
'include/rpc/pmap_prot.h',
'include/rpc/auth_unix.h',
'include/rpc/rpc_com.h',
'include/rpc/rpcent.h',
'include/rpcsvc/nis_db.h',
'include/rpcsvc/nislib.h',
'include/rpcsvc/nis_tags.h',
'include/rpcsvc/ypclnt.h',
'include/rpcsvc/yp_prot.h',
'include/sysexits.h', 'include/sysexits.h',
'lib/lib80211/lib80211_ioctl.h', 'lib/lib80211/lib80211_ioctl.h',
'lib/lib80211/lib80211_regdomain.h', 'lib/lib80211/lib80211_regdomain.h',
@ -2856,8 +2999,6 @@ class user_space(builder.Module):
'lib/libc/net/res_config.h', 'lib/libc/net/res_config.h',
'lib/libc/resolv/res_debug.h', 'lib/libc/resolv/res_debug.h',
'lib/libc/resolv/res_private.h', 'lib/libc/resolv/res_private.h',
'lib/libc/rpc/mt_misc.h',
'lib/libc/rpc/rpc_com.h',
'lib/libc/stdio/local.h', 'lib/libc/stdio/local.h',
'lib/libkvm/kvm.h', 'lib/libkvm/kvm.h',
'lib/libmemstat/memstat.h', 'lib/libmemstat/memstat.h',
@ -2873,22 +3014,14 @@ class user_space(builder.Module):
'usr.bin/netstat/netstat.h' 'usr.bin/netstat/netstat.h'
] ]
) )
self.addFile(mm.generator['file']('include/rpc/rpcb_prot.x', self.addFile(mm.generator['file']('user',
mm.generator['freebsd-path'](), 'sbin/route/keywords',
mm.generator['convert'](),
mm.generator['convert'](),
mm.generator['rpc-gen']()))
self.addFile(mm.generator['file']('include/rpcsvc/nis.x',
mm.generator['freebsd-path'](),
mm.generator['convert'](),
mm.generator['convert'](),
mm.generator['rpc-gen']()))
self.addFile(mm.generator['file']('sbin/route/keywords',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['route-keywords']())) mm.generator['route-keywords']()))
self.addFile(mm.generator['file']('sbin/pfctl/parse.y', self.addFile(mm.generator['file']('user',
'sbin/pfctl/parse.y',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -2928,7 +3061,7 @@ class user_space(builder.Module):
'include/machine/rtems-bsd-regdomain.h', 'include/machine/rtems-bsd-regdomain.h',
] ]
) )
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-regdomain.c', 'rtems/rtems-bsd-regdomain.c',
], ],
@ -3023,72 +3156,9 @@ class user_space(builder.Module):
'lib/libc/resolv/res_send.c', 'lib/libc/resolv/res_send.c',
'lib/libc/resolv/res_state.c', 'lib/libc/resolv/res_state.c',
'lib/libc/resolv/res_update.c', 'lib/libc/resolv/res_update.c',
'lib/libc/rpc/auth_des.c',
'lib/libc/rpc/authdes_prot.c',
'lib/libc/rpc/auth_none.c',
'lib/libc/rpc/auth_time.c',
'lib/libc/rpc/auth_unix.c',
'lib/libc/rpc/authunix_prot.c',
'lib/libc/rpc/bindresvport.c',
'lib/libc/rpc/clnt_bcast.c',
'lib/libc/rpc/clnt_dg.c',
'lib/libc/rpc/clnt_generic.c',
'lib/libc/rpc/clnt_perror.c',
'lib/libc/rpc/clnt_raw.c',
'lib/libc/rpc/clnt_simple.c',
'lib/libc/rpc/clnt_vc.c',
'lib/libc/rpc/crypt_client.c',
'lib/libc/rpc/des_crypt.c',
'lib/libc/rpc/des_soft.c',
'lib/libc/rpc/getnetconfig.c',
'lib/libc/rpc/getnetpath.c',
'lib/libc/rpc/getpublickey.c',
'lib/libc/rpc/getrpcent.c',
'lib/libc/rpc/getrpcport.c',
'lib/libc/rpc/key_call.c',
'lib/libc/rpc/key_prot_xdr.c',
'lib/libc/rpc/mt_misc.c',
'lib/libc/rpc/netname.c',
'lib/libc/rpc/netnamer.c',
'lib/libc/rpc/pmap_clnt.c',
'lib/libc/rpc/pmap_getmaps.c',
'lib/libc/rpc/pmap_getport.c',
'lib/libc/rpc/pmap_prot2.c',
'lib/libc/rpc/pmap_prot.c',
'lib/libc/rpc/pmap_rmt.c',
'lib/libc/rpc/rpcb_clnt.c',
'lib/libc/rpc/rpcb_prot.c',
'lib/libc/rpc/rpcb_st_xdr.c',
'lib/libc/rpc/rpc_callmsg.c',
'lib/libc/rpc/rpc_commondata.c',
'lib/libc/rpc/rpcdname.c',
'lib/libc/rpc/rpc_dtablesize.c',
'lib/libc/rpc/rpc_generic.c',
'lib/libc/rpc/rpc_prot.c',
'lib/libc/rpc/rpcsec_gss_stub.c',
'lib/libc/rpc/rpc_soc.c',
'lib/libc/rpc/rtime.c',
'lib/libc/rpc/svc_auth.c',
'lib/libc/rpc/svc_auth_des.c',
'lib/libc/rpc/svc_auth_unix.c',
'lib/libc/rpc/svc.c',
'lib/libc/rpc/svc_dg.c',
'lib/libc/rpc/svc_generic.c',
'lib/libc/rpc/svc_raw.c',
'lib/libc/rpc/svc_run.c',
'lib/libc/rpc/svc_simple.c',
'lib/libc/rpc/svc_vc.c',
'lib/libc/stdio/fgetln.c', 'lib/libc/stdio/fgetln.c',
'lib/libc/stdlib/strtonum.c', 'lib/libc/stdlib/strtonum.c',
'lib/libc/string/strsep.c', 'lib/libc/string/strsep.c',
'lib/libc/xdr/xdr_array.c',
'lib/libc/xdr/xdr.c',
'lib/libc/xdr/xdr_float.c',
'lib/libc/xdr/xdr_mem.c',
'lib/libc/xdr/xdr_rec.c',
'lib/libc/xdr/xdr_reference.c',
'lib/libc/xdr/xdr_sizeof.c',
'lib/libc/xdr/xdr_stdio.c',
'lib/libmemstat/memstat_all.c', 'lib/libmemstat/memstat_all.c',
'lib/libmemstat/memstat.c', 'lib/libmemstat/memstat.c',
'lib/libmemstat/memstat_malloc.c', 'lib/libmemstat/memstat_malloc.c',
@ -3206,6 +3276,7 @@ class crypto_openssl(builder.Module):
def generate(self): def generate(self):
mm = self.manager mm = self.manager
self.addDependency(mm['user_space'])
self.addUserSpaceHeaderFiles( self.addUserSpaceHeaderFiles(
[ [
'crypto/openssl/crypto/aes/aes_locl.h', 'crypto/openssl/crypto/aes/aes_locl.h',
@ -4159,16 +4230,18 @@ class crypto_openssl(builder.Module):
'freebsd/crypto/openssl/crypto/ec/curve448', 'freebsd/crypto/openssl/crypto/ec/curve448',
'freebsd/crypto/openssl/crypto/ec/curve448/arch_32']) 'freebsd/crypto/openssl/crypto/ec/curve448/arch_32'])
) )
self.addFile(mm.generator['file']('crypto/openssl/crypto/LPdir_unix.c', self.addFile(mm.generator['file']('user',
'crypto/openssl/crypto/LPdir_unix.c',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'](), mm.generator['from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'](),
mm.generator['from-RTEMS-To-FreeBSD-SourceConverter'](), mm.generator['from-RTEMS-To-FreeBSD-SourceConverter'](),
mm.generator['buildSystemFragmentComposer']())) mm.generator['buildSystemComposer']()))
self.addFile(mm.generator['file']('crypto/openssl/crypto/ec/ecp_nistz256_table.c', self.addFile(mm.generator['file']('user',
'crypto/openssl/crypto/ec/ecp_nistz256_table.c',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'](), mm.generator['from-FreeBSD-to-RTEMS-UserSpaceSourceConverter'](),
mm.generator['from-RTEMS-To-FreeBSD-SourceConverter'](), mm.generator['from-RTEMS-To-FreeBSD-SourceConverter'](),
mm.generator['buildSystemFragmentComposer']())) mm.generator['buildSystemComposer']()))
self.addPlainTextFile( self.addPlainTextFile(
[ [
'crypto/openssl/LICENSE' 'crypto/openssl/LICENSE'
@ -4178,7 +4251,6 @@ class crypto_openssl(builder.Module):
# #
# /usr/bin/openssl # /usr/bin/openssl
# #
# depends on crypto_openssl, user_space
class usr_bin_openssl(builder.Module): class usr_bin_openssl(builder.Module):
def __init__(self, manager): def __init__(self, manager):
@ -4186,6 +4258,7 @@ class usr_bin_openssl(builder.Module):
def generate(self): def generate(self):
mm = self.manager mm = self.manager
self.addDependency(mm['crypto_openssl'])
self.addUserSpaceHeaderFiles( self.addUserSpaceHeaderFiles(
[ [
'crypto/openssl/apps/apps.h', 'crypto/openssl/apps/apps.h',
@ -4258,7 +4331,7 @@ class usr_bin_openssl(builder.Module):
['freebsd/crypto/openssl'] ['freebsd/crypto/openssl']
) )
) )
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-shell-openssl.c', 'rtems/rtems-bsd-shell-openssl.c',
], ],
@ -4378,14 +4451,16 @@ class contrib_libpcap(builder.Module):
) )
gen_cflags = cflags + ['-DNEED_YYPARSE_WRAPPER=1', gen_cflags = cflags + ['-DNEED_YYPARSE_WRAPPER=1',
'-Dyylval=pcap_lval'] '-Dyylval=pcap_lval']
self.addFile(mm.generator['file']('contrib/libpcap/scanner.l', self.addFile(mm.generator['file']('user',
'contrib/libpcap/scanner.l',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['lex']('pcap', mm.generator['lex']('pcap',
'scanner.c', 'scanner.c',
gen_cflags))) gen_cflags)))
self.addFile(mm.generator['file']('contrib/libpcap/grammar.y', self.addFile(mm.generator['file']('user',
'contrib/libpcap/grammar.y',
mm.generator['freebsd-path'](), mm.generator['freebsd-path'](),
mm.generator['convert'](), mm.generator['convert'](),
mm.generator['convert'](), mm.generator['convert'](),
@ -4966,7 +5041,7 @@ class usr_sbin_wpa_supplicant(builder.Module):
'freebsd/usr.sbin/wpa/wpa_supplicant', 'freebsd/usr.sbin/wpa/wpa_supplicant',
'freebsd/crypto/openssl/crypto']) 'freebsd/crypto/openssl/crypto'])
) )
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-shell-wpa_supplicant.c', 'rtems/rtems-bsd-shell-wpa_supplicant.c',
'rtems/rtems-wpa_supplicant_mutex.c', 'rtems/rtems-wpa_supplicant_mutex.c',
@ -5080,7 +5155,7 @@ class dhcpcd(builder.Module):
], ],
mm.generator['source']('-D__FreeBSD__ -DTHERE_IS_NO_FORK -DMASTER_ONLY -DINET') mm.generator['source']('-D__FreeBSD__ -DTHERE_IS_NO_FORK -DMASTER_ONLY -DINET')
) )
self.addRTEMSSourceFiles( self.addRTEMSUserSourceFiles(
[ [
'rtems/rtems-bsd-shell-dhcpcd.c', 'rtems/rtems-bsd-shell-dhcpcd.c',
], ],
@ -5118,6 +5193,7 @@ class mdnsresponder(builder.Module):
mm.generator['source']() mm.generator['source']()
) )
class dpaa(builder.Module): class dpaa(builder.Module):
def __init__(self, manager): def __init__(self, manager):
@ -5217,7 +5293,7 @@ class regulator(builder.Module):
def generate(self): def generate(self):
mm = self.manager mm = self.manager
self.addRTEMSSourceFiles( self.addRTEMSKernelSourceFiles(
[ [
'local/regdev_if.c', 'local/regdev_if.c',
'local/regnode_if.c', 'local/regnode_if.c',
@ -5386,6 +5462,9 @@ def load(mm):
mm.addModule(pf(mm)) mm.addModule(pf(mm))
mm.addModule(dev_net(mm)) mm.addModule(dev_net(mm))
mm.addModule(rpc_user(mm))
mm.addModule(nfsv2(mm))
# Add PCI # Add PCI
mm.addModule(pci(mm)) mm.addModule(pci(mm))

View File

@ -1,6 +1,6 @@
# SPDX-License-Identifier: BSD-2-Clause # SPDX-License-Identifier: BSD-2-Clause
'''LibBSD build configuration to waf integration module. """LibBSD build configuration to waf integration module.
''' """
# Copyright (c) 2015, 2020 Chris Johns <chrisj@rtems.org>. All rights reserved. # Copyright (c) 2015, 2020 Chris Johns <chrisj@rtems.org>. All rights reserved.
# #
@ -37,12 +37,6 @@
from __future__ import print_function from __future__ import print_function
# Python 3 does no longer know the basestring class. Catch that.
try:
basestring
except NameError:
basestring = (str, bytes)
import os import os
import sys import sys
import tempfile import tempfile
@ -86,11 +80,11 @@ class Builder(builder.ModuleManager):
return sources return sources
def generate(self, rtems_version): def generate(self, rtems_version):
def _dataInsert(data, cpu, frag): def _dataInsert(data, cpu, space, frag):
# #
# The default handler returns an empty string. Skip it. # The default handler returns None. Skip it.
# #
if type(frag) is not str: if frag is not None:
# Start at the top of the tree # Start at the top of the tree
d = data d = data
path = frag[0] path = frag[0]
@ -99,6 +93,10 @@ class Builder(builder.ModuleManager):
# Select the sub-part of the tree as the compile options # Select the sub-part of the tree as the compile options
# specialise how files are built. # specialise how files are built.
d = d[path[0]] d = d[path[0]]
# Group based on the space, ie kernel or user
if space not in d:
d[space] = {}
d = d[space]
if type(path[1]) is list: if type(path[1]) is list:
p = ' '.join(path[1]) p = ' '.join(path[1])
else: else:
@ -144,11 +142,14 @@ class Builder(builder.ModuleManager):
m = self[mn] m = self[mn]
if m.conditionalOn == "none": if m.conditionalOn == "none":
for f in m.files: for f in m.files:
_dataInsert(self.data, 'all', f.getFragment()) _dataInsert(self.data, 'all', f.getSpace(),
f.getFragment())
for cpu, files in sorted(m.cpuDependentSourceFiles.items()): for cpu, files in sorted(m.cpuDependentSourceFiles.items()):
for f in files: for f in files:
_dataInsert(self.data, cpu, f.getFragment()) _dataInsert(self.data, cpu, f.getSpace(),
f.getFragment())
# Start here if you need to understand self.data. Add 'True or'
if self.trace: if self.trace:
import pprint import pprint
pprint.pprint(self.data) pprint.pprint(self.data)
@ -206,23 +207,45 @@ class Builder(builder.ModuleManager):
defines += ['%s=1' % (o.strip().upper())] defines += ['%s=1' % (o.strip().upper())]
# #
# Include paths # Include paths, maintain paths for each build space.
# #
includes = [] include_paths = config['include-paths']
buildinclude = 'build-include' if 'build' not in include_paths:
if 'cpu-include-paths' in config: bld.fatal('no build include path found in include-path defaults')
buildinclude = include_paths['build']
if isinstance(buildinclude, list):
buildinclude = buildinclude[0]
inc_paths = sorted(include_paths)
inc_paths.remove('build')
inc_paths.remove('cpu')
includes = {}
for inc in inc_paths:
includes[inc] = include_paths[inc]
# cpu include paths must be the first searched
if 'cpu' in include_paths:
cpu = bld.get_env()['RTEMS_ARCH'] cpu = bld.get_env()['RTEMS_ARCH']
if cpu == "i386": for i in include_paths['cpu']:
includes += ['freebsd/sys/x86/include'] includes['kernel'].insert(0, i.replace('@CPU@', cpu))
for i in config['cpu-include-paths']: includes['kernel'] += [buildinclude]
includes += [i.replace('@CPU@', cpu)]
if 'include-paths' in config: #
includes += config['include-paths'] # Path mappings
if 'build-include-path' in config: #
buildinclude = config['build-include-path'] if 'path-mappings' in config:
if not isinstance(buildinclude, basestring): for source, target in config['path-mappings']:
buildinclude = buildinclude[0] for space in includes:
includes += [buildinclude] incs = includes[space]
if source in incs:
target = [target] if isinstance(target,
str) else target
i = incs.index(source)
incs.remove(source)
incs[i:i] = target
#
# Place the kernel include paths after the user paths
#
includes['user'] += includes['kernel']
# #
# Collect the libbsd uses # Collect the libbsd uses
@ -316,7 +339,7 @@ class Builder(builder.ModuleManager):
# KVM Symbols # KVM Symbols
# #
if 'KVMSymbols' in self.data: if 'KVMSymbols' in self.data:
kvmsymbols = self.data['KVMSymbols'] kvmsymbols = self.data['KVMSymbols']['kernel']
if 'includes' in kvmsymbols['files']: if 'includes' in kvmsymbols['files']:
kvmsymbols_includes = kvmsymbols['files']['includes'] kvmsymbols_includes = kvmsymbols['files']['includes']
else: else:
@ -328,7 +351,7 @@ class Builder(builder.ModuleManager):
bld.objects(target='kvmsymbols', bld.objects(target='kvmsymbols',
features='c', features='c',
cflags=cflags, cflags=cflags,
includes=kvmsymbols_includes + includes, includes=kvmsymbols_includes + includes['kernel'],
source=kvmsymbols['files']['all']['default'][0]) source=kvmsymbols['files']['all']['default'][0])
libbsd_use += ["kvmsymbols"] libbsd_use += ["kvmsymbols"]
@ -339,7 +362,7 @@ class Builder(builder.ModuleManager):
# #
if 'RPCGen' in self.data: if 'RPCGen' in self.data:
if bld.env.AUTO_REGEN: if bld.env.AUTO_REGEN:
rpcgen = self.data['RPCGen'] rpcgen = self.data['RPCGen']['user']
rpcname = rpcgen['files']['all']['default'][0][:-2] rpcname = rpcgen['files']['all']['default'][0][:-2]
bld(target=rpcname + '.h', bld(target=rpcname + '.h',
source=rpcname + '.x', source=rpcname + '.x',
@ -350,7 +373,7 @@ class Builder(builder.ModuleManager):
# #
if 'RouteKeywords' in self.data: if 'RouteKeywords' in self.data:
if bld.env.AUTO_REGEN: if bld.env.AUTO_REGEN:
routekw = self.data['RouteKeywords'] routekw = self.data['RouteKeywords']['user']
rkwname = routekw['files']['all']['default'][0] rkwname = routekw['files']['all']['default'][0]
rkw_rule = host_shell + "cat ${SRC} | " + \ rkw_rule = host_shell + "cat ${SRC} | " + \
"awk 'BEGIN { r = 0 } { if (NF == 1) " + \ "awk 'BEGIN { r = 0 } { if (NF == 1) " + \
@ -362,7 +385,7 @@ class Builder(builder.ModuleManager):
# Lex # Lex
# #
if 'lex' in self.data: if 'lex' in self.data:
lexes = self.data['lex'] lexes = self.data['lex']['user']
for l in sorted(lexes.keys()): for l in sorted(lexes.keys()):
lex = lexes[l]['all']['default'] lex = lexes[l]['all']['default']
if 'cflags' in lex: if 'cflags' in lex:
@ -383,7 +406,7 @@ class Builder(builder.ModuleManager):
bld.objects(target='lex_%s' % (lex['sym']), bld.objects(target='lex_%s' % (lex['sym']),
features='c', features='c',
cflags=cflags, cflags=cflags,
includes=lexIncludes + includes, includes=lexIncludes + includes['user'],
defines=defines + lexDefines, defines=defines + lexDefines,
source=lex['file'][:-2] + '.c') source=lex['file'][:-2] + '.c')
libbsd_use += ['lex_%s' % (lex['sym'])] libbsd_use += ['lex_%s' % (lex['sym'])]
@ -392,7 +415,7 @@ class Builder(builder.ModuleManager):
# Yacc # Yacc
# #
if 'yacc' in self.data: if 'yacc' in self.data:
yaccs = self.data['yacc'] yaccs = self.data['yacc']['user']
for y in sorted(yaccs.keys()): for y in sorted(yaccs.keys()):
yacc = yaccs[y]['all']['default'] yacc = yaccs[y]['all']['default']
yaccFile = yacc['file'] yaccFile = yacc['file']
@ -423,7 +446,7 @@ class Builder(builder.ModuleManager):
bld.objects(target='yacc_%s' % (yaccSym), bld.objects(target='yacc_%s' % (yaccSym),
features='c', features='c',
cflags=cflags, cflags=cflags,
includes=yaccIncludes + includes, includes=yaccIncludes + includes['user'],
defines=defines + yaccDefines, defines=defines + yaccDefines,
source=yaccFile[:-2] + '.c') source=yaccFile[:-2] + '.c')
libbsd_use += ['yacc_%s' % (yaccSym)] libbsd_use += ['yacc_%s' % (yaccSym)]
@ -433,34 +456,40 @@ class Builder(builder.ModuleManager):
# specific files for those flags. # specific files for those flags.
# #
objs = 0 objs = 0
sources = sorted(self.data['sources']) for space in sorted(self.data['sources']):
if 'default' in sources: sources = sorted(self.data['sources'][space])
sources.remove('default') if space == 'kernel' and 'default' in sources:
for flags in sources: sources.remove('default')
objs += 1 for flags in sources:
build = self.data['sources'][flags] objs += 1
target = 'objs%02d' % (objs) build = self.data['sources'][space][flags]
bld_sources = Builder._sourceList(bld, build['all']) target = 'objs%02d' % (objs)
archs = sorted(build) bld_sources = Builder._sourceList(bld, build['all'])
for i in ['all', 'cflags', 'includes']: archs = sorted(build)
if i in archs: for i in ['all', 'cflags', 'includes']:
archs.remove(i) if i in archs:
for arch in archs: archs.remove(i)
if bld.get_env()['RTEMS_ARCH'] == arch: for arch in archs:
bld_sources += Builder._sourceList(bld, build[arch]) if bld.get_env()['RTEMS_ARCH'] == arch:
bld.objects(target=target, bld_sources += Builder._sourceList(bld, build[arch])
features='c', bld_cflags = sorted(build.get('cflags', []))
cflags=cflags + sorted(build.get('cflags', [])), if 'default' in bld_cflags:
includes=sorted(build.get('includes', [])) + includes, bld_cflags.remove('default')
defines=defines, bld.objects(target=target,
source=bld_sources) features='c cxx',
libbsd_use += [target] cflags=cflags + bld_cflags,
cxxflags=cxxflags,
includes=sorted(build.get('includes', [])) +
includes[space],
defines=defines,
source=bld_sources)
libbsd_use += [target]
# #
# We hold the 'default' cflags set of files to the end to create the # We hold the kernel 'default' cflags set of files to the end to
# static library with. # create the static library with.
# #
build = self.data['sources']['default'] build = self.data['sources']['kernel']['default']
bld_sources = Builder._sourceList(bld, build['all']) bld_sources = Builder._sourceList(bld, build['all'])
archs = sorted(build) archs = sorted(build)
archs.remove('all') archs.remove('all')
@ -471,7 +500,7 @@ class Builder(builder.ModuleManager):
features='c cxx', features='c cxx',
cflags=cflags, cflags=cflags,
cxxflags=cxxflags, cxxflags=cxxflags,
includes=includes, includes=includes['kernel'],
defines=defines, defines=defines,
source=bld_sources, source=bld_sources,
use=libbsd_use) use=libbsd_use)
@ -513,9 +542,9 @@ class Builder(builder.ModuleManager):
# #
tests = [] tests = []
if 'tests' in self.data: if 'tests' in self.data:
tests = self.data['tests'] tests = self.data['tests']['user']
for testName in sorted(tests): for testName in sorted(tests):
test = self.data['tests'][testName]['all'] test = tests[testName]['all']
test_source = [] test_source = []
libs = ['bsd', 'm', 'z', 'rtemstest'] libs = ['bsd', 'm', 'z', 'rtemstest']
for cfg in test: for cfg in test:
@ -533,7 +562,7 @@ class Builder(builder.ModuleManager):
bld.program(target='%s.exe' % (testName), bld.program(target='%s.exe' % (testName),
features='cprogram', features='cprogram',
cflags=cflags, cflags=cflags,
includes=includes, includes=includes['user'],
source=test_sources, source=test_sources,
use=['bsd'], use=['bsd'],
lib=libs, lib=libs,

View File

@ -1,9 +1,9 @@
# SPDX-License-Identifier: BSD-2-Clause # SPDX-License-Identifier: BSD-2-Clause
'''RTEMS LibBSD is a transparent source build of the FreeBSD kernel """RTEMS LibBSD is a transparent source build of the FreeBSD kernel
source for RTEMS. source for RTEMS.
To use see README.waf shipped with this file. To use see README.waf shipped with this file.
''' """
# Copyright (c) 2015-2016 Chris Johns <chrisj@rtems.org>. All rights reserved. # Copyright (c) 2015-2016 Chris Johns <chrisj@rtems.org>. All rights reserved.
# #