# Application Runtimes and Containers

A core abstraction in the design of builder is `Ide.Runtime`. This provides a way to setup and execute processes within a given environment. That environment could be your host operating system, a container, a build environment, or even a remote system.

For example, if we want to run the `make` command for your project and that project is targeting the GNOME Sdk we need to first enter the SDK environment. The Flatpak plugin provides an `Ide.Runtime` implementation to do this so that before your subprocess is lanched, the runtime is setup and initialized for execution with an alternate mount namespace, network namespace, and more.

## How to get a runtime

If you need to run a process within the build environment you will want to access the runtime for the current build configuration. The current build configuration can be accessed from the `Ide.ConfigurationManager` object.

    config_manager = context.get_config()
    config = config_manager.get_current()
    runtime = config.get_runtime()

Note

It is possible that the configured runtime does not yet exist, so remember to check for `None`.

## Creating a Subprocess

To create a subprocess in the runtime, use the `Ide.Subprocess.create_launcher()` method and then spawn a process using that launcher.

    try:
        launcher = runtime.create_launcher()
        launcher.push_argv('which')
        launcher.push_argv('make')
        subprocess = launcher.spawn(None)
        _, stdout, stderr = subprocess.communicate_utf8(None, None)
    except Exception as ex:
        print("Failed to create launcher: " + repr(ex))
        return