Command wrapper

The cmd_wrapper.py extension plugin is a Python script that receives the command line argument provided by self.run() recipe calls, and allows intercepting them and returning a new one.

This plugin must be located in the extensions/plugins cache folder, and can be installed with the conan config install command.

For example:

def cmd_wrapper(cmd, **kwargs):
    return 'echo "{}"'.format(cmd)

Would just intercept the commands and display them to terminal, which means that all commmands in all recipes self.run() will not execute, but just be echoed.

The **kwargs is a mandatory generic argument to be robust against future changes and injection by Conan of new keyword arguments. Not adding it, even if not used could make the extension fail in future Conan versions.

A more common use case would be the injection of a parallelization tools over some commands, which could look like:

def cmd_wrapper(cmd, **kwargs):
    # lets parallelize only CMake invocations
    if cmd.startswith("cmake"):
        return 'parallel-build "{}"  --parallel-argument'.format(cmd)
    # otherwise return same command, not modified
    return cmd

The conanfile object is passed as an argument, so it is possible to customize the behavior depending on the caller:

def cmd_wrapper(cmd, conanfile, **kwargs):
    # Let's parallelize only CMake invocations, for a few specific heavy packages
    name = conanfile.ref.name
    heavy_pkgs = ["qt", "boost", "abseil", "opencv", "ffmpeg"]
    if cmd.startswith("cmake") and name in heavy_pkgs:
        return 'parallel-build "{}"  --parallel-argument'.format(cmd)
    # otherwise return same command, not modified
    return cmd