[Omake] Recursive invocation of omake

Benjamin Pierce bcpierce at cis.upenn.edu
Sat Jun 10 08:14:26 PDT 2006


I've been trying to figure out how to make one .PHONY target invoke  
another one.  Specifically, what I (think I) want is something like

    .PHONY: junk
    junk: testdir/test

so that, while in one directory, I can easily cause something to  
happen in another directory.  But I don't see how to do this: the  
lines above don't seem to work, and the trick suggested by Aleksey's  
message

    .PHONY: junk
    junk: .PHONY/testdir/test

doesn't either.  (I see that his explanation carefully said 'let's  
call it ".PHONY/clean" rather than 'is is called ".PHONY/clean"'!)

Suggestions?

Thanks,

     - Benjamin



On Jun 7, 2006, at 2:24 PM, Aleksey Nogin wrote:

> 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
> _______________________________________________
> Omake mailing list
> Omake at metaprl.org
> https://lists.metaprl.org/mailman/listinfo/omake



More information about the Omake mailing list