summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChirayu Desai <cdesai@cyanogenmod.org>2013-12-12 23:50:47 +0530
committerGedare Bloom <gedare@rtems.org>2013-12-12 14:55:56 -0500
commit9b955ddf3e528ca7db47b86834e70434d27eb5bd (patch)
tree964908ea49ef93afa368713a203b8716d7afdbfb
parent257716de146683f9bab5ccb9164b359470b7317b (diff)
Replace rtems_waf with a submodule
Replace the rtems_waf subdirectory with a git-submodule that points to the git repository located at http://git.rtems.org/chrisj/rtems_waf.git
-rw-r--r--.gitmodules3
-rw-r--r--README.waf11
m---------rtems_waf0
-rw-r--r--rtems_waf/__init__.py6
-rw-r--r--rtems_waf/pkgconfig.py84
-rw-r--r--rtems_waf/rtems.py714
6 files changed, 11 insertions, 807 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..c6ec105
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "rtems_waf"]
+ path = rtems_waf
+ url = git://git.rtems.org/chrisj/rtems_waf.git
diff --git a/README.waf b/README.waf
index 623e1c2..dd339f4 100644
--- a/README.waf
+++ b/README.waf
@@ -21,7 +21,12 @@ Steps
3. Unpack this package somewhere, anywhere on your disk and change into the top
level directory.
-4. Configure with your specific settings. In this case the path to the tools
+4. Populate the git submodule:
+
+ $ git submodule init
+ $ git submodule update
+
+5. Configure with your specific settings. In this case the path to the tools
and RTEMS and provided on the command line and so do not need to be in your
path or environment [1] and we limit the build to 'sparc/sis' BSP:
@@ -32,11 +37,11 @@ Steps
You can use '--rtems-archs=sparc,i386' or
'--rtems-bsps=sparc/sis,i386/pc586' to build for more than BSP at a time.
-5. Build:
+6. Build:
$ waf
-6. Run the executable using the simulator:
+7. Run the executable using the simulator:
$ $HOME/Development/rtems/4.11/bin/sparc-rtems4.11-run \
./build/sparc-rtems4.11-sis/hello
diff --git a/rtems_waf b/rtems_waf
new file mode 160000
+Subproject 993d33b3fca2e3ddfe53b75fe6434438edd1c48
diff --git a/rtems_waf/__init__.py b/rtems_waf/__init__.py
deleted file mode 100644
index e0cd1e1..0000000
--- a/rtems_waf/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2013 Chris Johns (chrisj@rtems.org)
-#
-# This file's license is 2-clause BSD as in this distribution's LICENSE.2 file.
-#
-
-__all__ = ['rtems']
diff --git a/rtems_waf/pkgconfig.py b/rtems_waf/pkgconfig.py
deleted file mode 100644
index d865feb..0000000
--- a/rtems_waf/pkgconfig.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2013 Chris Johns (chrisj@rtems.org)
-#
-# This file's license is 2-clause BSD as in this distribution's LICENSE.2 file.
-#
-
-#
-# Pkg-config in python. Pkg-config as a tool is a good idea how-ever the
-# implementation is really Linux (or Unix) based and requires a couple of
-# packages that it should not. If it was implemented with all parts included it
-# would be portable and I suspect useful to others on platforms other than
-# Linux or Unix equivs that contain the required packages.
-#
-import re
-
-class error(Exception):
- def __init__(self, msg):
- self.msg = msg
-
- def __str__(self):
- return self.msg
-
-class package:
- def __init__(self, file = None):
- self.defines = {}
- self.fields = {}
- if file:
- self.load(file)
-
- def load(self, file):
- f = open(file)
- tm = False
- for l in f.readlines():
- l = l[:-1]
- hash = l.find('#')
- if hash >= 0:
- l = l[:hash]
- if len(l):
- d = 0
- define = False
- eq = l.find('=')
- dd = l.find(':')
- if eq > 0 and dd > 0:
- if eq < dd:
- define = True
- d = eq
- else:
- define = False
- d = dd
- elif eq >= 0:
- define = True
- d = eq
- elif dd >= 0:
- define = False
- d = dd
- if d > 0:
- lhs = l[:d].lower()
- rhs = l[d + 1:]
-
- if tm:
- print('define: ' + str(define) + ', lhs: ' + lhs + ', ' + rhs)
-
- if define:
- self.defines[lhs] = rhs
- else:
- self.fields[lhs] = rhs
-
- def get(self, label):
- if label.lower() not in self.fields:
- raise error('Label not found: ' + label)
- mre = re.compile('\$\{[^\}]+\}')
- s = self.fields[label.lower()]
- expanded = True
- tm = False
- while expanded:
- expanded = False
- if tm:
- print 'pc:get: "' + s + '"'
- ms = mre.findall(s)
- for m in ms:
- mn = m[2:-1]
- if mn.lower() in self.defines:
- s = s.replace(m, self.defines[mn.lower()])
- expanded = True
- return s
diff --git a/rtems_waf/rtems.py b/rtems_waf/rtems.py
deleted file mode 100644
index 59047f3..0000000
--- a/rtems_waf/rtems.py
+++ /dev/null
@@ -1,714 +0,0 @@
-#
-# Copyright 2012, 2013 Chris Johns (chrisj@rtems.org)
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-
-# 1. Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#
-# RTEMS support for applications.
-#
-
-import copy
-import os
-import os.path
-import pkgconfig
-import re
-import subprocess
-
-default_version = '4.11'
-default_label = 'rtems-' + default_version
-default_path = '/opt/' + default_label
-default_postfix = 'rtems' + default_version
-
-rtems_filters = None
-
-def options(opt):
- opt.add_option('--rtems',
- default = default_path,
- dest = 'rtems_path',
- help = 'Path to an installed RTEMS.')
- opt.add_option('--rtems-tools',
- default = None,
- dest = 'rtems_tools',
- help = 'Path to RTEMS tools.')
- opt.add_option('--rtems-version',
- default = default_version,
- dest = 'rtems_version',
- help = 'RTEMS version (default ' + default_version + ').')
- opt.add_option('--rtems-archs',
- default = 'all',
- dest = 'rtems_archs',
- help = 'List of RTEMS architectures to build.')
- opt.add_option('--rtems-bsps',
- default = 'all',
- dest = 'rtems_bsps',
- help = 'List of BSPs to build.')
- opt.add_option('--show-commands',
- action = 'store_true',
- default = False,
- dest = 'show_commands',
- help = 'Print the commands as strings.')
-
-def init(ctx, filters = None):
- global rtems_filters
-
- try:
- import waflib.Options
- import waflib.ConfigSet
-
- #
- # Load the configuation set from the lock file.
- #
- env = waflib.ConfigSet.ConfigSet()
- env.load(waflib.Options.lockfile)
-
- #
- # Set the RTEMS filter to the context.
- #
- rtems_filters = filters
-
- #
- # Check the tools, architectures and bsps.
- #
- rtems_path, rtems_tools, archs, arch_bsps = check_options(ctx,
- env.options['rtems_tools'],
- env.options['rtems_path'],
- env.options['rtems_version'],
- env.options['rtems_archs'],
- env.options['rtems_bsps'])
-
- #
- # Update the contextes for all the bsps.
- #
- from waflib.Build import BuildContext, CleanContext, \
- InstallContext, UninstallContext
- for x in arch_bsps:
- for y in (BuildContext, CleanContext, InstallContext, UninstallContext):
- name = y.__name__.replace('Context','').lower()
- class context(y):
- cmd = name + '-' + x
- variant = x
-
- #
- # Add the various commands.
- #
- for cmd in ['build', 'clean', 'install']:
- if cmd in waflib.Options.commands:
- waflib.Options.commands.remove(cmd)
- for x in arch_bsps:
- waflib.Options.commands.insert(0, cmd + '-' + x)
- except:
- pass
-
-def configure(conf):
- #
- # Handle the show commands option.
- #
- if conf.options.show_commands:
- show_commands = 'yes'
- else:
- show_commands = 'no'
-
- rtems_path, rtems_tools, archs, arch_bsps = check_options(conf,
- conf.options.rtems_tools,
- conf.options.rtems_path,
- conf.options.rtems_version,
- conf.options.rtems_archs,
- conf.options.rtems_bsps)
-
- if rtems_tools is None:
- conf.fatal('RTEMS tools not found.')
-
- _log_header(conf)
-
- conf.msg('Architectures', ', '.join(archs), 'YELLOW')
-
- tools = {}
- env = conf.env.derive()
-
- for ab in arch_bsps:
- conf.setenv(ab, env)
-
- conf.msg('Board Support Package', ab, 'YELLOW')
-
- arch = _arch_from_arch_bsp(ab)
-
- conf.env.RTEMS_PATH = conf.options.rtems_path
- conf.env.RTEMS_VERSION = conf.options.rtems_version
- conf.env.RTEMS_ARCH_BSP = ab
- conf.env.RTEMS_ARCH = arch.split('-')[0]
- conf.env.RTEMS_ARCH_RTEMS = arch
- conf.env.RTEMS_BSP = _bsp_from_arch_bsp(ab)
-
- tools = _find_tools(conf, arch, [rtems_path] + rtems_tools, tools)
- for t in tools[arch]:
- conf.env[t] = tools[arch][t]
-
- conf.load('gcc')
- conf.load('g++')
- conf.load('gas')
-
- flags = _load_flags(conf, ab, conf.options.rtems_path)
-
- cflags = _filter_flags('cflags', flags['CFLAGS'],
- arch, conf.options.rtems_path)
- ldflags = _filter_flags('ldflags', flags['LDFLAGS'],
- arch, conf.options.rtems_path)
-
- conf.env.CFLAGS = cflags['cflags']
- conf.env.CXXFLAGS = conf.env.CFLAGS
- conf.env.ASFLAGS = cflags['cflags']
- conf.env.WFLAGS = cflags['warnings']
- conf.env.RFLAGS = cflags['specs']
- conf.env.MFLAGS = cflags['machines']
- conf.env.IFLAGS = cflags['includes']
- conf.env.LINKFLAGS = cflags['cflags'] + ldflags['ldflags']
- conf.env.LIB = flags['LIB']
-
- #
- # Checks for various RTEMS features.
- #
- conf.multicheck({ 'header_name': 'rtems.h'},
- { 'header_name': 'rtems/score/cpuopts.h'},
- msg = 'Checking for RTEMS headers',
- mandatory = True)
- load_cpuopts(conf, ab, conf.options.rtems_path)
-
- #
- # Add tweaks.
- #
- tweaks(conf, ab)
-
- #
- # Show commands support the user can supply.
- #
- conf.env.SHOW_COMMANDS = show_commands
-
- conf.setenv('', env)
-
- conf.env.RTEMS_TOOLS = rtems_tools
- conf.env.ARCHS = archs
- conf.env.ARCH_BSPS = arch_bsps
-
- conf.env.SHOW_COMMANDS = show_commands
-
-def build(bld):
- if bld.env.SHOW_COMMANDS == 'yes':
- output_command_line()
-
-def load_cpuopts(conf, arch_bsp, rtems_path):
- options = ['RTEMS_DEBUG',
- 'RTEMS_MULTIPROCESSING',
- 'RTEMS_NEWLIB',
- 'RTEMS_POSIX_API',
- 'RTEMS_SMP',
- 'RTEMS_NETWORKING',
- 'RTEMS_ATOMIC']
- for opt in options:
- enabled = check_opt(conf, opt, 'rtems/score/cpuopts.h', arch_bsp, rtems_path)
- if enabled:
- conf.env[opt] = 'Yes'
- else:
- conf.env[opt] = 'No'
-
-def check_opt(conf, opt, header, arch_bsp, rtems_path):
- code = '#include <%s>%s' % (header, os.linesep)
- code += '#ifndef %s%s' % (opt, os.linesep)
- code += ' #error %s is not defined%s' % (opt, os.linesep)
- code += '#endif%s' % (os.linesep)
- code += '#if %s%s' % (opt, os.linesep)
- code += ' /* %s is true */%s' % (opt, os.linesep)
- code += '#else%s' % (os.linesep)
- code += ' #error %s is false%s' % (opt, os.linesep)
- code += '#endif%s' % (os.linesep)
- code += 'int main() { return 0; }%s' % (os.linesep)
- try:
- conf.check_cc(fragment = code,
- execute = False,
- define_ret = False,
- msg = 'Checking for %s' % (opt))
- except conf.errors.WafError:
- return False;
- return True
-
-def tweaks(conf, arch_bsp):
- #
- # Hack to work around NIOS2 naming.
- #
- if conf.env.RTEMS_ARCH in ['nios2']:
- conf.env.OBJCOPY_FLAGS = ['-O', 'elf32-littlenios2']
- elif conf.env.RTEMS_ARCH in ['arm']:
- conf.env.OBJCOPY_FLAGS = ['-I', 'binary', '-O', 'elf32-littlearm']
- else:
- conf.env.OBJCOPY_FLAGS = ['-O', 'elf32-' + conf.env.RTEMS_ARCH]
-
- #
- # Check for a i386 PC bsp.
- #
- if re.match('i386-.*-pc[3456]86', arch_bsp) is not None:
- conf.env.LINKFLAGS += ['-Wl,-Ttext,0x00100000']
-
- if '-ffunction-sections' in conf.env.CFLAGS:
- conf.env.LINKFLAGS += ['-Wl,--gc-sections']
-
-def check_options(ctx, rtems_tools, rtems_path, rtems_version, rtems_archs, rtems_bsps):
- #
- # Check the paths are valid.
- #
- if not os.path.exists(rtems_path):
- ctx.fatal('RTEMS path not found.')
- if os.path.exists(os.path.join(rtems_path, 'lib', 'pkgconfig')):
- rtems_config = None
- elif os.path.exists(os.path.join(rtems_path, 'rtems-config')):
- rtems_config = os.path.join(rtems_path, 'rtems-config')
- else:
- ctx.fatal('RTEMS path is not valid. No lib/pkgconfig or rtems-config found.')
- if os.path.exists(os.path.join(rtems_path, 'bin')):
- rtems_bin = os.path.join(rtems_path, 'bin')
- else:
- ctx.fatal('RTEMS path is not valid. No bin directory found.')
-
- #
- # We can more than one path to tools. This happens when testing different
- # versions.
- #
- if rtems_tools is not None:
- rt = rtems_tools.split(',')
- tools = []
- for path in rt:
- if not os.path.exists(path):
- ctx.fatal('RTEMS tools path not found: ' + path)
- if not os.path.exists(os.path.join(path, 'bin')):
- ctx.fatal('RTEMS tools path does not contain a \'bin\' directory: ' + path)
- tools += [os.path.join(path, 'bin')]
- else:
- tools = None
-
- #
- # Filter the tools.
- #
- tools = filter(ctx, 'tools', tools)
-
- #
- # Match the archs requested against the ones found. If the user
- # wants all (default) set all used.
- #
- if rtems_archs == 'all':
- archs = _find_installed_archs(rtems_config, rtems_path, rtems_version)
- else:
- archs = _check_archs(rtems_config, rtems_archs, rtems_path, rtems_version)
-
- #
- # Filter the architectures.
- #
- archs = filter(ctx, 'archs', archs)
-
- #
- # We some.
- #
- if len(archs) == 0:
- ctx.fatal('Could not find any architectures')
-
- #
- # Get the list of valid BSPs. This process filters the architectures
- # to those referenced by the BSPs.
- #
- if rtems_bsps == 'all':
- arch_bsps = _find_installed_arch_bsps(rtems_config, rtems_path, archs, rtems_version)
- else:
- arch_bsps = _check_arch_bsps(rtems_bsps, rtems_config, rtems_path, archs, rtems_version)
-
- if len(arch_bsps) == 0:
- ctx.fatal('No valid arch/bsps found')
-
- #
- # Filter the bsps.
- #
- arch_bsps = filter(ctx, 'bsps', arch_bsps)
-
- return rtems_bin, tools, archs, arch_bsps
-
-def check(ctx, option):
- if option in ctx.env:
- return ctx.env[option] == 'Yes'
- return False
-
-def check_debug(ctx):
- return check(ctx, 'RTEMS_DEBUG')
-
-def check_multiprocessing(ctx):
- return check(ctx, 'RTEMS_MULTIPROCESSING')
-
-def check_newlib(ctx):
- return check(ctx, 'RTEMS_NEWLIB')
-
-def check_posix(ctx):
- return check(ctx, 'RTEMS_POSIX_API')
-
-def check_smp(ctx):
- return check(ctx, 'RTEMS_SMP')
-
-def check_networking(ctx):
- return check(ctx, 'RTEMS_NETWORKING')
-
-def check_atomic(ctx):
- return check(ctx, 'RTEMS_ATOMIC')
-
-def arch(arch_bsp):
- """ Given an arch/bsp return the architecture."""
- return _arch_from_arch_bsp(arch_bsp).split('-')[0]
-
-def bsp(arch_bsp):
- """ Given an arch/bsp return the BSP."""
- return _bsp_from_arch_bsp(arch_bsp)
-
-def arch_bsps(ctx):
- """ Return the list of arch/bsps we are building."""
- return ctx.env.ARCH_BSPS
-
-def arch_bsp_env(ctx, arch_bsp):
- return ctx.env_of_name(arch_bsp).derive()
-
-def filter(ctx, filter, items):
- if rtems_filters is None:
- return items
- if type(rtems_filters) is not dict:
- ctx.fatal("Invalid RTEMS filter type, " \
- "ie { 'tools': { 'in': [], 'out': [] }, 'arch': {}, 'bsps': {} }")
- if filter not in rtems_filters:
- return items
- items_in = []
- items_out = []
- if 'in' in rtems_filters[filter]:
- items_in = copy.copy(rtems_filters[filter]['in'])
- if 'out' in rtems_filters[filter]:
- items_out = copy.copy(rtems_filters[filter]['out'])
- filtered_items = []
- for i in items:
- item = i
- ab = '%s/%s' % (arch(item), bsp(item))
- for inre in items_in:
- if re.compile(inre).match(ab):
- items_in.remove(inre)
- filtered_items += [item]
- item = None
- break
- if item is not None:
- for outre in items_out:
- if re.compile(outre).match(ab):
- item = None
- break
- if item is not None:
- filtered_items += [item]
- if len(items_in) != 0:
- ctx.fatal('Following %s not found: %s' % (filter, ', '.join(items_in)))
- return sorted(filtered_items)
-
-def arch_rtems_version(arch):
- """ Return the RTEMS architecture path, ie sparc-rtems4.11."""
- return '%s-%s' % (arch, default_postfix)
-
-def arch_bsp_path(arch_bsp):
- """ Return the BSP path."""
- return '%s/%s' % (arch_rtems_version(arch(arch_bsp)), bsp(arch_bsp))
-
-def arch_bsp_include_path(arch_bsp):
- """ Return the BSP include path."""
- return '%s/lib/include' % (arch_bsp_path(arch_bsp))
-
-def arch_bsp_lib_path(arch_bsp):
- """ Return the BSP library path. """
- return '%s/lib' % (arch_bsp_path(arch_bsp))
-
-def library_path(library, cc, cflags):
- cmd = cc + cflags + ['-print-file-name=%s' % library]
- a = subprocess.check_output(cmd)
- lib = os.path.abspath(a.strip())
- if os.path.exists(lib):
- return os.path.dirname(lib)
- return None
-
-def clone_tasks(bld):
- if bld.cmd == 'build':
- for obj in bld.all_task_gen[:]:
- for x in arch_bsp:
- cloned_obj = obj.clone(x)
- kind = Options.options.build_kind
- if kind.find(x) < 0:
- cloned_obj.posted = True
- obj.posted = True
-
-#
-# From the demos. Use this to get the command to cut+paste to play.
-#
-def output_command_line():
- # first, display strings, people like them
- from waflib import Utils, Logs
- from waflib.Context import Context
- def exec_command(self, cmd, **kw):
- subprocess = Utils.subprocess
- kw['shell'] = isinstance(cmd, str)
- if isinstance(cmd, str):
- Logs.info('%s' % cmd)
- else:
- Logs.info('%s' % ' '.join(cmd)) # here is the change
- Logs.debug('runner_env: kw=%s' % kw)
- try:
- if self.logger:
- self.logger.info(cmd)
- kw['stdout'] = kw['stderr'] = subprocess.PIPE
- p = subprocess.Popen(cmd, **kw)
- (out, err) = p.communicate()
- if out:
- self.logger.debug('out: %s' % out.decode(sys.stdout.encoding or 'iso8859-1'))
- if err:
- self.logger.error('err: %s' % err.decode(sys.stdout.encoding or 'iso8859-1'))
- return p.returncode
- else:
- p = subprocess.Popen(cmd, **kw)
- return p.wait()
- except OSError:
- return -1
- Context.exec_command = exec_command
-
- # Change the outputs for tasks too
- from waflib.Task import Task
- def display(self):
- return '' # no output on empty strings
-
- Task.__str__ = display
-
-def _find_tools(conf, arch, paths, tools):
- if arch not in tools:
- arch_tools = {}
- arch_tools['CC'] = conf.find_program([arch + '-gcc'], path_list = paths)
- arch_tools['CXX'] = conf.find_program([arch + '-g++'], path_list = paths)
- arch_tools['AS'] = conf.find_program([arch + '-gcc'], path_list = paths)
- arch_tools['LD'] = conf.find_program([arch + '-ld'], path_list = paths)
- arch_tools['AR'] = conf.find_program([arch + '-ar'], path_list = paths)
- arch_tools['LINK_CC'] = arch_tools['CC']
- arch_tools['LINK_CXX'] = arch_tools['CXX']
- arch_tools['AR'] = conf.find_program([arch + '-ar'], path_list = paths)
- arch_tools['LD'] = conf.find_program([arch + '-ld'], path_list = paths)
- arch_tools['NM'] = conf.find_program([arch + '-nm'], path_list = paths)
- arch_tools['OBJDUMP'] = conf.find_program([arch + '-objdump'], path_list = paths)
- arch_tools['OBJCOPY'] = conf.find_program([arch + '-objcopy'], path_list = paths)
- arch_tools['READELF'] = conf.find_program([arch + '-readelf'], path_list = paths)
- arch_tools['STRIP'] = conf.find_program([arch + '-strip'], path_list = paths)
- arch_tools['RTEMS_LD'] = conf.find_program(['rtems-ld'], path_list = paths,
- mandatory = False)
- arch_tools['RTEMS_BIN2C'] = conf.find_program(['rtems-bin2c'], path_list = paths,
- mandatory = False)
- arch_tools['TAR'] = conf.find_program(['tar'], mandatory = False)
- tools[arch] = arch_tools
- return tools
-
-def _find_installed_archs(config, path, version):
- archs = []
- if config is None:
- for d in os.listdir(path):
- if d.endswith('-rtems' + version):
- archs += [d]
- else:
- a = subprocess.check_output([config, '--list-format', '"%(arch)s"'])
- a = a[:-1].replace('"', '')
- archs = set(a.split())
- archs = ['%s-rtems4.11' % (x) for x in archs]
- archs.sort()
- return archs
-
-def _check_archs(config, req, path, version):
- installed = _find_installed_archs(config, path, version)
- archs = []
- for a in req.split(','):
- arch = a + '-rtems' + version
- if arch in installed:
- archs += [arch]
- archs.sort()
- return archs
-
-def _find_installed_arch_bsps(config, path, archs, version):
- arch_bsps = []
- if config is None:
- for f in os.listdir(_pkgconfig_path(path)):
- if f.endswith('.pc'):
- if _arch_from_arch_bsp(f[:-3]) in archs:
- arch_bsps += [f[:-3]]
- else:
- ab = subprocess.check_output([config, '--list-format'])
- ab = ab[:-1].replace('"', '')
- ab = ab.replace('/', '-rtems%s-' % (version))
- arch_bsps = [x for x in set(ab.split())]
- arch_bsps.sort()
- return arch_bsps
-
-def _check_arch_bsps(req, config, path, archs, version):
- archs_bsps = []
- for ab in req.split(','):
- abl = ab.split('/')
- if len(abl) != 2:
- return []
- found = False
- for arch in archs:
- a = '%s-rtems%s' % (abl[0], version)
- if a == arch:
- found = True
- break
- if not found:
- return []
- archs_bsps += ['%s-%s' % (a, abl[1])]
- if len(archs_bsps) == 0:
- return []
- installed = _find_installed_arch_bsps(config, path, archs, version)
- bsps = []
- for b in archs_bsps:
- if b in installed:
- bsps += [b]
- bsps.sort()
- return bsps
-
-def _arch_from_arch_bsp(arch_bsp):
- return '-'.join(arch_bsp.split('-')[:2])
-
-def _bsp_from_arch_bsp(arch_bsp):
- return '-'.join(arch_bsp.split('-')[2:])
-
-def _pkgconfig_path(path):
- return os.path.join(path, 'lib', 'pkgconfig')
-
-def _load_flags(conf, arch_bsp, path):
- if not os.path.exists(path):
- ctx.fatal('RTEMS path not found.')
- if os.path.exists(_pkgconfig_path(path)):
- pc = os.path.join(_pkgconfig_path(path), arch_bsp + '.pc')
- conf.to_log('Opening and load pkgconfig: ' + pc)
- pkg = pkgconfig.package(pc)
- config = None
- elif os.path.exists(os.path.join(path, 'rtems-config')):
- config = os.path.join(path, 'rtems-config')
- pkg = None
- flags = {}
- _log_header(conf)
- flags['CFLAGS'] = _load_flags_set('CFLAGS', arch_bsp, conf, config, pkg)
- flags['LDFLAGS'] = _load_flags_set('LDFLAGS', arch_bsp, conf, config, pkg)
- flags['LIB'] = _load_flags_set('LIB', arch_bsp, conf, config, pkg)
- return flags
-
-def _load_flags_set(flags, arch_bsp, conf, config, pkg):
- conf.to_log('%s ->' % flags)
- if pkg is not None:
- flagstr = ''
- try:
- flagstr = pkg.get(flags)
- except pkgconfig.error as e:
- conf.to_log('pkconfig warning: ' + e.msg)
- conf.to_log(' ' + flagstr)
- else:
- flags_map = { 'CFLAGS': '--cflags',
- 'LDFLAGS': '--ldflags',
- 'LIB': '--libs' }
- ab = arch_bsp.split('-')
- #conf.check_cfg(path = config,
- # package = '',
- # uselib_store = 'rtems',
- # args = '--bsp %s/%s %s' % (ab[0], ab[2], flags_map[flags]))
- #print conf.env
- #print '%r' % conf
- #flagstr = '-l -c'
- flagstr = subprocess.check_output([config, '--bsp', '%s/%s' % (ab[0], ab[2]), flags_map[flags]])
- #print flags, ">>>>", flagstr
- if flags == 'CFLAGS':
- flagstr += ' -DWAF_BUILD=1'
- if flags == 'LIB':
- flagstr = 'rtemscpu rtemsbsp c rtemscpu rtemsbsp'
- return flagstr.split()
-
-def _filter_flags(label, flags, arch, rtems_path):
-
- flag_groups = \
- [ { 'key': 'warnings', 'path': False, 'flags': { '-W': 1 }, 'cflags': False, 'lflags': False },
- { 'key': 'includes', 'path': True, 'flags': { '-I': 1, '-isystem': 2, '-sysroot': 2 } },
- { 'key': 'machines', 'path': True, 'flags': { '-O': 1, '-m': 1, '-f': 1 } },
- { 'key': 'specs', 'path': True, 'flags': { '-q': 1, '-B': 2, '--specs': 2 } } ]
-
- flags = _strip_cflags(flags)
-
- _flags = { label: [] }
- for fg in flag_groups:
- _flags[fg['key']] = []
-
- iflags = iter(flags)
- for opt in iflags:
- in_label = True
- opts = []
- for fg in flag_groups:
- key = fg['key']
- for flag in fg['flags']:
- if opt.startswith(flag):
- opt_count = fg['flags'][flag]
- if opt_count > 1:
- if opt != flag:
- opt_count -= 1
- if fg['path'] and arch in opt:
- opt = '%s%s/%s' % (flag, rtems_path,
- opt[opt.find(arch):])
- opts += [opt]
- for c in range(1, opt_count):
- opt = next(iflags)
- if fg['path'] and arch in opt:
- opt = '%s%s/%s' % (f, rtems_path,
- opt[opt.find(arch):])
- opts += [opt]
- _flags[key] += opts
- if label in fg and not fg[label]:
- in_label = False
- break
- if in_label:
- _flags[label] += opts
- return _flags
-
-def _strip_cflags(cflags):
- _cflags = []
- for o in cflags:
- if o.startswith('-O'):
- pass
- elif o.startswith('-g'):
- pass
- else:
- _cflags += [o]
- return _cflags
-
-def _log_header(conf):
- conf.to_log('-----------------------------------------')
-
-from waflib import Task
-from waflib import TaskGen
-from waflib import Utils
-from waflib import Node
-from waflib.Tools.ccroot import link_task, USELIB_VARS
-USELIB_VARS['rap'] = set(['RTEMS_LINKFLAGS'])
-@TaskGen.extension('.c')
-class rap(link_task):
- "Link object files into a RTEMS application"
- run_str = '${RTEMS_LD} ${RTEMS_LINKFLAGS} --cc ${CC} ${SRC} -o ${TGT[0].abspath()} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}'
- ext_out = ['.rap']
- vars = ['RTEMS_LINKFLAGS', 'LINKDEPS']
- inst_to = '${BINDIR}'