summaryrefslogtreecommitdiff
path: root/rtemstoolkit
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2018-10-03 11:38:09 +1000
committerChris Johns <chrisj@rtems.org>2018-10-03 11:38:09 +1000
commit3bd8def2106f831d3af4fca61bb00881b3a6e2c0 (patch)
tree55cb04be4a8178e24caba2890bcd016acb5c596f /rtemstoolkit
parent5416cfa39dd6b386958571f925b72a15fd63372b (diff)
config: Consolidate the version information into a single configuration file
Diffstat (limited to 'rtemstoolkit')
-rw-r--r--rtemstoolkit/check.py2
-rw-r--r--rtemstoolkit/options.py4
-rwxr-xr-xrtemstoolkit/rtems.py59
-rw-r--r--rtemstoolkit/version.py196
4 files changed, 225 insertions, 36 deletions
diff --git a/rtemstoolkit/check.py b/rtemstoolkit/check.py
index cbec3a3..c6549bf 100644
--- a/rtemstoolkit/check.py
+++ b/rtemstoolkit/check.py
@@ -168,7 +168,7 @@ def run():
try:
_opts = options.command_line(argv = sys.argv)
options.load(_opts)
- log.notice('RTEMS Source Builder - Check, v%s' % (version.str()))
+ log.notice('RTEMS Source Builder - Check, v%s' % (version.string()))
if host_setup(_opts):
print('Environment is ok')
else:
diff --git a/rtemstoolkit/options.py b/rtemstoolkit/options.py
index 98b5854..77d9593 100644
--- a/rtemstoolkit/options.py
+++ b/rtemstoolkit/options.py
@@ -289,7 +289,7 @@ class command_line(object):
def help(self):
print('%s: [options] [args]' % (self.command_name))
- print('RTEMS Tools Project (c) 2012-2015 Chris Johns')
+ print('RTEMS Tools Project, %s' % (version.string()))
print('Options and arguments:')
opts = list(self.long_opts_help.keys())
if self.optargs:
@@ -559,7 +559,7 @@ def run(args):
long_opts = long_opts,
command_path = '.')
load(opts)
- log.notice('RTEMS Tools Project - Defaults, v%s' % (version.str()))
+ log.notice('RTEMS Tools Project - Defaults, v%s' % (version.string()))
opts.log_info()
log.notice('Options:')
log.notice(str(opts))
diff --git a/rtemstoolkit/rtems.py b/rtemstoolkit/rtems.py
index 13b1e7a..8aa22e5 100755
--- a/rtemstoolkit/rtems.py
+++ b/rtemstoolkit/rtems.py
@@ -1,6 +1,6 @@
#
# RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 20162018 Chris Johns (chrisj@rtems.org)
+# Copyright 2016-2018 Chris Johns (chrisj@rtems.org)
# All rights reserved.
#
# This file is part of the RTEMS Tools package in 'rtems-tools'.
@@ -33,26 +33,69 @@ from __future__ import print_function
import copy
import os
import re
+import sys
import textwrap
from rtemstoolkit import configuration as configuration_
from rtemstoolkit import error
+from rtemstoolkit import path
from rtemstoolkit import textbox
-from rtemstoolkit import version
+#
+# The default path we install RTEMS under
+#
+_prefix_path = '/opt/rtems'
+
+def default_prefix():
+ from rtemstoolkit import version
+ return path.join(_prefix_path, version.version())
def clean_windows_path():
- #
- # On Windows MSYS2 prepends a path to itself to the environment
- # path. This means the RTEMS specific automake is not found and which
- # breaks the bootstrap. We need to remove the prepended path. Also
- # remove any ACLOCAL paths from the environment.
- #
+ '''On Windows MSYS2 prepends a path to itself to the environment path. This
+ means the RTEMS specific automake is not found and which breaks the
+ bootstrap. We need to remove the prepended path. Also remove any ACLOCAL
+ paths from the environment.
+
+ '''
if os.name == 'nt':
cspath = os.environ['PATH'].split(os.pathsep)
if 'msys' in cspath[0] and cspath[0].endswith('bin'):
os.environ['PATH'] = os.pathsep.join(cspath[1:])
+def configuration_path():
+ '''Return the path the configuration data path for RTEMS. The path is relative
+ to the installed executable. Mangage the installed package and the in source
+ tree when running from within the rtems-tools repo.
+
+ '''
+ exec_name = os.path.abspath(sys.argv[0])
+ for top in [os.path.dirname(exec_name),
+ os.path.dirname(os.path.dirname(exec_name))]:
+ config_path = path.join(top, 'share', 'rtems', 'config')
+ if path.exists(config_path):
+ break
+ config_path = path.join(top, 'config')
+ if path.exists(config_path):
+ break
+ config_path = None
+ return config_path
+
+def configuration_file(config):
+ '''Return the path to a configuration file for RTEMS. The path is relative to
+ the installed executable or we are testing and running from within the
+ rtems-tools repo.
+
+ '''
+ return path.join(configuration_path(), config)
+
+def bsp_configuration_file():
+ '''Return the path to the BSP configuration file for RTEMS. The path is
+ relative to the installed executable or we are testing and running from
+ within the rtems-tools repo.
+
+ '''
+ return configuration_file('rtems-bsps.ini')
+
class configuration:
def __init__(self):
diff --git a/rtemstoolkit/version.py b/rtemstoolkit/version.py
index 6c2e5e6..d538d2a 100644
--- a/rtemstoolkit/version.py
+++ b/rtemstoolkit/version.py
@@ -1,6 +1,6 @@
#
# RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
+# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
# All rights reserved.
#
# This file is part of the RTEMS Tools package in 'rtems-tools'.
@@ -29,83 +29,229 @@
#
#
-# To release RTEMS Tools create a git archive and then add a suitable VERSION
-# file to the top directory.
+# Releasing RTEMS Tools
+# ---------------------
+#
+# Format:
+#
+# The format is INI. The file requires a `[version`] section and a `revision`
+# option:
+#
+# [version]
+# revision = <version-string>
+#
+# The `<version-string>` has the `version` and `revision` delimited by a
+# single `.`. An example file is:
+#
+# [version]
+# revision = 5.0.not_released
+#
+# where the `version` is `5` and the revision is `0` and the package is not
+# released. The label `not_released` is reversed to mean the package is not
+# released. A revision string can contain extra characters after the
+# `revision` number for example `5.0-rc1` or is deploying a package
+# `5.0-nasa-cfs`
+#
+# Packages can optionally add specialised sections to a version configuration
+# files. These can be accessed via the:
+#
+# load_release_settings: Return the items in a section
+# load_release_setting: Return an item from a section
+#
+# User deployment:
+#
+# Create a git archive and then add a suitable VERSION file to the top
+# directory of the package. The package assumes your python executable is
+# location in `bin` directory which is one below the top of the package's
+# install prefix.
+#
+# RTEMS Release:
+#
+# Set the values in the `rtems-version.ini` file. This is a shared file so
+# packages and encouraged to add specific settings to other configuration
+# files.
+#
+# Notes:
+#
+# This module uses os.apth for paths and assumes all paths are in the host
+# format.
#
from __future__ import print_function
+import itertools
+import os
import sys
+try:
+ import configparser
+except ImportError:
+ import ConfigParser as configparser
+
#
-# Support to handle use in a package and as a unit test.
+# Support to handle importing when installed in a package and as a unit test.
# If there is a better way to let us know.
#
try:
from . import error
from . import git
- from . import path
+ from . import rtems
except (ValueError, SystemError):
import error
import git
import path
+ import rtems
#
# Default to an internal string.
#
-_version = '5'
+_version = 'undefined'
_revision = 'not_released'
_version_str = '%s.%s' % (_version, _revision)
_released = False
_git = False
+_is_loaded = False
+
+def _top():
+ top = os.path.dirname(sys.argv[0])
+ if len(top) == 0:
+ top = '.'
+ return top
-def _at():
- return path.dirname(__file__)
+def _load_released_version_config():
+ '''Local worker to load a configuration file.'''
+ top = _top()
+ for ver in [os.path.join(top, 'VERSION'),
+ os.path.join('..', 'VERSION'),
+ rtems.configuration_file('rtems-version.ini')]:
+ if os.path.exists(os.path.join(ver)):
+ v = configparser.SafeConfigParser()
+ try:
+ v.read(ver)
+ except Exception as e:
+ raise error.general('Invalid version config format: %s: %s' % (ver,
+ e))
+ return ver, v
+ return None, None
def _load_released_version():
+ '''Load the release data if present. If not found the package is not released.
+
+ A release can be made by adding a file called `VERSION` to the top level
+ directory of a package. This is useful for user deploying a package and
+ making custom releases.
+
+ The RTEMS project reserves the `rtems-version.ini` file for it's
+ releases. This is the base release and should not be touched by users
+ deploying a package.
+
+ '''
+ global _version
+ global _revision
global _released
global _version_str
- at = _at()
- for ver in [at, path.join(at, '..')]:
- if path.exists(path.join(ver, 'VERSION')):
+ global _is_loaded
+
+ if not _is_loaded:
+ vc, v = _load_released_version_config()
+ if v is not None:
try:
- import configparser
- except ImportError:
- import ConfigParser as configparser
- v = configparser.SafeConfigParser()
- v.read(path.join(ver, 'VERSION'))
- _version_str = v.get('version', 'release')
- _released = True
+ ver_str = v.get('version', 'revision')
+ except Exception as e:
+ raise error.general('Invalid version file: %s: %s' % (vc, e))
+ ver_split = ver_str.split('.')
+ if len(ver_split) < 2:
+ raise error.general('Invalid version release value: %s: %s' % (vc,
+ ver_str))
+ ver = ver_split[0]
+ rev = '.'.join(ver_split[1:])
+ try:
+ _version = int(ver)
+ except:
+ raise error.general('Invalid version config value: %s: %s' % (vc,
+ ver))
+ try:
+ _revision = int(''.join(itertools.takewhile(str.isdigit, rev)))
+ except Exception as e:
+ raise error.general('Invalid revision config value: %s: %s: %s' % (vc,
+ rev,
+ e))
+ if not 'not_released' in ver:
+ _released = True
+ _version_str = ver_str
+ _is_loaded = True
return _released
def _load_git_version():
+ global _version
+ global _revision
global _git
global _version_str
- repo = git.repo(_at())
+ repo = git.repo(_top())
if repo.valid():
head = repo.head()
if repo.dirty():
- modified = ' modified'
+ modified = 'modified'
+ sep = ' '
else:
modified = ''
- _version_str = '%s (%s%s)' % (_version, head[0:12], modified)
+ sep = ''
+ _revision = '%s-%s' % (head[0:12], modified)
+ _version_str = '%s (%s%s%s)' % (_version, head[0:12], sep, modified)
_git = True
return _git
+def load_release_settings(section, error = False):
+ vc, v = _load_released_version_config()
+ items = []
+ if v is not None:
+ try:
+ items = v.items(section)
+ except Exception as e:
+ if not isinstance(error, bool):
+ error(e)
+ elif error:
+ raise error.general('Invalid config section: %s: %s: %s' % (vc,
+ section,
+ e))
+ return items
+
+def load_release_setting(section, option, raw = False, error = False):
+ vc, v = _load_released_version_config()
+ value = None
+ if v is not None:
+ try:
+ value = v.get(section, option, raw = raw)
+ except Exception as e:
+ if not isinstance(error, bool):
+ error(e)
+ elif error:
+ raise error.general('Invalid config section: %s: %s: %s.%s' % (vc,
+ section,
+ option,
+ e))
+ return value
+
def released():
return _load_released_version()
def version_control():
return _load_git_version()
-def str():
- if not _released and not _git:
- if not _load_released_version():
- _load_git_version()
+def string():
+ _load_released_version()
+ _load_git_version()
return _version_str
def version():
+ _load_released_version()
+ _load_git_version()
return _version
+def revision():
+ _load_released_version()
+ _load_git_version()
+ return _revision
+
if __name__ == '__main__':
print('Version: %s' % (str()))