[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