Rock

the Robot Construction Kit

Package import

As we already mentioned, the source.yml file contains information on where to import the source packages from. This information is included in the version_control field of the source.yml, and is of the general form:

version_control:
   package_name:
       vcs_def
   package_name:
       vcs_def:

Autoproj follows the following rules to find the importer definition for a given package:

  • it loads the information contained in the version_control section of the package set that defines the considered package
  • it will apply any modification that is contained in the overrides section by the package sets listed after the aforementionned package set

For both the version_control and overrides section, autoproj will match the package’s name with the package_name fields. It will consider every matching block (i.e. every package_name that matches), overriding earlier setup by later ones.

As an example, let’s consider the following manifest:

package_sets:
   - tools:
       - orocos.toolchain
   - rock.toolchain

The rock.toolchain package uses its own repository for the typelib library. So, while the orocos.toolchain has the following source.yml:

version_control:
   - .*:
       type: git
       url: git://github.com/orocos-toolchain/$PACKAGE.git

rock.toolchain has

overrides:
   - typelib:
       url: git://github.com/rock-core/$PACKAGE.git

Another common use for overrides is to change the branch, for instance:

overrides:
   - typelib:
       url: git://github.com/rock-core/$PACKAGE.git
   - rtt:
       branch: experimental

The remaining of this page will detail the various options that exist to import a source package.

Common Importer Options

All importers support the following options:

version_control:
   - .*:
       retry_count: 2

It specifies the number of time the importer should retry before giving up. This is useful for remote servers (svn, git) that are not as reliable as one would like.

Git

The general setup for git imports is:

version_control:
   package_name:
       type: git
       url: repository_url_or_path
       branch: branch_name
       tag: tag_name # it is branch OR tag

Autoproj will maintain an ‘autobuild’ remote on the checked out repository: i.e., it will make sure that the URL of this remote is always linked to the right URL from the config file, and will update the relevant branch on update (beware: the other branches won’t get updated).

Moreover, autoproj will make sure that updating your local repository always resolves as a fast-forward (i.e., it will never create a merge)

Subversion

The general setup for subversion imports is:

version_control:
   package_name:
       type: svn
       url: repository_url_or_path

Note that the repository must be accessible without any password - the import will fail if a password is needed.

CVS

The general setup for CVS imports is:

version_control:
   package_name:
       type: cvs
       url: cvs_root
       module: modulename

Note that the repository must be accessible without any password - the import will fail if a password is needed.

In case a :pserver: is used, it must be quoted - YAML would interpret it the wrong way otherwise:

version_control:
   package_name:
       type: cvs
       url: ":pserver:cvs@blabla:/"
       module: modulename

Tar archives

version_control:
   package_name:
       type: archive
       url: http://sourceforge.net/blablabla.tar.gz?option=value
       filename: blabla.tar.gz # Optional: if the file name cannot be inferred from the URL
       no_subdirectory: false # Optional. Set to true if there is not a leading directory in the archive
       update_cached_file: false # Optional. Set to false to disable automatic updates

The importer expects that there is a leading subdirectory in the archive, under which all files. If that is not the case, i.e. if all files are in the root of the archive, do not forget to set the no_subdirectory option.

Autoproj tries to guess what is the name of the downloaded file by extracting it out of the URL. Sometimes, this does not work as the URL does not fit the expected scheme – in these cases you will get a tar error on update. To override this autodetection behaviour, set the filename option to the actual downloaded file name.

By default, autoproj will check if the downloaded file has been updated on the server, and will download it again if it is the case. If you are downloading release tarballs, this is unneeded as the archive should not be updated. In that case, set the update_cached_file option to false to save the time needed to check for the update (can be long on, for instance, sourceforge). The source will of course be updated if you change the URL (i.e. to download a new release of the same software).

Patching the source once it is checked out/updated

It is possible to apply patches after a given package (imported by any of the importer types) has been checked out/updated. To do so, simply add the option patches: to the importer configuration and list the patches which should be applied:

version_control:
   package_name:
       type: archive
       url: http://sourceforge.net/blablabla
       patches:
           - $AUTOPROJ_SOURCE_DIR/blablabla-01.patch
           - $AUTOPROJ_SOURCE_DIR/blablabla-02.patch

Note that in the example above, the patch is saved in the package set’s folder (the value of AUTOPROJ_SOURCE_DIR). This is a highly required practice.

Note that if the patch list changes (i.e. the names change), autoproj will automatically unpatch and repatch as required. It is therefore highly required to change the patch name if the patch changes.

The provided patches are by default applied with a patch level of 0 (passed to patch through the -p option). This can be overriden on a patch-per-patch basis by making the patch name an array as well:

version_control:
   package_name:
       type: archive
       url: http://sourceforge.net/blablabla
       patches:
           - [$AUTOPROJ_SOURCE_DIR/blablabla-01.patch, 1]
           - $AUTOPROJ_SOURCE_DIR/blablabla-02.patch