Home | History | Annotate | Line # | Download | only in unit-tests
directive-ifmake.mk revision 1.8
      1 # $NetBSD: directive-ifmake.mk,v 1.8 2020/11/15 20:20:58 rillig Exp $
      2 #
      3 # Tests for the .ifmake directive, which provides a shortcut for asking
      4 # whether a certain target is requested to be made from the command line.
      5 #
      6 # TODO: Describe why the shortcut may be useful (if it's useful at all),
      7 # instead of sticking to the simple '.if' only.
      8 
      9 # The targets 'first' and 'second' are passed in on the command line.
     10 
     11 # This is the most basic form.
     12 .ifmake first
     13 .  info ok: positive condition works
     14 .else
     15 .  warning positive condition fails
     16 .endif
     17 
     18 # The not operator works as expected.
     19 # An alternative interpretation were that this condition is asking whether
     20 # the target "!first" was requested.  To distinguish this, see the next test.
     21 .ifmake !first
     22 .  warning unexpected
     23 .else
     24 .  info ok: negation works
     25 .endif
     26 
     27 # See if the exclamation mark really means "not", or if it is just part of
     28 # the target name.  Since it means 'not', the two exclamation marks are
     29 # effectively ignored, and 'first' is indeed a requested target.  If the
     30 # exclamation mark were part of the name instead, the name would be '!!first',
     31 # and such a target was not requested to be made.
     32 .ifmake !!first
     33 .  info ok: double negation works
     34 .else
     35 .  warning double negation fails
     36 .endif
     37 
     38 # Multiple targets can be combined using the && and || operators.
     39 .ifmake first && second
     40 .  info ok: both mentioned
     41 .else
     42 .  warning && does not work as expected
     43 .endif
     44 
     45 # Negation also works in complex conditions.
     46 .ifmake first && !unmentioned
     47 .  info ok: only those mentioned
     48 .else
     49 .  warning && with ! does not work as expected
     50 .endif
     51 
     52 # Using the .MAKEFLAGS special dependency target, arbitrary command
     53 # line options can be added at parse time.  This means that it is
     54 # possible to extend the targets to be made.
     55 .MAKEFLAGS: late-target
     56 .ifmake late-target
     57 .  info Targets can even be added at parse time.
     58 .else
     59 .  info No, targets cannot be added at parse time anymore.
     60 .endif
     61 
     62 # Numbers are interpreted as numbers, no matter whether the directive is
     63 # a plain .if or an .ifmake.
     64 .ifmake 0
     65 .  error
     66 .endif
     67 .ifmake 1
     68 .else
     69 .  error
     70 .endif
     71 
     72 # A condition that consists of a variable expression only (without any
     73 # comparison operator) can be used with .if and the other .ifxxx directives.
     74 .ifmake ${:Ufirst}
     75 .  info ok
     76 .else
     77 .  error
     78 .endif
     79 
     80 
     81 first second unmentioned late-target:
     82 	: $@
     83