The decision to remove the concept of stacks and therefore package
packages suggests that the information contained in the both
files stack.xml and manifest.xml should be merged.
The file contains different kind of information:
- descriptive data (i.e. a description, maintainer)
- dependencies to other packages and system dependencies
- meta-information (i.e. the author and website)
- packaging information (i.e. the version)
Instead of modifying the semantics and content of the old files a new
filename is chosen to make it possible to distinguish old and new
packages without parsing the content of the xml file.
All data is stored in atomic units to enable automated processing.
I.e. names and email addresses are not mixed in a single field but
stored separately.
The <package> tag is the unique top-level tag in a
package.xml file. All other tags are nested under this.
format="NUMBER" (optional)
Specifying the version of the package.xml format being used.
If it is not set the default format 1 is assumed. This will be
used to detect future specification changes, and thus allow to have
one current and several deprecated formats at the same time.
<package>
<name>my_package</name>
<version>1.2.3</version>
<description>
ROS communications-related packages, including core client libraries (roscpp, rospy, roslisp) and graph introspection tools (rostopic, rosnode, rosservice, rosparam).
</description>
<maintainer email="someone@example.com">Someone</maintainer>
<license>BSD</license>
<license>LGPL</license>
<url type="website">http://wiki.ros.org/my_package</url>
<url type="bugtracker">http://www.github.com/my_org/my_package/issues</url>
<author>John Doe</author>
<author email="jane.doe@example.com">Jane Doe</author>
<build_depend>catkin</build_depend>
<build_depend version_gte="1.1" version_lt="2.0">genmsg</build_depend>
<build_depend>libboost-thread-dev</build_depend>
<run_depend>libboost-thread</run_depend>
<test_depend>gtest</test_depend>
<conflict>my_old_package</conflict>
<export>
...
</export>
</package>
The name of the package consisting only of lower case alphanumeric
characters and underscores and must start with a letter . The
package name must be unique in the ROS ecosystem. It does not need
to be identical with the folder name where it is checked out to, but
it is a good habit to use the same name for the folder.
- Package names are used in various contexts:
- namespaces
- variables
- part of a binary package name (i.e. Debian, Fedora)
The ROS package names must be mapped to these conventions without
generating collision. Therefore only lower case letters (a-z),
numbers (0-9) and one delimiting character (_) can be used. The
additional restriction that the first character can only be a letter
is derived from the fact that some language do not allow this for
namespaces/packages.
The version number of the package in the format
MAJOR.MINOR.PATCH where each part is numeric only.
abi="FORMAT-TBD" (optional)
Specifying an ABI version number.
The packages generated are version-locked against the exact ABI
version of packages it depends on (if not specified the normal
version number). When increasing the version number while keeping
the same ABI version all dependent packages do not need to be
rebuilt.
The description of the package. It can consist of multiple lines and
may contain XHTML. But depending on where the description is used
XML tags and multiple whitespaces might be stripped.
The name of the person maintaining the package. All packages require
a maintainer. For orphaned packages see below.
- email="name@domain.tld" (required)
- Email address of the maintainer.
An orphaned package is one with no current maintainer. Orphaned
packages should have their maintainer set to
ROS Community <ros-release@code.ros.org>. These packages are
considered maintained by the ROS Community as a whole until a
volunteer takes over maintenance.
Name of license for this package, e.g. BSD, GPL, LGPL. In order to
assist machine readability, only include the license name in this tag.
For multiple licenses multiple separate tags must be used. A package
would have multiple licenses if different source files have different
licenses. Every license occurring the in the source files should have
a corresponding <license> tag. For any explanatory text about
licensing caveats, please use the <description> tag.
Most common open-source licenses are described on the
OSI website.
Commonly used license strings:
- Apache 2.0
- BSD
- Boost Software License
- GPLv2
- GPLv3
- LGPLv2.1
- LGPLv3
- MIT
- Mozilla Public License Version 1.1
The URL to a website, a bug tracker or anything else for the package.
type="TYPE" (optional)
The type should be one of the following identifiers: website
(default), bugtracker and repository.
The name of a person who is an author of the package, as
acknowledgement of their work and for questions.
- email="name@domain.tld" (optional)
- Email address of author.
Declares a ROS dep key that this package depends on at build-time.
The build and buildtool dependencies are used to determine
the build order of multiple packages.
All dependencies and relationships may restrict their applicability
to particular versions. For each comparison operator an attribute
can be used. Two of these attributes can be set at the same time to
describe a version range.
version_lt="VERSION" (optional)
The dependency to the package is restricted to versions less than
the stated version number.
version_lte="VERSION" (optional)
The dependency to the package is restricted to versions less or
equal than the stated version number.
version_eq="VERSION" (optional)
The dependency to the package is restricted to a version equal than
the stated version number.
version_gte="VERSION" (optional)
The dependency to the package is restricted to versions greater or
equal than the stated version number.
version_gt="VERSION" (optional)
The dependency to the package is restricted to versions greater than
the stated version number.
Declares a ROS dep key that this package depends on at run-time.
Declares a ROS dep key that this package depends on for running
tests.
While build, buildtoold and run define independent sets
of dependencies test dependencies are only additive and specify
only what is required in addition to the other dependencies.
Declares a ROS dep key that this package conflicts with. This
package can not be installed at the same time as the conflicting
package. This maps to conflicts for both dpkg and rpms.
For a detailed explanation how these relationships are utilized see
and .
Declares a ROS dep key that this package replaces. This maps to
Replaces for dpkg and Obsoletes for rpms.
It serves as a container for any kind of additional information
various packages and subsystems need to embed to fulfill their goal.
To avoid potential collisions packages must use their package name as
the tag name inside of the export block. The content of that tag is
up to the package to define and utilize.
The existing tags for use cases like exporting plugins for
pluginlib etc. will remain as-is.
For example, a package which implements an rviz plugin might include this:
<export>
<rviz plugin="${prefix}/plugin_description.xml"/>
</export>
The following tags will list some additional tags which are necessary
to fulfill specific task in the area of package and message
generation. These all belong inside an <export> tag.
The empty tag is used to indicate that a package is architecture
independent and therefore does not contain any architecture specific
code.
The tag is used to indicate that a package is deprecated which enables
to notify users about that fact. The tag may either be empty or
optionally contain an arbitrary text content giving the user more
information about the deprecation:
<export>
<deprecated>This package will be removed in ROS Hydro. Instead use
package FOO which provides similar functionality but with a
different API.</deprecated>
</export>
The content defines the identifier for the language bindings
generated by this package, i.e. in gencpp this is set to cpp:
<export>
<message_generator>cpp</message_generator>
</export>
- Authors are now split into authors and maintainers.
- Multiple persons and their emails are specified in separate tags
and attributes.
- Authors are now optional.
- Maintainers must have an email.
- At least one maintainer is now required.
- Multiple licenses can now be used (even if a single license per
package is desired).
- Multiple url tags can be specified and the type
attributes gives them semantic meaning.
- The former depend and rosdep have been unified, but also
split into various types of dependencies.
- The export tag:
- The cpp tag has been dropped, since this functionality is
handled by catkin.
- The roslang tag has been dropped, since this functionality is
handled by catkin.
- The copyright tag has been dropped.
- The logo tag has been dropped.
- The review tag has been dropped, these information will be
stored on the website of that package.
- The versioncontrol tag has been dropped.
All tools currently utilizing stack.xml and manifest.xml are
updated to work with package.xml files.
The update of existing stacks and packages only effect catkin-ized
packages. The existing dry packages stay as-is. Rosdep will be
able to distinguish between wet and dry and return the appropriate
system dependencies.
For backward compatibility with dry packages catkin will generate a
manifest.xml which provides information necessary for
rosbuild to work (namely exporting compiler and linker flags).
Additional meta information can be easily added within the export
tag in the future if necessary.
Furthermore new features related to the infrastructure can be
specified and integrated using additional tags and attributes:
A reference implementation will be developed as soon as the
specification is fixed.