Re: make .if exists problem/question

2005-09-05 Thread Harti Brandt
On Thu, 25 Aug 2005, Emanuel Strobl wrote:

ESAm Donnerstag, 25. August 2005 20:10 CEST schrieb David Kirchner:
ES On 8/25/05, Emanuel Strobl [EMAIL PROTECTED] wrote:
ES  Dear make gurus (bsd make, not gmake),
ES 
ES  it seems that make checks .if directives only at statrup. How can I
ES  trigger a reread?
ES  I have the problem that in one target I create a filetree, another
ES  target checks if it exists, if not it creates itself again. Now it
ES  works perfectly when I call the two targets both externally
ES  (installcfworld installcfconfig) but when the internal higher
ES  install gets to the installcfconfig target it fails!
ES  I'm really desperate, I need to check this. Is this a nasty bug?
ES
ES This Makefile shows the problem:
ES
ES all:
ES .if ! exists(./foobar)
ES @echo foobar does not exist
ES .endif
ES touch foobar
ES .if ! exists(./foobar)
ES @echo foobar does not exist
ES .endif
ES
ES If you run make in this directory, and foobar does not already exist
ES beforehand:
ES
ES $ make
ES foobar does not exist
ES touch foobar
ES foobar does not exist
ES
ES Looking at the make source, it appears that it maintains a cache for
ES file lookups, and I don't see a way to have it flush the hash via some
ES makefile command. I dunno if it is a bug but the man page does not
ES mention a cache.
ES
ES I wonder if you'll have to start a separate make process for each
ES stage of that target's handling.
ES
ESThanks for your suggestion, you described exactly what I mean. So if 
ESthere's no way to flush the cache, it's IMHO a wrong behaviour and should 
ESbe considered as bug.
ESI'm not too experienced in make, so I don't know if I want to call sub 
ESmakes...
ESDo you have an idea whom to contact regarding the bug?

You should think of .if and .for as preprocessor directives. They are 
processed when make reads the makefile and builds the dependency graph. If 
you need something more dynamic you must use either a shell line:

foo:
if [ -f baz ] ; then ...

or go with sub-makes. 

Generally you don't want to use .if to check for a file that your makefile 
creates. In this case you just should use make itself. Given that the tree 
you need to have is named 'tree' do something like:

installcfworld: tree
...

installcfconfig: tree
...

tree:
mkdir tree
...

harti
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: make .if exists problem/question

2005-09-05 Thread Emanuel Strobl
Am Montag, 5. September 2005 18:03 CEST schrieb Harti Brandt:
 On Thu, 25 Aug 2005, Emanuel Strobl wrote:
[...]

 You should think of .if and .for as preprocessor directives. They are
 processed when make reads the makefile and builds the dependency graph.
 If you need something more dynamic you must use either a shell line:

 foo:
   if [ -f baz ] ; then ...

 or go with sub-makes.

 Generally you don't want to use .if to check for a file that your
 makefile creates. In this case you just should use make itself. Given
 that the tree you need to have is named 'tree' do something like:

 installcfworld: tree
   ...

 installcfconfig: tree
   ...

 tree:
   mkdir tree
   ...

Thanks, I understood it, and the project grew fine. Will be available this 
week :)

-Harry


 harti
 ___
 freebsd-current@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/freebsd-current
 To unsubscribe, send any mail to
 [EMAIL PROTECTED]


pgp0AMa2ZNpul.pgp
Description: PGP signature


make .if exists problem/question

2005-08-25 Thread Emanuel Strobl
Dear make gurus (bsd make, not gmake),

it seems that make checks .if directives only at statrup. How can I trigger 
a reread?
I have the problem that in one target I create a filetree, another target 
checks if it exists, if not it creates itself again. Now it works 
perfectly when I call the two targets both externally (installcfworld 
installcfconfig) but when the internal higher install gets to the 
installcfconfig target it fails!
I'm really desperate, I need to check this. Is this a nasty bug?

Thanks,

-Harry


pgpI56F8brpXo.pgp
Description: PGP signature


Re: make .if exists problem/question

2005-08-25 Thread Emanuel Strobl
Am Donnerstag, 25. August 2005 20:10 CEST schrieb David Kirchner:
 On 8/25/05, Emanuel Strobl [EMAIL PROTECTED] wrote:
  Dear make gurus (bsd make, not gmake),
 
  it seems that make checks .if directives only at statrup. How can I
  trigger a reread?
  I have the problem that in one target I create a filetree, another
  target checks if it exists, if not it creates itself again. Now it
  works perfectly when I call the two targets both externally
  (installcfworld installcfconfig) but when the internal higher
  install gets to the installcfconfig target it fails!
  I'm really desperate, I need to check this. Is this a nasty bug?

 This Makefile shows the problem:

 all:
 .if ! exists(./foobar)
 @echo foobar does not exist
 .endif
 touch foobar
 .if ! exists(./foobar)
 @echo foobar does not exist
 .endif

 If you run make in this directory, and foobar does not already exist
 beforehand:

 $ make
 foobar does not exist
 touch foobar
 foobar does not exist

 Looking at the make source, it appears that it maintains a cache for
 file lookups, and I don't see a way to have it flush the hash via some
 makefile command. I dunno if it is a bug but the man page does not
 mention a cache.

 I wonder if you'll have to start a separate make process for each
 stage of that target's handling.

Thanks for your suggestion, you described exactly what I mean. So if 
there's no way to flush the cache, it's IMHO a wrong behaviour and should 
be considered as bug.
I'm not too experienced in make, so I don't know if I want to call sub 
makes...
Do you have an idea whom to contact regarding the bug?

Thanks,

-Harry


pgpLMGpHWk1lW.pgp
Description: PGP signature


Re: make .if exists problem/question

2005-08-25 Thread Giorgos Keramidas
On 2005-08-25 20:36, Emanuel Strobl [EMAIL PROTECTED] wrote:
 Am Donnerstag, 25. August 2005 20:10 CEST schrieb David Kirchner:
  This Makefile shows the problem:
 
  all:
  .if ! exists(./foobar)
  @echo foobar does not exist
  .endif
  touch foobar
  .if ! exists(./foobar)
  @echo foobar does not exist
  .endif
 
  If you run make in this directory, and foobar does not already exist
  beforehand:
 
  $ make
  foobar does not exist
  touch foobar
  foobar does not exist
 
  Looking at the make source, it appears that it maintains a cache for
  file lookups, and I don't see a way to have it flush the hash via some
  makefile command. I dunno if it is a bug but the man page does not
  mention a cache.
 
  I wonder if you'll have to start a separate make process for each
  stage of that target's handling.

 Thanks for your suggestion, you described exactly what I mean. So if
 there's no way to flush the cache, it's IMHO a wrong behaviour and
 should be considered as bug.  I'm not too experienced in make, so I
 don't know if I want to call sub makes...  Do you have an idea whom to
 contact regarding the bug?

You can call a sub-make with the help of an ``auxiliary'' target:

%   all: create-file show-file
%
%   create-file:
%   .if ! exists(./foobar)
%   @echo foobar does not exist
%   .endif
%   touch foobar
%
%   show-file:
%   @$(MAKE) show-file-aux
%
%   show-file-aux:
%   .if ! exists(./foobar)
%   @echo foobar does not exist
%   .else
%   @ls -l foobar
%   .endif

This should result in something like this:

%   orion:/tmp/foobar$ make
%   foobar does not exist
%   touch foobar
%   -rw-rw-r--  1 keramida  wheel  0 Aug 25 21:44 foobar
%   orion:/tmp/foobar$

___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: make .if exists problem/question

2005-08-25 Thread M. Warner Losh
Yes.  The thing to keep in mind is that much of the .if stuff is done
at parsing or rule construction time.  So if you change something
(creating a file, say), then that condition won't be re-evaluated.

For the specific example given, one could replace much of the goo
with:

target: foobar

foobar:
touch foobar

if you wanted to create foobar.  Otherwise, I'd be tempted not to use
.if exists.  I'd be tempted to do something more like:

target:
@-if [ -f foobar ]; then cat foobar; else touch foobar; fi

where you have the shell check.

The primary use of exists() I've seen is:

.if exists(foo.mk)
.include foo.mk
.endif

although I have seen others.

Warner
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]