Skip to main content
Version: latest

Adding projects with custom behaviour

Instead of configuring a project using a "clang-build.toml", you can also use a "clang-build.py" script. This allows you, for example, to generate a version-header based on git tags or to (de-)activate features or targets depending on environment variables.

Script requirementsโ€‹

The "clang-build.py" script, is required to define the following function:

import clang_build

def get_project(directory, environment, parent=None) -> clang_build.project.Project:
project = clang_build.project.Project("projectname", {}, directory, environment, parent=parent)
#...
return project

Creating a projectโ€‹

You can default-initialize a project without targets or let clang-build create the project for you, from a folder or from a configuration dict.

from clang_build.project import Project

def get_project(directory, environment, parent=None) -> Project:
# Empty project:
project = Project("projectname", {}, directory, environment, parent=parent)
# Use defaults to initialize from a folder:
project = Project.from_directory(directory, environment, parent=parent)
# Use a dictionary:
project = Project.from_config({}, directory, environment, parent=parent)

Creating targetsโ€‹

A target always belongs to a project, meaning you need to create a project first. Then,

def get_project(directory, environment, parent=None) -> clang_build.project.Project:
project = #...
target = clang_build.target.TargetDescription("targetname", {}, project)
project.add_targets([target])
return project

Manipulating sourcesโ€‹

Both projects and targets may fetch external sources, if a url is provided. The source fetching process can be customised by overriding their get_sources functions.

class CustomSources(clang_build.target.TargetDescription):
def get_sources(self):
# The base class `get_sources` checks if a `url` was specified in
# the config, in which case it will download the sources
super().get_sources()
# Write some sources
# ...

Note, when generating sources you should use the properties of TargetDescription to place them in the right folder.