Task

Tasks represent atomic operations such as processes.

waflib.Task.NOT_RUN

The task was not executed yet

waflib.Task.MISSING

The task has been executed but the files have not been created

waflib.Task.CRASHED

The task execution returned a non-zero exit status

waflib.Task.EXCEPTION

An exception occured in the task execution

waflib.Task.SKIPPED

The task did not have to be executed

waflib.Task.SUCCESS

The task was successfully executed

waflib.Task.ASK_LATER

The task is not ready to be executed

waflib.Task.SKIP_ME

The task does not need to be executed

waflib.Task.RUN_ME

The task must be executed

waflib.Task.cache_outputs(cls)[source]

Task class decorator applied to all task classes by default unless they define the attribute ‘nocache’:

from waflib import Task
class foo(Task.Task):
        nocache = True

If bld.cache_global is defined and if the task instances produces output nodes, the files will be copied into a folder in the cache directory

The files may also be retrieved from that folder, if it exists

waflib.Task.classes

class tasks created by user scripts or Waf tools are kept in this dict name -> class object

class waflib.Task.store_task_type(name, bases, dict)[source]

Bases: type

Metaclass: store the task types into waflib.Task.classes. The attribute ‘run_str’ will be processed to compute a method ‘run’ on the task class The decorator waflib.Task.cache_outputs() is also applied to the class

class waflib.Task.evil

Bases: object

Base class provided to avoid writing a metaclass, so the code can run in python 2.6 and 3.x unmodified

class waflib.Task.TaskBase(*k, **kw)[source]

Bases: waflib.Task.evil

Base class for all Waf tasks, which should be seen as an interface. For illustration purposes, instances of this class will execute the attribute ‘fun’ in waflib.Task.TaskBase.run(). When in doubt, create subclasses of waflib.Task.Task instead.

Subclasses should override these methods:

  1. __str__: string to display to the user
  2. runnable_status: ask the task if it should be run, skipped, or if we have to ask later
  3. run: let threads execute the task
  4. post_run: let threads update the data regarding the task (cache)
color

Color for the console display, see waflib.Logs.colors_lst

ext_in

File extensions that objects of this task class might use

ext_out

File extensions that objects of this task class might create

before

List of task class names to execute before instances of this class

after

List of task class names to execute after instances of this class

hcode

String representing an additional hash for the class representation

__init__(*k, **kw)[source]

The base task class requires a task generator, which will be itself if missing

__repr__()[source]

for debugging purposes

__str__()[source]

string to display to the user

__hash__()[source]

Very fast hashing scheme but not persistent (replace/implement in subclasses and see waflib.Task.Task.uid())

exec_command(cmd, **kw)[source]

Wrapper for waflib.Context.Context.exec_command() which sets a current working directory to build.variant_dir

Returns:the return code
Return type:int
runnable_status()[source]

State of the task

Returns:a task state in waflib.Task.RUN_ME, waflib.Task.SKIP_ME or waflib.Task.ASK_LATER.
Return type:int
run()[source]

Execute the task (executed by threads). Override in subclasses.

Return type:int
post_run()[source]

Update the cache files (executed by threads). Override in subclasses.

log_display(bld)[source]

Write the execution status on the context logger

display()[source]

Return an execution status for the console, the progress bar, or the IDE output.

Return type:string
attr(att, default=None)[source]

Retrieve an attribute from the instance or from the class.

Parameters:
  • att (string) – variable name
  • default – default value
hash_constraints()[source]

Identify a task type for all the constraints relevant for the scheduler: precedence, file production

Returns:a hash value
Return type:string
format_error()[source]

Error message to display to the user when a build fails

Return type:string
colon(var1, var2)[source]

private function for the moment

used for scriptlet expressions such as ${FOO_ST:FOO}, for example, if env.FOO_ST = [‘-a’, ‘-b’] env.FOO = [‘1’, ‘2’] then the result will be [‘-a’, ‘-b’, ‘1’, ‘-a’, ‘-b’, ‘2’]

class waflib.Task.Task(*k, **kw)[source]

Bases: waflib.Task.TaskBase

This class deals with the filesystem (waflib.Node.Node). The method waflib.Task.Task.runnable_status uses a hash value (from waflib.Task.Task.signature) which is persistent from build to build. When the value changes, the task has to be executed. The method waflib.Task.Task.post_run will assign the task signature to the output nodes (if present).

vars

Variables to depend on (class attribute used for waflib.Task.Task.sig_vars())

shell

Execute the command with the shell (class attribute)

env

ConfigSet object (make sure to provide one)

inputs

List of input nodes, which represent the files used by the task instance

outputs

List of output nodes, which represent the files created by the task instance

dep_nodes

List of additional nodes to depend on

run_after

Set of tasks that must be executed before this one

__str__()[source]

string to display to the user

__repr__()[source]

for debugging purposes

run()

Execute the task (executed by threads). Override in subclasses.

Return type:int
uid()[source]

Return an identifier used to determine if tasks are up-to-date. Since the identifier will be stored between executions, it must be:

  • unique: no two tasks return the same value (for a given build context)
  • the same for a given task instance

By default, the node paths, the class name, and the function are used as inputs to compute a hash.

The pointer to the object (python built-in ‘id’) will change between build executions, and must be avoided in such hashes.

Returns:hash value
Return type:string
set_inputs(inp)[source]

Append the nodes to the inputs

Parameters:inp (node or list of nodes) – input nodes
set_outputs(out)[source]

Append the nodes to the outputs

Parameters:out (node or list of nodes) – output nodes
set_run_after(task)[source]

Run this task only after task. Affect waflib.Task.runnable_status()

Parameters:task (waflib.Task.Task) – task
signature()[source]

Task signatures are stored between build executions, they are use to track the changes made to the input nodes (not to the outputs!). The signature hashes data from various sources:

If the signature is expected to give a different result, clear the cache kept in self.cache_sig:

from waflib import Task
class cls(Task.Task):
        def signature(self):
                sig = super(Task.Task, self).signature()
                delattr(self, 'cache_sig')
                return super(Task.Task, self).signature()
runnable_status()[source]

Override waflib.Task.TaskBase.runnable_status() to determine if the task is ready to be run (waflib.Task.Task.run_after)

post_run()[source]

Update the cache files (executed by threads). Override in subclasses.

sig_explicit_deps()[source]

Used by waflib.Task.Task.signature(), hash waflib.Task.Task.inputs and waflib.Task.Task.dep_nodes signatures.

Return type:hash value
sig_vars()[source]

Used by waflib.Task.Task.signature(), hash waflib.Task.Task.env variables/values

Return type:hash value
scan

This method, when provided, returns a tuple containing:

  • a list of nodes corresponding to real files
  • a list of names for files not found in path_lst

For example:

from waflib.Task import Task
class mytask(Task):
        def scan(self, node):
                return ((), ())

The first and second lists are stored in waflib.Build.BuildContext.node_deps and waflib.Build.BuildContext.raw_deps respectively.

sig_implicit_deps()[source]

Used by waflib.Task.Task.signature() hashes node signatures obtained by scanning for dependencies (waflib.Task.Task.scan()).

The exception waflib.Errors.TaskRescan is thrown when a file has changed. When this occurs, waflib.Task.Task.signature() is called once again, and this method will be executed once again, this time calling waflib.Task.Task.scan() for searching the dependencies.

Return type:hash value
compute_sig_implicit_deps()[source]

Used by waflib.Task.Task.sig_implicit_deps() for computing the actual hash of the waflib.Node.Node returned by the scanner.

Returns:hash value
Return type:string
are_implicit_nodes_ready()[source]

For each node returned by the scanner, see if there is a task behind it, and force the build order

The performance impact on null builds is nearly invisible (1.66s->1.86s), but this is due to agressive caching (1.86s->28s)

can_retrieve_cache()[source]

Used by waflib.Task.cache_outputs()

Retrieve build nodes from the cache update the file timestamps to help cleaning the least used entries from the cache additionally, set an attribute ‘cached’ to avoid re-creating the same cache files

Suppose there are files in cache/dir1/file1 and cache/dir2/file2:

  1. read the timestamp of dir1
  2. try to copy the files
  3. look at the timestamp again, if it has changed, the data may have been corrupt (cache update by another process)
  4. should an exception occur, ignore the data
put_files_cache()[source]

Used by waflib.Task.cache_outputs() to store the build files in the cache

waflib.Task.is_before(t1, t2)[source]

Return a non-zero value if task t1 is to be executed before task t2:

t1.ext_out = '.h'
t2.ext_in = '.h'
t2.after = ['t1']
t1.before = ['t2']
waflib.Task.is_before(t1, t2) # True
Parameters:
waflib.Task.set_file_constraints(tasks)[source]

Adds tasks to the task ‘run_after’ attribute based on the task inputs and outputs

Parameters:tasks (list of waflib.Task.TaskBase) – tasks
waflib.Task.set_precedence_constraints(tasks)[source]

Add tasks to the task ‘run_after’ attribute based on the after/before/ext_out/ext_in attributes

Parameters:tasks (list of waflib.Task.TaskBase) – tasks
waflib.Task.funex(c)[source]

Compile a function by ‘exec’

Parameters:c (string) – function to compile
Returns:the function ‘f’ declared in the input string
Return type:function
waflib.Task.compile_fun_shell(line)[source]

Create a compiled function to execute a process with the shell WARNING: this method may disappear anytime, so use compile_fun instead

waflib.Task.compile_fun_noshell(line)[source]

Create a compiled function to execute a process without the shell WARNING: this method may disappear anytime, so use compile_fun instead

waflib.Task.compile_fun(line, shell=False)[source]

Parse a string expression such as “${CC} ${SRC} -o ${TGT}” and return a pair containing:

  • the function created (compiled) for use as waflib.Task.TaskBase.run()
  • the list of variables that imply a dependency from self.env

for example:

from waflib.Task import compile_fun
compile_fun('cxx', '${CXX} -o ${TGT[0]} ${SRC} -I ${SRC[0].parent.bldpath()}')

def build(bld):
        bld(source='wscript', rule='echo "foo\${SRC[0].name}\bar"')

The env variables (CXX, ..) on the task must not hold dicts (order) The reserved keywords TGT and SRC represent the task input and output nodes

waflib.Task.task_factory(name, func=None, vars=None, color='GREEN', ext_in=[], ext_out=[], before=[], after=[], shell=False, scan=None)[source]

Return a new task subclass with the function run compiled from the line given. Provided for compatibility with waf 1.4-1.5, when we did not use metaclasses to register new objects.

Parameters:
  • func (string or function) – method run
  • vars (list of string) – list of variables to hash
  • color (string) – color to use
  • shell (bool) – when func is a string, enable/disable the use of the shell
  • scan (function) – method scan
Return type:

waflib.Task.Task

waflib.Task.always_run(cls)[source]

Task class decorator

Set all task instances of this class to be executed whenever a build is started The task signature is calculated, but the result of the comparation between task signatures is bypassed

waflib.Task.update_outputs(cls)[source]

Task class decorator

If you want to create files in the source directory. For example, to keep foo.txt in the source directory, create it first and declare:

def build(bld):
        bld(rule='cp ${SRC} ${TGT}', source='wscript', target='foo.txt', update_outputs=True)

Previous topic

Scripting

Next topic

TaskGen

This Page