FilesΒΆ

Targets based on files and modified timestamps as in Make. File targets evaluate to the pathlib.Path of their target.

Consider a simple Makefile that builds an executable from a C source file:

hello : hello.o
        $(CC) $(LDFLAGS) -o hello hello.o $(LDLIBS)

hello.o : hello.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -c hello.c

Here is the same example in Picard using picard.file(). One notable difference is that, due to Python scope rules, you must declare prerequisites before the targets that depend on them.

import picard

@picard.file('hello.o', 'hello.c')
async def hello_o(target, context, hello_c):
    cc = context.config.get('CC', 'cc')
    cpp_flags = context.config.get('CPPFLAGS', None)
    c_flags = context.config.get('CFLAGS', None)
    await picard.sh(cc, cpp_flags, c_flags, '-c', hello_c)

@picard.file('hello', hello_o)
async def hello(target, context, hello_o):
    cc = context.config.get('CC', 'cc')
    ld_flags = context.config.get('LDFLAGS', None)
    ld_libs = context.config.get('LDLIBS', None)
    await picard.sh(cc, ld_flags, '-o', 'hello', hello_o, ld_libs)

if __name__ == '__main__':
    picard.make(hello)

Note

If you are compiling C or C++, these patterns in this example have already been encapsulated in picard.clang.