mirror of
https://git.rtems.org/rtems-source-builder
synced 2024-10-09 07:15:10 +08:00
Add an RTEMS config wrapper around Makefile.inc.
This is an internal command that wraps the Makefile.inc file in a BSP so you can get at the configuration values from the command line without knowing anything about Makefile.inc. To use: $ ../source-builder/sb-rtems-config \ --rtems=$HOME/development/rtems/4.11 \ --rtems-bsp=sis \ rtems_cpu_cflags The option '--list' lists all available configuration values. The configuration values are match case insensitive and you can list a number with each printed on a separate line. The --rtems-bsp can be in new coming standard of arch/bsp such as 'sparc/sis' or you can just supply the bsp, eg 'sis'.
This commit is contained in:
parent
e191ce83ac
commit
e2266055bc
29
source-builder/sb-rtems-config
Executable file
29
source-builder/sb-rtems-config
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
#
|
||||||
|
# RTEMS Tools Project (http://www.rtems.org/)
|
||||||
|
# Copyright 2010-2012 Chris Johns (chrisj@rtems.org)
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is part of the RTEMS Tools package in 'rtems-tools'.
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
# purpose with or without fee is hereby granted, provided that the above
|
||||||
|
# copyright notice and this permission notice appear in all copies.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
base = os.path.dirname(sys.argv[0])
|
||||||
|
sys.path.insert(0, base + '/sb')
|
||||||
|
try:
|
||||||
|
import rtemsconfig
|
||||||
|
rtemsconfig.run(sys.argv)
|
||||||
|
except ImportError:
|
||||||
|
print >> sys.stderr, "Incorrect Set Bulder installation"
|
||||||
|
sys.exit(1)
|
43
source-builder/sb/rtemsconfig.mk
Normal file
43
source-builder/sb/rtemsconfig.mk
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# Makefile to extract the contents of the Makefile.inc
|
||||||
|
#
|
||||||
|
# Use with 'gmake -f rtems-config.mk makefile_inc=/path/Makefile.inc
|
||||||
|
#
|
||||||
|
|
||||||
|
MAKEFLAGS=-n
|
||||||
|
|
||||||
|
VARS_OLD := $(.VARIABLES)
|
||||||
|
|
||||||
|
include $(makefile_inc)
|
||||||
|
include $(RTEMS_CUSTOM)
|
||||||
|
|
||||||
|
out = $(info $(1)=$(2))
|
||||||
|
|
||||||
|
all:
|
||||||
|
RTEMS_BSP=$(RTEMS_BSP)
|
||||||
|
RTEMS_CPU=$(RTEMS_CPU)
|
||||||
|
RTEMS_CPU_MODEL=$(RTEMS_CPU_MODEL)
|
||||||
|
RTEMS_API=$(RTEMS_API)
|
||||||
|
prefix=$(prefix)
|
||||||
|
exec_prefix=$(exec_prefix)
|
||||||
|
RTEMS_ROOT=$(prefix)
|
||||||
|
PROJECT_ROOT=$(RTEMS_ROOT)
|
||||||
|
RTEMS_CUSTOM=$(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||||
|
RTEMS_SHARE=$(RTEMS_ROOT)/share/rtems$(RTEMS_API)
|
||||||
|
CC_FOR_TARGET=$(CC_FOR_TARGET)
|
||||||
|
CXX_FOR_TARGET=$(CXX_FOR_TARGET)
|
||||||
|
AS_FOR_TARGET=$(AS_FOR_TARGET)
|
||||||
|
AR_FOR_TARGET=$(AR_FOR_TARGET)
|
||||||
|
NM_FOR_TARGET=$(NM_FOR_TARGET)
|
||||||
|
LD_FOR_TARGET=$(LD_FOR_TARGET)
|
||||||
|
SIZE_FOR_TARGET=$(SIZE_FOR_TARGET)
|
||||||
|
OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET)
|
||||||
|
RTEMS_HAS_MP=$(RTEMS_HAS_MULTIPROCESSING)
|
||||||
|
RTEMS_HAS_POSIX_API=$(RTEMS_HAS_POSIX_API)
|
||||||
|
RTEMS_HAS_ITRON_API=$(RTEMS_HAS_ITRON_API)
|
||||||
|
RTEMS_HAS_CPLUSPLUS=$(RTEMS_HAS_CPLUSPLUS)
|
||||||
|
RTEMS_HAS_NETWORKING=$(RTEMS_HAS_NETWORKING)
|
||||||
|
RTEMS_CPU_CFLAGS=$(CPU_CFLAGS)
|
||||||
|
RTEMS_CFLAGS=$(CFLAGS)
|
||||||
|
BSP_POST_LINK=$(bsp-post-link)
|
||||||
|
Y=$(foreach V, $(sort $(filter-out $(VARS_OLD), $(.VARIABLES))), $(call out, $(V), $($(V))))
|
216
source-builder/sb/rtemsconfig.py
Normal file
216
source-builder/sb/rtemsconfig.py
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
#
|
||||||
|
# RTEMS Tools Project (http://www.rtems.org/)
|
||||||
|
# Copyright 2013 Chris Johns (chrisj@rtems.org)
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is part of the RTEMS Tools package in 'rtems-tools'.
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
# purpose with or without fee is hereby granted, provided that the above
|
||||||
|
# copyright notice and this permission notice appear in all copies.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
#
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import operator
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
import error
|
||||||
|
import log
|
||||||
|
import options
|
||||||
|
import path
|
||||||
|
import version
|
||||||
|
|
||||||
|
def _collect(path_, file):
|
||||||
|
confs = []
|
||||||
|
for root, dirs, files in os.walk(path.host(path_), topdown = True):
|
||||||
|
for f in files:
|
||||||
|
if f == file:
|
||||||
|
confs += [path.shell(path.join(root, f))]
|
||||||
|
return confs
|
||||||
|
|
||||||
|
def _grep(file, pattern):
|
||||||
|
rege = re.compile(pattern)
|
||||||
|
try:
|
||||||
|
f = open(path.host(file), 'r')
|
||||||
|
matches = [rege.match(l) != None for l in f.readlines()]
|
||||||
|
f.close()
|
||||||
|
except IOError, err:
|
||||||
|
raise error.general('error reading: %s' % (file))
|
||||||
|
return True in matches
|
||||||
|
|
||||||
|
class command:
|
||||||
|
|
||||||
|
def __init__(self, opts, cmd, cwd = None):
|
||||||
|
self.exit_code = 0
|
||||||
|
self.output = None
|
||||||
|
self.opts = opts
|
||||||
|
self.cmd = cmd
|
||||||
|
self.cwd = cwd
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
#
|
||||||
|
# Support Python 2.6
|
||||||
|
#
|
||||||
|
if "check_output" not in dir(subprocess):
|
||||||
|
def f(*popenargs, **kwargs):
|
||||||
|
if 'stdout' in kwargs:
|
||||||
|
raise ValueError('stdout argument not allowed, it will be overridden.')
|
||||||
|
process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
|
||||||
|
output, unused_err = process.communicate()
|
||||||
|
retcode = process.poll()
|
||||||
|
if retcode:
|
||||||
|
cmd = kwargs.get("args")
|
||||||
|
if cmd is None:
|
||||||
|
cmd = popenargs[0]
|
||||||
|
raise CalledProcessError(retcode, cmd)
|
||||||
|
return output
|
||||||
|
subprocess.check_output = f
|
||||||
|
|
||||||
|
self.start_time = datetime.datetime.now()
|
||||||
|
self.exit_code = 0
|
||||||
|
try:
|
||||||
|
cmd = [self.opts.defaults.expand(c) for c in self.cmd]
|
||||||
|
self.output = subprocess.check_output(cmd, cwd = self.cwd)
|
||||||
|
except subprocess.CalledProcessError, cpe:
|
||||||
|
self.exit_code = cpe.returncode
|
||||||
|
self.output = cpe.output
|
||||||
|
self.end_time = datetime.datetime.now()
|
||||||
|
|
||||||
|
class bsp_config:
|
||||||
|
|
||||||
|
filter_out = ['as', 'cc', 'ld', 'objcopy', 'size' ]
|
||||||
|
|
||||||
|
def __init__(self, opts, prefix, arch_bsp):
|
||||||
|
self.opts = opts
|
||||||
|
self.prefix = prefix
|
||||||
|
if not path.exists(prefix):
|
||||||
|
raise error.general('RTEMS prefix path not found: %s' % (prefix))
|
||||||
|
self.makefile_inc = None
|
||||||
|
if '/' in arch_bsp:
|
||||||
|
arch, bsp = arch_bsp.split('/', 1)
|
||||||
|
else:
|
||||||
|
arch = None
|
||||||
|
bsp = arch_bsp
|
||||||
|
makefile_incs = _collect(prefix, 'Makefile.inc')
|
||||||
|
for mi in makefile_incs:
|
||||||
|
found = True
|
||||||
|
if arch is not None and arch not in mi:
|
||||||
|
found = False
|
||||||
|
if bsp not in mi:
|
||||||
|
found = False
|
||||||
|
if found:
|
||||||
|
self.makefile_inc = mi
|
||||||
|
break
|
||||||
|
if self.makefile_inc is None:
|
||||||
|
raise error.general('RTEMS BSP not found: %s' % (arch_bsp))
|
||||||
|
if not path.exists(self.makefile_inc):
|
||||||
|
raise error.general('RTEMS BSP configuration not found: %s: %s' % \
|
||||||
|
(arch_bsp, self.makefile_inc))
|
||||||
|
self.command = command(opts, ['%{__make}',
|
||||||
|
'-f' '%{_sbdir}/sb/rtemsconfig.mk',
|
||||||
|
'makefile_inc=%s' % (self.makefile_inc)])
|
||||||
|
self.command.run()
|
||||||
|
self.parse(self.command.output)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
s = None
|
||||||
|
for c in sorted(self.configs.keys()):
|
||||||
|
if s is None:
|
||||||
|
s = ''
|
||||||
|
else:
|
||||||
|
s += os.linesep
|
||||||
|
s += '%s = %s' % (c, self.configs[c])
|
||||||
|
return s
|
||||||
|
|
||||||
|
def parse(self, text):
|
||||||
|
self.configs = {}
|
||||||
|
lines = text.splitlines()
|
||||||
|
lc = 0
|
||||||
|
while lc < len(lines):
|
||||||
|
l = lines[lc].strip()
|
||||||
|
lc += 1
|
||||||
|
if len(l) == 0 or l[0] == '#' or '=' not in l:
|
||||||
|
continue
|
||||||
|
key = l[:l.index('=')].strip()
|
||||||
|
data = l[l.index('=') + 1:].strip()
|
||||||
|
if len(data) == 0:
|
||||||
|
continue
|
||||||
|
if data[0] == '"':
|
||||||
|
if len(data) == 1 or data[-1] != '"':
|
||||||
|
not_closed = True
|
||||||
|
while lc < len(lines) and not_closed:
|
||||||
|
l = lines[lc]
|
||||||
|
lc += 1
|
||||||
|
if l[-1] == '"':
|
||||||
|
data += l
|
||||||
|
not_close = False
|
||||||
|
self.configs[key] = data
|
||||||
|
|
||||||
|
def keys(self):
|
||||||
|
_keys = {}
|
||||||
|
for k in sorted(self.configs.keys()):
|
||||||
|
_keys[k.lower()] = k
|
||||||
|
return _keys
|
||||||
|
|
||||||
|
def find(self, name):
|
||||||
|
_keys = self.keys()
|
||||||
|
nl = name.lower()
|
||||||
|
if nl in _keys and not nl in bsp_config.filter_out:
|
||||||
|
return self.configs[_keys[nl]]
|
||||||
|
raise error.general('invalid configuration: %s' % (name))
|
||||||
|
|
||||||
|
def run(args):
|
||||||
|
try:
|
||||||
|
optargs = { '--rtems': 'The RTEMS source directory',
|
||||||
|
'--rtems-bsp': 'The RTEMS BSP (arch/bsp)',
|
||||||
|
'--list': 'List the configurations' }
|
||||||
|
opts = options.load(sys.argv, optargs)
|
||||||
|
|
||||||
|
if opts.get_arg('--rtems'):
|
||||||
|
prefix = opts.get_arg('--rtems')[1]
|
||||||
|
else:
|
||||||
|
prefix = os.getcwd()
|
||||||
|
if opts.get_arg('--rtems-bsp') is None:
|
||||||
|
raise error.general('no --rtems-bsp option; please provide')
|
||||||
|
|
||||||
|
bsp = bsp_config(opts, prefix, opts.get_arg('--rtems-bsp')[1])
|
||||||
|
|
||||||
|
if opts.get_arg('--list'):
|
||||||
|
log.notice('RTEMS Source Builder - RTEMS Configuration, v%s' % (version.str()))
|
||||||
|
configs = bsp.keys()
|
||||||
|
for c in sorted(configs.keys()):
|
||||||
|
print c
|
||||||
|
else:
|
||||||
|
for p in opts.params():
|
||||||
|
print bsp.find(p)
|
||||||
|
|
||||||
|
except error.general, gerr:
|
||||||
|
print gerr
|
||||||
|
sys.exit(1)
|
||||||
|
except error.internal, ierr:
|
||||||
|
print ierr
|
||||||
|
sys.exit(1)
|
||||||
|
except error.exit, eerr:
|
||||||
|
pass
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
log.notice('abort: user terminated')
|
||||||
|
sys.exit(1)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
run(sys.argv)
|
Loading…
x
Reference in New Issue
Block a user