[Omake] Recursive invocation of omake

Benjamin Pierce bcpierce at cis.upenn.edu
Wed Jun 7 17:38:44 PDT 2006


Thanks, Jason -- that fills in some holes too.  In particular, it  
further clarifies the deep difference between phony targets and "in  
the filesystem" targets.  This should be highlighted in the docs;  
coming from GNU make, I didn't have the right intuitions at all about  
this.

    - B


On Jun 7, 2006, at 4:59 PM, Jason Hickey wrote:

> 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?
>
> Hi Benjamin,
>
> Aleksey explained about .PHONY targets.  Let me say a bit more  
> about the  general model.
>
> In general, a project will span multiple directories, and there is  
> a single "project root" directory that contains an OMakeroot file.   
> Other directories become part of the project when they are listed  
> as a .SUBDIRS target.  The build (.SUBDIRS) tree doesn't have to  
> conform to the filesystem tree, but it often does.  This is an  
> example tree:
>
>    ./OMakeroot:
>       # Configuration stuff
>       .SUBDIRS: .    # Includes the current directory in the project
>
>    ./OMakefile:
>       # Rules, etc.
>       # Include directories a, b/c
>       # The files ./a/OMakefile and ./b/c/OMakefile must exist
>       .SUBDIRS: a b/c
>
> OMake performs a global analysis, reading the entire project (see  
> performance notes later).
>
> Most frequently, you run omake from the project root and it builds  
> all targets that are declared somewhere in the project  
> with .DEFAULT.  If you run omake from a subdirectory, any targets  
> you list on the command line are taken relative to that  
> subdirectory.  The global analysis is still performed, so it may be  
> that targets in other directories will still be built (Aleksey  
> thinks we should have a "sloppy" mode, but I disagree:)  If you run  
> omake in a subdirectory, and you want to pretend as if you ran it  
> from the root, you can use the -R option.
>
> Some notes:
>    - By default, each subdirectory must have an OMakefile.   
> Alternately,
>      you can use a .SUBDIRS body.  The body is evaluated instead of
>      the OMakefile, for each directory dir1, ..., dirn in turn.
>          .SUBDIRS: dir1 ... dirn
>              <body>
>
>    - The language is functional-- all variables (including environment
>      variables) are immutable, but dynamically scoped.  So what is the
>      environment that is used to build a particular target, like
>      foo/boo.exe?  Here is the rule:
>
>         1. If the target boo.exe is defined explicitly in foo/ 
> OMakefile,
>            then the environment at that point is used when building  
> the
>            target.
>         2. Otherwise, the environment as defined at the end
>            of foo/OMakefile is used.
>
> Functionality is one of the main points.  The environment is  
> inherited down the project build tree, but each subdirectory can  
> make changes and/or add new definitions without affecting other  
> parts of the project.
>
> About performance.  Since omake performs a global analysis, on each  
> run, all the OMakefiles must be evaluated.  This is reasonably  
> cheap; the language is interpreted, but we do some caching after  
> parsing (saved in the .omc files).  The big cost is that a stat(2)  
> system call must be performed on each source file in the project.   
> Also, the very first time, this requires taking MD5 digests too.
>
> The stat cost is more-or-less unavoidable--recursive make winds up  
> doing much the same.  One thing we frequently do is use the -P  
> option.  In this case, omake actively monitors the filesystem for  
> changes, and build restarts are more-or-less instantaneous when a  
> source file changes.
>
> Jason
>
>
> -- 
> Jason Hickey                  http://www.cs.caltech.edu/~jyh
> Caltech Computer Science      Tel: 626-395-6568 FAX: 626-792-4257



More information about the Omake mailing list