[Omake] omake equivalent of make's $?

Bryce Nichols nospam121 at bnichols.org
Thu Jul 19 09:16:52 PDT 2007


Jason,

Thanks.  That helps.  Using the code you provided combined with what I'd 
written already I was able to implement most of what I needed.  I did have 
to fix one thing, though.  There was a bug in the try-file-date function: 
the $@ should be $(node).

I'll look into it more later, but let me know if there's a simple way that 
I could leverage omake's cache to do the same thing, but based on digests 
rather than just dates.

Right now, by using $N hidden by the alias, I can implement a target 
that's a cache of names of installed files.  Then when anything changes, 
the rule copies just the new files to the install destination (creating 
directories if needed), deletes any no-longer-installed files, deletes any 
now-empty directories, and updates the target with the current cache of 
names and created directories.  The only downside, as I mentioned, is that 
updates are only based on modification times.

Thanks!

--bryce

On Sun, 15 Jul 2007, Jason Hickey wrote:

> Bryce,
>
> I not sure if the $? variable makes a lot of sense in omake, but let me 
> explain.  Suppose we set up a function to compute $?, producing the same 
> result as make.  Here's the code, where we just stat each of the files to get 
> their date.  We can't define $? (syntax error), so let's call it $N.
>
>   #
>   # Get the last-modified date, or 0 if the file
>   # does not exist.
>   #
>   try-file-date(node) =
>       try
>           info = $(stat $@)
>           value $(info.mtime)
>       default
>           float(0)
>
>   #
>   # Find the files in $+ that are newer than $@
>   #
>   N() =
>       target-date = $(try-file-date $@)
>       files[] =
>       foreach(x, $+)
>           if $(gt $(try-file-date $x), $(target-date))
>               files[] += $x
>               export
>           export
>       value $(files)
>
> Then we can do the same kind of stuff as in make, but use $N instead of $?
>
>   lib.a: a.o b.o
>       ar cr $@ $N
>       ranlib $@
>
> The problem is, in OMake the commands-text is also examined during dependency 
> analysis--if the commands change, the rule is considered out of date.  So the 
> first time you build the project it will run "ar cr lib.a a.o b.o", and the 
> next time it will run "ar cr lib.a", which is undesirable.  make ignores the 
> commands-text in the analysis, so the second null-operation wouldn't happen 
> (but other bad things happen instead).
>
> To fix this, you could wrap the command in an alias that takes all the files, 
> and then selects only the ones that are important.  OMake doesn't look inside 
> aliases during dependency analysis.  Here is actual part of the OMakefile.
>
>   # Make the alias "ar-newer"
>   Shell. +=
>       ar-newer(argv) =
>           files = $N
>           if $(files)
>               ar cr $@ $(files)
>
>   lib.a: a.o b.o
>       ar-newer
>
>   .DEFAULT: lib.a
>
> For installing, you may wish to use file digests instead of modification 
> times.  This will be faster if the files are large.
>
>   Shell. +=
>      copy-if-newer(argv) =
>          src = $(nth 0, $(argv))
>          dst = $(nth 1, $(argv))
>          if $(not $(equal $(digest-optional $(dst)), $(digest $(src))))
>              cp $(src) $(dst)
>
>   .PHONY: install
>
>   install: progA progB
>       cp-if-newer progA /usr/local/bin/progA
>       cp-if-newer progB /usr/local/bin/progB
>
> Finally, you can use file-exists, ls, or glob to check for files that you 
> previously installed, but should no longer exist.
>
> Jason
>
> On Jul 14, 2007, at 11:24 PM, Bryce Nichols wrote:
>
>> Hi all,
>> 
>> I'm trying to set up something for my projects so that when I type "omake 
>> install", then only the changed files are copied, and also if any files 
>> that were previously installed but that are no longer part of the install 
>> set will be removed.
>> 
>> The point is to be a bit more efficient and keep from polluting the 
>> filesystem as the project evolves.
>> 
>> The problem is, I don't know how to learn from omake which files have 
>> changed.  With make, I could just use the automatic variable $? to get the 
>> list of dependencies which had changed.  omake doesn't seem to have this 
>> feature.
>> 
>> So is there a way to get the list of only the changed dependencies in the 
>> body of an omake rule?
>> 
>> Also, if anyone has comments or insight about my idea for tracking 
>> installed files, I'd love to hear from you.
>> 
>> Thanks!
>> 
>> --bryce
>> 
>> _______________________________________________
>> Omake mailing list
>> Omake at metaprl.org
>> https://lists.metaprl.org/mailman/listinfo/omake
>
> --
> Jason Hickey                  http://www.cs.caltech.edu/~jyh
> Caltech Computer Science      Tel: 626-395-6568 FAX: 626-792-4257
>
>
>
> _______________________________________________
> Omake mailing list
> Omake at metaprl.org
> https://lists.metaprl.org/mailman/listinfo/omake


More information about the Omake mailing list