Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

expand

usual cases, all files are known

Standard makefiles define rules, eg :


%.o : %.c
    gcc -c $< -o $@

libproject.a : a.o b.o c.o
    ar rcs $@ $^

which build the graph :

---

---

flowchart TD

a.c --> a.o --> libproject.a
b.c --> b.o --> libproject.a
c.c --> c.o --> libproject.a


now we have code generators, lists of files are unknown

Now, image that the list of files is unknown, because we have a code generator cg, that takes an input file config.yml. Our Makefile would be the impossible :


%.o : %.c
    gcc -c $< -o $@

unknown list of files : config.yml
    cg $^

libproject.a : unknown list of files
    ar rcs $@ $^

Usual solution with make would be to have a directory or filename pattern for the generator, and use a wildcard.


yamake expand

Yamake has another approach, names expansion. Our initial known graph has nodes main.c, main.o, app, libapp.a and config.yml. We have a code generator that will generate cfiles from config.yml, but we don’t have that list.

Yamake allows nodes to have an expand method. In our example, the expansion will create 6 nodes : a.c, a.o, … and the edges, this is shown in orange.

ms

here

Frame 1 / 2

---
title: null
animate: null
animate-yml-file: expand2.yml

---



flowchart TD 

config.yml econfa@--> ac 
ac eacao@--> ao 
ao ealib@--> libapp.a

config.yml econfb@--> bc 
bc ebcbo@--> bo 
bo eblib@--> libapp.a

config.yml econfc@--> cc 
cc eccco@--> co 
co eclib@--> libapp.a

ac(a.c) ;
bc(b.c) ;
cc(c.c) ;
ao(a.o) ;
bo(b.o) ;
co(c.o) ;

main.c --> main.o --> app
libapp.a --> app

classDef class_active_node   stroke-width:1px,color:black,stroke:black ;
classDef class_expanded_node   stroke-width:1px,color:black,stroke:orange ;
classDef class_hidden_node   stroke-width:1px,color:white,stroke:white,stroke-dasharray: 9,5,stroke-dashoffset: 900 ;

classDef class_active_edge   stroke-width:3px,color:orange,stroke:orange;
classDef class_hidden_edge   stroke-width:1px,stroke:white ;
classDef class_expanded_edge   stroke-width:3px,stroke:orange ;
classDef class_animate_edge  stroke-dasharray: 9,5,stroke-dashoffset: 900,animation: dash 25s linear infinite,color black;



class ac class_hidden_node;
class bc class_hidden_node;
class cc class_hidden_node;
class ao class_hidden_node;
class bo class_hidden_node;
class co class_hidden_node;

class econfa class_hidden_edge;
class econfb class_hidden_edge;
class econfc class_hidden_edge;

class eacao class_hidden_edge;
class ebcbo class_hidden_edge;
class eccco class_hidden_edge;

class ealib class_hidden_edge;
class eblib class_hidden_edge;
class eclib class_hidden_edge;




initial graph

here

Frame 2 / 2

---
title: null
animate: null
animate-yml-file: expand2.yml

---



flowchart TD 

config.yml econfa@--> ac 
ac eacao@--> ao 
ao ealib@--> libapp.a

config.yml econfb@--> bc 
bc ebcbo@--> bo 
bo eblib@--> libapp.a

config.yml econfc@--> cc 
cc eccco@--> co 
co eclib@--> libapp.a

ac(a.c) ;
bc(b.c) ;
cc(c.c) ;
ao(a.o) ;
bo(b.o) ;
co(c.o) ;

main.c --> main.o --> app
libapp.a --> app

classDef class_active_node   stroke-width:1px,color:black,stroke:black ;
classDef class_expanded_node   stroke-width:1px,color:black,stroke:orange ;
classDef class_hidden_node   stroke-width:1px,color:white,stroke:white,stroke-dasharray: 9,5,stroke-dashoffset: 900 ;

classDef class_active_edge   stroke-width:3px,color:orange,stroke:orange;
classDef class_hidden_edge   stroke-width:1px,stroke:white ;
classDef class_expanded_edge   stroke-width:3px,stroke:orange ;
classDef class_animate_edge  stroke-dasharray: 9,5,stroke-dashoffset: 900,animation: dash 25s linear infinite,color black;



class ac class_expanded_node;
class bc class_expanded_node;
class cc class_expanded_node;
class ao class_expanded_node;
class bo class_expanded_node;
class co class_expanded_node;

class econfa class_expanded_edge;
class econfb class_expanded_edge;
class econfc class_expanded_edge;

class eacao class_active_edge;
class ebcbo class_active_edge;
class eccco class_active_edge;

class ealib class_expanded_edge;
class eblib class_expanded_edge;
class eclib class_expanded_edge;




after expansion