Custom Modules and Items

Users of Qbs are not limited to the pre-defined modules and items, they can also create their own. Here we describe how to set up custom modules and items so that Qbs will find them.

File System Layout

Items and modules are located under a common base directory, whose name and location is completely arbitrary. We will refer to it as search-path here. This directory has two subdirectories modules and imports, which contain Qbs modules and items, respectively.

Custom Modules

To introduce a custom module mymodule, create a directory search-path/modules/mymodule/.

Note: Module names are case-sensitive, and this also goes for the corresponding directory name.

Then, put a file containing an instance of the Module in there and give it the .qbs extension. This module will be pulled in if a product declares a dependency on mymodule.

Custom Items

To introduce a custom item MyItem, create the file search-path/imports/MyItem.qbs.

Note: Item file names must start with a capital letter due to the fact that type names can only start with a capital letter. Otherwise, the file will be silently ignored.

Making Qbs Aware of Custom Modules and Items

To be able to use your custom modules and items, you need to make them known to Qbs. You can do this per project or globally.

Project-specific Modules and Items

Let's assume you have a project that is located in project_dir and you have created some modules in project_dir/custom-stuff/modules/ as well as some items in project_dir/custom-stuff/imports/ that you want to use in the project. To achieve this, your top-level project file should look like this:

 // ...
 Project {
     // ..
     qbsSearchPaths: "custom-stuff"
     // ..
 }

Note: For technical reasons, the custom modules and items will not be available in the file that contains the Project.qbsSearchPaths property. Any product that wants to make use of them needs to be in a different file that is pulled in via the Project.references property, for example. This is not a serious limitation, since every well-structured project will be split up in this manner.

Making Custom Modules and Items Available Across Projects

What if your modules and items are generally useful and you want to access them in several projects? In this case, it is best to add the location to your preferences. For example:

 qbs config preferences.qbsSearchPaths /usr/local/share/custom-qbs-extensions