<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:Consolas;
        color:gray;
        font-weight:bold;}
p
        {mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman";}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 97.05pt 1.0in 97.05pt;}
div.Section1
        {page:Section1;}
-->
</style>

</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>Here's what I ended up with:<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>function(AssureOutOfSourceBuilds)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; # make sure the user
doesn't play dirty with symlinks<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;
get_filename_component(srcdir &quot;${CMAKE_SOURCE_DIR}&quot; REALPATH)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;
get_filename_component(bindir &quot;${CMAKE_BINARY_DIR}&quot; REALPATH)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; # disallow in-source builds<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; if(${srcdir} STREQUAL
${bindir})<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;######################################################&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;You are attempting to build in your Source Directory.&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;You must run cmake from a build directory.&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;######################################################&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; # attempt to
remove cache and cache files... this actually fails to work,<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; # but no hurt
trying incase it starts working..<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
file(REMOVE_RECURSE &quot;${CMAKE_SOURCE_DIR}/CMakeCache.txt&quot;
&quot;${CMAKE_SOURCE_DIR}/CMakeFiles&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(FATAL_ERROR &quot;In-source builds are forbidden!&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; endif()<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; # check for polluted source
tree<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; if(EXISTS
${CMAKE_SOURCE_DIR}/CMakeCache.txt OR EXISTS ${CMAKE_SOURCE_DIR}/CMakeFiles)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;################################################################&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; message(
&quot;Found results from an in-source build in your source directory.&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(&quot;################################################################&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; # attempt to
remove cache and cache files...<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
file(REMOVE_RECURSE &quot;${CMAKE_SOURCE_DIR}/CMakeCache.txt&quot;
&quot;${CMAKE_SOURCE_DIR}/CMakeFiles&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp;
message(FATAL_ERROR &quot;Source Directory Cleaned, please rerun CMake.&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>&nbsp; endif()<o:p></o:p></span></font></b></p>

<p class=MsoPlainText style='margin-left:.5in'><b><font size=2 color=gray
face=Consolas><span style='font-size:10.0pt'>endfunction()<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>It&#8217;s basically exactly what you mentioned.&nbsp;
I changed the order of the checks to allow it to check for an in-source build
before dealing with the consequences of such.&nbsp; I added more logging and
actual cleanup.<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>Thanks for all the help. If you have any suggestions
on improving this, please let me know.&nbsp; Incidentally, removing the
CMakeCache.txt and CMakeFiles directory does not work during the in-source
build, but does during the check to insure there isn&#8217;t anything left over
from an in source build.&nbsp; I went ahead and removed the files there and
then fatal_error&#8217;d out to allow the right CMakeCache.txt to be loaded in
the build tree when cmake is next run.<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>Aaron C. Meadows <o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>-----Original Message-----<br>
From: Michael Wild [mailto:themiwi@gmail.com] <br>
Sent: Thursday, October 07, 2010 2:20 AM<br>
To: Meadows, Aaron C.; Meadows, Aaron C.<br>
Cc: cmake@cmake.org<br>
Subject: Re: [CMake] Disallowing in-source builds</span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>On 6. Oct, 2010, at 20:10 ,
&lt;aaron.meadows@thomsonreuters.com&gt;
&lt;aaron.meadows@thomsonreuters.com&gt; wrote:<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; Hi all.<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; <o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; <o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; <o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; Is there a good way to disallow in-source
builds?&nbsp; Ideally, I'd like to<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; prevent it before any cruft is written into the
source tree.&nbsp; I<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; experimented with writing a function into my
CMakelists file and calling<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; it.&nbsp; The function checked if
CMAKE_BINARY_DIR was equal to<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; CMAKE_SOURCE_DIR and messaged a FATAL_ERROR if
that was the case.&nbsp; This<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; works ok, but still generates a CMakeFiles
directory and a<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; CMakeCache.txt file.<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>I don't think there's a way to prevent that from happening.
The bad thing about this is that if the user doesn't clean away the in-source
CMakeCache.txt file, subsequent out-of-source builds will fail. Perhaps you can
do something like this:<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'># check for polluted source tree<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>if(EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt OR<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; EXISTS
${CMAKE_SOURCE_DIR}/CMakeFiles)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&nbsp; message(FATAL_ERROR<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&nbsp;&nbsp;&nbsp; &quot;CMakeCache.txt or CMakeFiles
exists in source directory!&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>endif()<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'># make sure the user doesn't play dirty with symlinks<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>get_filename_component(srcdir
&quot;${CMAKE_SOURCE_DIR}&quot; REALPATH)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>get_filename_component(bindir
&quot;${CMAKE_BINARY_DIR}&quot; REALPATH)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'># disallow in-source builds<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>if(${srcdir} STREQUAL ${bindir})<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&nbsp; message(FATAL_ERROR &quot;In-source builds are
forbidden!&quot;)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>endif()<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; <o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; The second half of the question is of course, is
there an easy way to<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; clean out a source tree if an in-source build was
accidentally kicked<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; off?&nbsp; (short of dividing the files by their
timestamp and removing the<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>&gt; newer ones, etc..)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>No, simply because CMake cannot. Your build system
might have something like the following:<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>execute_process(COMMAND echo &quot;BOOM&quot; &gt;
${CMAKE_BINARY_DIR}/boom.txt VERBATIM)<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>CMake never knows that the file boom.txt is written,
and therefor can't clean it away. The only reasonable way I know of is using
git (http://git-scm.com):<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>git clean -df<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>will remove all the files and directories that are not
part of the repository. With tar-ball builds it's easier. Just wipe the source
tree and unpack again.<o:p></o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'><o:p>&nbsp;</o:p></span></font></b></p>

<p class=MsoPlainText><b><font size=2 color=gray face=Consolas><span
style='font-size:10.0pt'>Michael<o:p></o:p></span></font></b></p>

</div>

<br clear=all> This email was sent to you by Thomson Reuters, the global news and information company.<br>
Any views expressed in this message are those of the individual sender, except where the sender specifically states them to be the views of Thomson Reuters.
</body>

</html>