%instance deftypesuffix(hh-src, '%.hh') ; %instance deftypesuffix(cc-src, '%.cc') ; ALLOCD = make.allocd; NEXT = make.next; %tool allochd ( hhsrc: %in [type = hh-src, persistent]; hsrc: %out [type = C-incl] => match($hhsrc); prog: %in [type = command] => $ALLOCD; ) { exec($prog, stdin => $hhsrc, stdout => $hsrc); echo({$hsrc ,'created'}); }; %tool alloccd ( ccsrc: %in [type = cc-src, persistent]; csrc: %out [type = C-src] => match($ccsrc); prog: %in [type = command] => $ALLOCD; ) { exec($prog, stdin => $ccsrc, stdout => $csrc); echo({$csrc ,'created'}); }; # Possibly there's only one type of { cc-src, hh-src } available, # so introduce a new attribute. %derive f[cc-or-hh-src] %when get($f, type) == cc-src %or get($f, type) == hh-src; %tool mknext ( cchhsrc: %in %list [cc-or-hh-src]; next: %out [type = C-src] => next.c; prog: %in [type = command] => $NEXT; ) { exec($prog, args => $cchhsrc, stdout => $next); echo({$next ,'created'}); };