<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 09.11.2016 04:29, Ruslan Baratov
      wrote:<br>
    </div>
    <blockquote
      cite="mid:98f9bbf7-0898-c249-3a1f-7b82b32d5912@yahoo.com"
      type="cite">
      <meta content="text/html; charset=windows-1252"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">On 08-Nov-16 23:33, Nils Gladitz
        wrote:<br>
      </div>
      <blockquote
        cite="mid:2a0e1f85-6129-abe1-12d1-e85f2b8d16ce@gmail.com"
        type="cite">On 11/08/2016 04:17 PM, Ruslan Baratov wrote: <br>
        <br>
        <blockquote type="cite">Except it's exactly opposite :)
          `cmake_minimum_required` is about new <br>
          features/commands, and policies is about behavior. <br>
        </blockquote>
        <br>
        I don't agree and you can not separate the two. <br>
        cmake_minimum_required() initializes the policies based on the
        given version.<br>
      </blockquote>
      <tt>So what? From the user's perspective the "initialization of
        policies" is like a syntactic sugar so you don't have to write
        endless `</tt><tt><span class="hll"><span class="nb">cmake_policy</span><span
            class="p">(</span><span class="s">SET</span> <span
            class="s">CMP00xx</span> NEW<span class="p">)`. Nothing to
            do how to deal with them further.</span></span></tt><br>
    </blockquote>
    <br>
    You can't simultaneously argue that cmake_minimum_required() isn't
    about policies (behaviours) and at the same time syntactic sugar for
    those very same policies.<br>
    <br>
    <blockquote
      cite="mid:98f9bbf7-0898-c249-3a1f-7b82b32d5912@yahoo.com"
      type="cite"> <br>
      <blockquote
        cite="mid:2a0e1f85-6129-abe1-12d1-e85f2b8d16ce@gmail.com"
        type="cite"> <br>
        <blockquote type="cite">  If you have command <br>
          `if(IN_LIST)` since 3.3 you can't manipulate policies in such
          way that <br>
          it will work with CMake 2.8. However if you have warning about
          policy <br>
          CMP0054 (since CMake 3.2) you can set policy to old without
          changing <br>
          `cmake_minimum_required` (hence without forcing your CMake 2.8
          users to <br>
          upgrade to CMake 3.2). <br>
        </blockquote>
        <br>
        Coincidentally I implemented both of those policies :) <br>
        <br>
        Given your second example you likely shouldn't be touching the
        policy at all.<br>
      </blockquote>
      I have to. If my code use features from CMake 2.8 I do set
      `cmake_minimum_required(VERSION 2.8)`. But some users may have
      CMake 3.2 installed. Do they must downgrade CMake? Of course not.
      But if I'm not touching policies there will be warnings around. If
      I'm good developer I will investigate the root of the warnings and
      fix them. Actually most of them will be about bugs in my code or
      dangerous behavior, so it does improve 2.8 too.<br>
    </blockquote>
    <br>
    Policy warnings aren't meant to indicate errors in your code but
    changes in behaviour that will happen if you were to increase your
    minimum required version.<br>
    As such they can often be worked around by using behaviour that is
    consistent between versions but they are not meant to indicate
    errors to be fixed.<br>
    <br>
    Instead they are meant to encourage you to embrace the new
    behaviours and abandon the old (which will require porting work)
    since the old are by definition deprecated and may be removed in the
    future (though so far CMake has been very conservative about this).<br>
    <br>
    <blockquote
      cite="mid:98f9bbf7-0898-c249-3a1f-7b82b32d5912@yahoo.com"
      type="cite"> <br>
      <blockquote
        cite="mid:2a0e1f85-6129-abe1-12d1-e85f2b8d16ce@gmail.com"
        type="cite"> <br>
        A policy warning does not force your users to use a new CMake
        version.<br>
      </blockquote>
      Well that's what I said.<br>
    </blockquote>
    <br>
    You said you are not forcing your users to upgrade by setting a
    policy to OLD.<br>
    Which implied that not setting the policy to OLD would force your
    users to upgrade ... which it doesn't.<br>
    <br>
    <blockquote
      cite="mid:98f9bbf7-0898-c249-3a1f-7b82b32d5912@yahoo.com"
      type="cite"> <br>
      <blockquote
        cite="mid:2a0e1f85-6129-abe1-12d1-e85f2b8d16ce@gmail.com"
        type="cite">In fact all that setting it to OLD does is suppress
        the warning.<br>
      </blockquote>
      It's better than emitting zillion of warnings to the output,
      right? You can suppress one type and fix another, set TODOs, etc.<br>
    </blockquote>
    <br>
    Policy warnings are intended to encourage you to switch to new
    behaviours since the old ones are deprecated.<br>
    In actively maintained projects they are not meant to be suppressed.<br>
    <br>
    <blockquote
      cite="mid:98f9bbf7-0898-c249-3a1f-7b82b32d5912@yahoo.com"
      type="cite"> <br>
      <blockquote
        cite="mid:2a0e1f85-6129-abe1-12d1-e85f2b8d16ce@gmail.com"
        type="cite">CMake will use the old behavior in either case. <br>
        <br>
        The warnings guide developers when they do bump their
        cmake_minimum_required(VERSION). <br>
        By just suppressing it behavior changes might go unnoticed when
        the bump does happen.<br>
      </blockquote>
      There are 3 components in the equation: the **real** CMake
      version, the version in `cmake_minimum_required` and the default
      policies for such version. Can you provide an example of what you
      mean?<br>
    </blockquote>
    <br>
        cmake_minimum_required(VERSION 3.0)<br>
    <br>
        set(ONE 1)<br>
    <br>
        if(1 STREQUAL "ONE")<br>
            message("FOO")<br>
        else()<br>
            message("BAR")<br>
        endif()<br>
    <br>
    This code was designed for 3.0 (as indicated by the
    cmake_minimum_required(VERSION)) and is meant to output "FOO".<br>
    When you use CMake 3.0 that is the behaviour you get (without
    warnings).<br>
    When you use CMake >= 3.1 the behaviour of the code itself is
    still the same but you will get a CMP0054 warning telling you that
    the behaviour that you currently depend on in if() has been
    deprecated.<br>
    <br>
    Now you decide to bump your minimum required version from 3.0 to 3.1
    and ignore or suppress the policy warning from before:<br>
    <br>
        cmake_minimum_required(VERSION 3.1)<br>
    <br>
        set(ONE 1)<br>
    <br>
        if(1 STREQUAL "ONE")<br>
            message("FOO")<br>
        else()<br>
            message("BAR)<br>
        endif()<br>
    <br>
    <p>Now when you use CMake >= 3.1 to run this code you will not
      get any more warnings but it will also no longer behave like it
      used to.</p>
    <p>It will output "BAR" instead of "FOO".</p>
    <p><br>
    </p>
    <p>Nils<br>
    </p>
  </body>
</html>