<div class="gmail_quote">On Mon, Apr 16, 2012 at 9:21 AM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dave@boostpro.com">dave@boostpro.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
on Mon Apr 16 2012, Andreas Pakulat &lt;<a href="http://apaku-Mmb7MZpHnFY-AT-public.gmane.org" target="_blank">apaku-Mmb7MZpHnFY-AT-public.gmane.org</a>&gt; wrote:<br>
<br>
&gt; On 16.04.12 06:04:33, Dave Abrahams wrote:<br>
&gt;&gt;<br>
&gt;&gt; on Mon Apr 16 2012, Andreas Pakulat &lt;<a href="http://apaku-Mmb7MZpHnFY-AT-public.gmane.org" target="_blank">apaku-Mmb7MZpHnFY-AT-public.gmane.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; &gt; On 16.04.12 01:37:58, Dave Abrahams wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;<br>
&gt;&gt; &gt;&gt; consider this simple wrapper:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;   function(my_find_package)<br>
&gt;&gt; &gt;&gt;     find_package(${ARGV})<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;   endfunction()<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; If I replace all the calls to find_package in my project with calls to<br>
&gt;&gt; &gt;&gt; my_find_package, everything breaks.  It appears variable settings in any<br>
&gt;&gt; &gt;&gt; found &lt;packagename&gt;Config.cmake files are visible inside<br>
&gt;&gt; &gt;&gt; my_find_package, but disappear from the point of view of the caller,<br>
&gt;&gt; &gt;&gt; unless I &quot;manually&quot; hoist them into the parent scope using<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;   function(my_find_package)<br>
&gt;&gt; &gt;&gt;     find_package(${ARGV})<br>
&gt;&gt; &gt;&gt;     set(some_variable ${some_variable} PARENT_SCOPE)<br>
&gt;&gt; &gt;&gt;   endfunction()<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I&#39;ve tried hoisting everything as in<br>
&gt;&gt; &gt;&gt; <a href="https://github.com/ryppl/ryppl-cmake/blob/find-package-hook/Modules/Ryppl.cmake#L9" target="_blank">https://github.com/ryppl/ryppl-cmake/blob/find-package-hook/Modules/Ryppl.cmake#L9</a>,<br>
&gt;&gt; &gt;&gt; but apparently that is too much and it clobbers some variables that it<br>
&gt;&gt; &gt;&gt; shouldn&#39;t.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Can anyone explain to me what I&#39;m failing to grasp, here?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Functions have their own scope and the find module are written to be<br>
&gt;&gt; &gt; executed in the global scope. (functions are still a relatively new<br>
&gt;&gt; &gt; feature in cmake)<br>
&gt;&gt;<br>
&gt;&gt; That&#39;s one way of saying it.  The other way of saying it is that<br>
&gt;&gt; built-in functions are special and can&#39;t be emulated or wrapped if they<br>
&gt;&gt; end up include()ing anything.  The built-ins don&#39;t create a dynamic<br>
&gt;&gt; scope, so set() commands in files they include end up having an effect<br>
&gt;&gt; at global scope.  The other other way of saying it is @#&amp;(!&amp;!%%*!... but<br>
&gt;&gt; I digress.<br>
&gt;<br>
&gt; Well, thats the price to pay to keep existing CMake code still<br>
&gt; running.<br>
<br>
</div></div>It doesn&#39;t have to be.  If there was a way to say &quot;this function doesn&#39;t<br>
create its own scope,&quot; I could create a wrapper for find_package that<br>
doesn&#39;t interfere with its meaning.  Then I wouldn&#39;t have to pay that<br>
price.<br>
<div class="im"><br>
&gt; Backwards compatibility is valued very high for CMake and IMHO thats a<br>
&gt; good thing most of the time.<br>
<br>
</div>No doubt about it.<br>
<div class="im HOEnZb"><br></div></blockquote><div><br></div><div><br></div><div>But that&#39;s the main difference between &quot;macro&quot; and &quot;function&quot; -- we invented function to give scope because there were no end of complaints about macros not having scope, and endless pollution of the global name space with more and more variables.</div>
<div><br></div><div>So just use a &quot;macro&quot; and all is well in this case, isn&#39;t it?</div><div><br></div><div>Is there a problem with using a macro here?</div><div><br></div></div>