[Omake] Recursive invocation of omake

Aleksey Nogin nogin at cs.caltech.edu
Wed Jun 7 11:24:59 PDT 2006


On 07.06.2006 07:34, Benjamin Pierce wrote:

> Looking at the OMakefiles for OMake itself, I discovered that if both  
> the root OMakefile and some subdirectory's OMakefile contain clean:  
> targets, then
>    1) doing 'make clean' in the root dir will execute them both (in  the 
> appropriate directories)
>    2) doing 'make clean' in the subdirectory will execute just its  
> local one.
> 
> This is exactly the behavior I wanted, so that problem is solved.
> 
> However, this makes me realize that there is still quite a bit I  don't 
> understand about OMake's view of a multi-directory project -- I  don't 
> have a model that would have allowed me to predict both (1) and  (2).  
> Can someone explain?

Let me first quickly explain the semantics for the non-phony targets. 
There, running "omake foo" asks OMake to build the file foo in context 
of the _whole_ project. Therefore, if bar/baz is a regular file, then 
running "omake bar/baz" and running "(cd bar; omake baz)" are equivalent 
(unless bar/OMakeroot exists, designating bar as a completely separate 
project, which should not normally happen).

Now on to phony targets. When the the "root" OMakefile has a directive 
".PHONY: clean", it creates a "clean" phony target relative to the 
project root - let's call it ".PHONY/clean". All the "clean: ..." rules 
in the "root" OMakefile following this ".PHONY: clean" declaration would 
be interpreted as rules for the ".PHONY/clean" target.

Now when OMake then comes across the ".SUBDIRS: doc" directive (when it 
is in scope of the above ".PHONY: clean" declaration), it does the 
following:

a) Creates the ".PHONY/doc/clean" phony target

b) Creates the rule
.PHONY/clean: .PHONY/doc/clean

c) Reads the doc/OMakefile file, interpreting its instructions relative 
to the doc directory. In particular, all the "clean: ..." rules in the 
doc/OMakefile will be taken to apply to ".PHONY/doc/clean".

Now when you run "omake clean" in the root directory of the project, it 
is interpreted as "omake .PHONY/clean", so both the rules for 
".PHONY/clean" are executed and the rule for its dependency 
".PHONY/doc/clean". Running "(cd doc; omake clean)" is, as for normal 
targets, equivalent to running "omake .PHONY/doc/clean" and only those 
rules that apply to ".PHONY/doc/clean" will be executed.

Hope this helps.

-- 
Aleksey Nogin

Home Page: http://nogin.org/
E-Mail: nogin at cs.caltech.edu (office), aleksey at nogin.org (personal)
Office: Moore 04, tel: (626) 395-2200


More information about the Omake mailing list