diff --git a/requirements.txt b/requirements.txt index d6469a19..cad3d140 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ pygithub catkin_pkg rospkg setuptools +packaging diff --git a/superflore/generators/bitbake/gen_packages.py b/superflore/generators/bitbake/gen_packages.py index 7c9cd8fb..272d4ee9 100644 --- a/superflore/generators/bitbake/gen_packages.py +++ b/superflore/generators/bitbake/gen_packages.py @@ -31,8 +31,8 @@ def regenerate_pkg( - overlay, pkg, rosdistro, preserve_existing, srcrev_cache, - skip_keys + overlay, pkg, rosdistro, preserve_existing, yocto_release, + srcrev_cache, skip_keys ): pkg_names = get_package_names(rosdistro)[0] if pkg not in pkg_names: @@ -106,7 +106,7 @@ def regenerate_pkg( previous_version = existing[idx_version:].rstrip('.bb') try: current = oe_recipe( - rosdistro, pkg, srcrev_cache, skip_keys + rosdistro, yocto_release, pkg, srcrev_cache, skip_keys ) except InvalidPackage as e: err('Invalid package: ' + str(e)) @@ -159,7 +159,7 @@ def regenerate_pkg( def _gen_recipe_for_package( - rosdistro, pkg_name, pkg, repo, ros_pkg, + rosdistro, yocto_release, pkg_name, pkg, repo, ros_pkg, pkg_rosinstall, srcrev_cache, skip_keys ): pkg_names = get_package_names(rosdistro) @@ -189,6 +189,7 @@ def _gen_recipe_for_package( pkg_name, pkg_xml, rosdistro, + yocto_release, src_uri, srcrev_cache, skip_keys, @@ -222,7 +223,7 @@ def _gen_recipe_for_package( class oe_recipe(object): def __init__( - self, rosdistro, pkg_name, srcrev_cache, skip_keys + self, rosdistro, yocto_release, pkg_name, srcrev_cache, skip_keys ): pkg = rosdistro.release_packages[pkg_name] repo = rosdistro.repositories[pkg.repository_name].release_repository @@ -233,8 +234,8 @@ def __init__( ) self.recipe = _gen_recipe_for_package( - rosdistro, pkg_name, pkg, repo, ros_pkg, pkg_rosinstall, - srcrev_cache, skip_keys + rosdistro, yocto_release, pkg_name, pkg, repo, ros_pkg, + pkg_rosinstall, srcrev_cache, skip_keys ) def recipe_text(self): diff --git a/superflore/generators/bitbake/run.py b/superflore/generators/bitbake/run.py index e1ab7129..9b769aef 100644 --- a/superflore/generators/bitbake/run.py +++ b/superflore/generators/bitbake/run.py @@ -21,6 +21,7 @@ from superflore.generate_installers import generate_installers from superflore.generators.bitbake.gen_packages import regenerate_pkg from superflore.generators.bitbake.ros_meta import RosMeta +from superflore.generators.bitbake.yocto_recipe import yocto_releases from superflore.generators.bitbake.yocto_recipe import yoctoRecipe from superflore.parser import get_parser from superflore.repo_instance import RepoInstance @@ -51,6 +52,13 @@ def main(): help='location to store archived packages', type=str ) + parser.add_argument( + '--yocto-release', + help="create recipes for the specified Yocto release", + choices=yocto_releases.keys(), + required=False, + type=str + ) args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment skip_keys = set(args.skip_keys) if args.skip_keys else set() @@ -130,6 +138,7 @@ def main(): pkg, distro, False, # preserve_existing + args.yocto_release, srcrev_cache, skip_keys=skip_keys, ) @@ -173,6 +182,7 @@ def main(): overlay, regenerate_pkg, preserve_existing, + args.yocto_release, srcrev_cache, skip_keys, skip_keys=skip_keys, diff --git a/superflore/generators/bitbake/yocto_recipe.py b/superflore/generators/bitbake/yocto_recipe.py index 9e413f6a..bc5d732b 100644 --- a/superflore/generators/bitbake/yocto_recipe.py +++ b/superflore/generators/bitbake/yocto_recipe.py @@ -27,6 +27,7 @@ import hashlib from subprocess import DEVNULL, PIPE, Popen +from packaging.version import Version from superflore.exceptions import NoPkgXml from superflore.exceptions import UnresolvedDependency from superflore.PackageMetadata import PackageMetadata @@ -44,6 +45,19 @@ UNRESOLVED_DEP_PREFIX = 'ROS_UNRESOLVED_DEP-' UNRESOLVED_DEP_REF_PREFIX = '${'+UNRESOLVED_DEP_PREFIX +yocto_releases = { + # name : version + 'kirkstone': '4.0', + 'langdale': '4.1', + 'mickledore': '4.2', + 'nanbield': '4.3', + 'scarthgap': '5.0', + 'styhead': '5.1', + 'walnascar': '5.2', + 'whinlatter': '5.3', + 'wrynose': '6.0', +} + class yoctoRecipe(object): """ @@ -61,8 +75,8 @@ class yoctoRecipe(object): max_component_name = 0 def __init__( - self, component_name, num_pkgs, pkg_name, pkg_xml, rosdistro, src_uri, - srcrev_cache, skip_keys + self, component_name, num_pkgs, pkg_name, pkg_xml, rosdistro, + yocto_release, src_uri, srcrev_cache, skip_keys ): self.component = component_name yoctoRecipe.max_component_name = max( @@ -71,6 +85,7 @@ def __init__( self.num_pkgs = num_pkgs self.name = pkg_name self.distro = rosdistro.name + self.release = yocto_release self.version = get_pkg_version(rosdistro, pkg_name, is_oe=True) self.src_uri = src_uri self.pkg_xml = pkg_xml @@ -495,12 +510,22 @@ def get_recipe_text(self, distributor): ret += 'SRC_URI = "git://' + self.get_repo_src_uri() + \ ';${ROS_BRANCH};protocol=https"\n' ret += 'SRCREV = "' + self.srcrev + '"\n' - ret += 'S = "${WORKDIR}/git"\n\n' + if (self.release): + if Version(self._get_yocto_version(self.release)) < \ + Version(yocto_releases['styhead']): + ret += 'S = "${WORKDIR}/git"\n\n' ret += 'ROS_BUILD_TYPE = "' + self.build_type + '"\n' # Inherits ret += '\n' + self.get_bottom_inherit_line() return ret + @staticmethod + def _get_yocto_version(release): + if release in yocto_releases: + return yocto_releases[release] + else: + return None + @staticmethod def _get_ros_version(distro): distros = get_distros()