<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[A software Author's Website]]></title>
  <link href="http://graoil.co.uk/atom.xml" rel="self"/>
  <link href="http://graoil.co.uk/"/>
  <updated>2014-01-02T12:33:26+00:00</updated>
  <id>http://graoil.co.uk/</id>
  <author>
    <name><![CDATA[Graoil Limited]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Using Catch for Jeff Langr's TDD book chapter 2]]></title>
    <link href="http://graoil.co.uk/blog/2013/12/30/using-catch-for-jeff-langrs-tdd-book-chapter-2/"/>
    <updated>2013-12-30T16:12:00+00:00</updated>
    <id>http://graoil.co.uk/blog/2013/12/30/using-catch-for-jeff-langrs-tdd-book-chapter-2</id>
    <content type="html"><![CDATA[<p>As I&#39;m a bit of a fan of Phil Nash&#39;s Catch test framework I decided to convert the code in Jeff Langr&#39;s book to use Catch.  This post describes the changes that were required for the first tests, i.e. chapter 2.</p>

<p><a href="https://github.com/colonelsammy/c2.git" title="Chapter 2">Code for this project is here&#8230;</a></p>

<h2 id="toc_0">Basic changes</h2>

<p>Catch is header only so is much simpler to incorporate than Google Mock/Test so the CMakeLists.txt can be much simpler.  For the start of the chapter, this is sufficient:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>project(chapterFirstExample)
</span><span class='line'>cmake_minimum_required(VERSION 2.6)
</span><span class='line'>
</span><span class='line'>include_directories(../../Catch/include)
</span><span class='line'>add_definitions(-std=c++0x)
</span><span class='line'>set(CMAKE_CXX_FLAGS "${CMAXE_CXX_FLAGS} -Wall")
</span><span class='line'>
</span><span class='line'>set(sources
</span><span class='line'>   main.cpp
</span><span class='line'>   SoundexTest.cpp)
</span><span class='line'>add_executable(test ${sources})
</span><span class='line'>target_link_libraries(test pthread)</span></code></pre></td></tr></table></div></figure>

<p>All we need to do is change the path to the Catch include directory, remove the link path and remove the link libraries.</p>

<p>Similarly, main.cpp is also simpler:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#define CATCH_CONFIG_MAIN</span>
</span><span class='line'><span class="cp">#include &quot;catch.hpp&quot;</span>
</span></code></pre></td></tr></table></div></figure>

<p>Strictly speaking we don&#39;t need main.cpp at all, but it simplifies the test code to keep it.</p>

<!-- more -->

<h2 id="toc_1">First 4 examples</h2>

<p>The first examples are not very challenging and all that needs to be changed is to <code>#include &quot;catch.hpp&quot;</code> and change the TEST macro for a TEST_CASE with quotes around the identifiers, e.g. example 4:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#include &lt;string&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Soundex</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>   <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">encode</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">word</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &quot;catch.hpp&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">TEST_CASE</span><span class="p">(</span><span class="s">&quot;SoundexEncoding&quot;</span><span class="p">,</span> <span class="s">&quot;RetainsSoleLetterOfOneLetterWord&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">Soundex</span> <span class="n">soundex</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">auto</span> <span class="n">encoded</span> <span class="o">=</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2 id="toc_2">Examples 5-7</h2>

<p>Catch provides a much richer assertion mechanism so we can replace the ASSERT_THAT macro with a REQUIRE macro:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="c1">//...</span>
</span><span class='line'><span class="n">TEST_CASE</span><span class="p">(</span><span class="s">&quot;SoundexEncoding&quot;</span><span class="p">,</span> <span class="s">&quot;RetainsSoleLetterOfOneLetterWord&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">Soundex</span> <span class="n">soundex</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">auto</span> <span class="n">encoded</span> <span class="o">=</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">REQUIRE</span><span class="p">(</span><span class="n">encoded</span> <span class="o">==</span> <span class="s">&quot;A&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
Running this for example 5 gives the following output in Catch:
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">test</span><span class="p">.</span><span class="n">exe</span> <span class="n">is</span> <span class="n">a</span> <span class="n">Catch</span> <span class="n">v1</span><span class="mf">.0</span> <span class="n">b23</span> <span class="n">host</span> <span class="n">application</span><span class="p">.</span>
</span><span class='line'><span class="n">Run</span> <span class="n">with</span> <span class="o">-?</span> <span class="k">for</span> <span class="n">options</span>
</span><span class='line'>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">SoundexEncoding</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">18</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">24</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">encoded</span> <span class="o">==</span> <span class="s">&quot;A&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;&quot;</span> <span class="o">==</span> <span class="s">&quot;A&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">===============================================================================</span>
</span><span class='line'><span class="mi">1</span> <span class="n">test</span> <span class="k">case</span> <span class="o">-</span> <span class="n">failed</span> <span class="p">(</span><span class="mi">1</span> <span class="n">assertion</span> <span class="o">-</span> <span class="n">failed</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>
As you can see, the output provides both the original expression and the reconstructed expression with the values the caused the assertion failure.  Much better - Jeff&#8217;s explanation would have been much shorter with this!

The fix in example 6 gives this output:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">All</span> <span class="n">tests</span> <span class="n">passed</span> <span class="p">(</span><span class="mi">1</span> <span class="n">assertion</span> <span class="n">in</span> <span class="mi">1</span> <span class="n">test</span> <span class="k">case</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>In Catch, example 7 id identical to example 6 so has been removed.</p>

<h2 id="toc_3">Examples 9</h2>

<p>This requires the same type of changes as above, except that the test case name needs to be unique&#8230;we&#39;ll fix that in example 10.</p>

<h2 id="toc_4">Example 10,11</h2>

<p>We can use Catch SECTIONs to simplify this example&#8230;so we don&#39;t need the SoundexEncoding class at all, and the test looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">TEST_CASE</span><span class="p">(</span><span class="s">&quot;SoundexEncoding&quot;</span><span class="p">,</span> <span class="s">&quot;RetainsSoleLetterOfOneLetterWord&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">Soundex</span> <span class="n">soundex</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">SECTION</span><span class="p">(</span><span class="s">&quot;RetainsSoleLetterOfOneLetterWord&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">auto</span> <span class="n">encoded</span> <span class="o">=</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">REQUIRE</span><span class="p">(</span><span class="n">encoded</span> <span class="o">==</span> <span class="s">&quot;A000&quot;</span><span class="p">);</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="n">SECTION</span><span class="p">(</span><span class="s">&quot;PadsWithZerosToEnsureThreeDigits&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">auto</span> <span class="n">encoded</span> <span class="o">=</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;I&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">REQUIRE</span><span class="p">(</span><span class="n">encoded</span> <span class="o">==</span> <span class="s">&quot;I000&quot;</span><span class="p">);</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>Catch will run the TEST_CASE for each SECTION, automatically initialising the soundex object on each run.</p>

<p>Example 11 is similar.</p>

<h2 id="toc_5">Examples 12-17</h2>

<p>Example 12 requires similar changes, but fails (as expected):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">SoundexEncoding</span>
</span><span class='line'>  <span class="n">ReplacesConsonantsWithAppropriateDigits</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">7</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">19</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;Ab&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;A100&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;Ab000&quot;</span> <span class="o">==</span> <span class="s">&quot;A100&quot;</span>
</span></code></pre></td></tr></table></div></figure>

<p>Again, the output from Catch is much more helpful for diagnosing the error, providing the TEST_CASE name, the SECTION and the expansions.</p>

<p>Examples 13-17 follow the same pattern.</p>

<h2 id="toc_6">Examples 18-22</h2>

<p>Examples 18-22 are similar but we can use the Catch CHECK() macro instead of EXPECT_THAT(), e.g.:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'>   <span class="c1">//...</span>
</span><span class='line'>   <span class="n">SECTION</span><span class="p">(</span><span class="s">&quot;ReplacesConsonantsWithAppropriateDigits&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">CHECK</span><span class="p">(</span><span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;Ab&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;A100&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="n">CHECK</span><span class="p">(</span><span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;Ac&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;A200&quot;</span><span class="p">);</span>
</span><span class='line'>   <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2 id="toc_7">Examples 23-25</h2>

<p>In example 23, Jeff disables a test.  We can&#39;t do the same thing with a Catch SECTION (yet&#8230;) but we can disable an entire test by using the &#39;[hide]&#39; tag, so we temporarily put the test in a TEST_CASE on its own:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">TEST_CASE</span><span class="p">(</span><span class="s">&quot;ReplacesMultipleConsonantsWithDigits&quot;</span><span class="p">,</span> <span class="s">&quot;[hide]&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">Soundex</span> <span class="n">soundex</span><span class="p">;</span>
</span><span class='line'>   <span class="n">REQUIRE</span><span class="p">(</span><span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;Acdl&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;A234&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2 id="toc_8">Example 26-31</h2>

<p>In passing, note that Catch also detects the exception:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">SoundexEncoding</span>
</span><span class='line'>  <span class="n">LimitsLengthToFourCharacters</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">5</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="o">/</span><span class="n">Projects</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">jlangr</span><span class="o">/</span><span class="n">c2</span><span class="o">/</span><span class="n">SoundexTest</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">25</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;Dcdlb&quot;</span><span class="p">).</span><span class="n">length</span><span class="p">()</span> <span class="o">==</span> <span class="mi">4u</span> <span class="p">)</span>
</span><span class='line'><span class="n">due</span> <span class="n">to</span> <span class="n">unexpected</span> <span class="n">exception</span> <span class="n">with</span> <span class="nl">message:</span>
</span><span class='line'>  <span class="n">basic_string</span><span class="o">::</span><span class="n">_S_create</span>
</span></code></pre></td></tr></table></div></figure>

<h2 id="toc_9">Example 32</h2>

<p>To use StartsWith in Catch, we must use the REQUIRE_THAT() macro, e.g.:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'>   <span class="n">SECTION</span><span class="p">(</span><span class="s">&quot;UppercasesFirstLetter&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">REQUIRE_THAT</span><span class="p">(</span><span class="n">soundex</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;abcd&quot;</span><span class="p">),</span> <span class="n">StartsWith</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">));</span>
</span><span class='line'>   <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2 id="toc_10">Examples 33-39</h2>

<p>These all follow the same pattern as above.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Integrating Phil Nash's Catch C++ Unit Test Framework into Visual Studio]]></title>
    <link href="http://graoil.co.uk/blog/2013/11/17/integrating-phil-nashs-catch-c-plus-plus-unit-test-framework-into-visual-studio/"/>
    <updated>2013-11-17T19:44:00+00:00</updated>
    <id>http://graoil.co.uk/blog/2013/11/17/integrating-phil-nashs-catch-c-plus-plus-unit-test-framework-into-visual-studio</id>
    <content type="html"><![CDATA[<p>After I adapted some existing code that used MSTest so that I was able to use Catch, I started to look at whether it was possible to do better; specifically I wanted to share source code between VS and Catch written for a console app and I wanted to retain the ability to generate standard VS TestResults files (*.trx).</p>

<p>The results were better than I expected; I found it was possible, with a little adaptation, to change the Catch internals so that I could do all that; so much so that I was able to reimplement the Catch self tests as Managed C++ test projects for VS2010 and VS2012 as well as Native C++ test projects.</p>

<p><a href="https://github.com/colonelsammy/Catch" title="Catch fork">You can find a fork of Catch here</a> that implements this; hopefully Phil and I will be able to integrate this into the Catch mainline soon but until that is done I will do my best to keep the fork in sync with <a href="https://github.com/philsquared/Catch" title="Catch main">the code here</a>.</p>

<p>You can find <a href="https://github.com/colonelsammy/Catch/blob/master/docs/vs/vs-index.md" title="VS integration details">details on how to use it here</a> and it looks like this:</p>

<p>VS2010: 
<div style="float: center; margin: 10px;">
  <img src="http://www.graoil.co.uk/images/MSTest/VS2010failingtest.png?raw=true" alt="VS2010" Title="VS2010"/>
</div></p>

<p>VS2012:
<div style="float: center; margin: 10px;">
  <img src="http://www.graoil.co.uk/images/MSTest/VS2012failingtest.png?raw=true" alt="VS2012" Title="VS2012"/>
</div></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Replacing MSTest with Phil Nash's Catch framework for VS2012 native C++ tests]]></title>
    <link href="http://graoil.co.uk/blog/2013/10/29/using-phil-nashs-catch-framework-for-VS2012-native-tests/"/>
    <updated>2013-10-29T19:31:00+00:00</updated>
    <id>http://graoil.co.uk/blog/2013/10/29/using-phil-nashs-catch-framework-for-VS2012-native-tests</id>
    <content type="html"><![CDATA[<p>In <a href="http://graoil.co.uk/blog/2013/10/28/replacing-mstest-with-phil-nashs-catch-framework-for-managed-tests/">an earlier post I described how to share the same codebase for MSTest managed C++ code and Phil Nash&#39;s Catch framework</a>.  In VS2012, there&#39;s an option for &#39;Native&#39; C++ tests; this article describes how to use Catch to share the codebase for Native tests too.</p>

<h1 id="toc_0">VS2012 and Native C++ Tests</h1>

<p>In VS2012, you can create a managed C++ test project like this:</p>

<div style="float: center; margin: 10px;">
  <img src="http://www.graoil.co.uk/images/MSTest/ManagedProject1.png?raw=true" alt="Managed C++" Title="Managed C++"/>
</div>

<p>You can also create a Native test, like this:</p>

<div style="float: center; margin: 10px;">
  <img src="http://www.graoil.co.uk/images/MSTest/NativeProject1.png?raw=true" alt="Native C++" Title="Native C++"/>
</div>

<p>In my case, a native test looks something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">namespace</span> <span class="n">NativeTestProject</span>
</span><span class='line'><span class="p">{</span>      
</span><span class='line'>  <span class="n">TEST_CLASS</span><span class="p">(</span><span class="n">UnitTest1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>        <span class="n">NativeTestClass</span><span class="o">*</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>  <span class="k">public</span><span class="o">:</span>
</span><span class='line'>      <span class="n">UnitTest1</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{}</span>
</span><span class='line'>        <span class="o">~</span><span class="n">UnitTest1</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="n">TEST_METHOD_INITIALIZE</span><span class="p">(</span><span class="n">TestInit</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NativeTestClass</span><span class="p">(</span><span class="s">&quot;Fred&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="n">TEST_METHOD_CLEANUP</span><span class="p">(</span><span class="n">TestCleanup</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">delete</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">TEST_METHOD</span><span class="p">(</span><span class="n">TestMethod1</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>            <span class="p">...</span>
</span><span class='line'>        <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<p>I&#39;m not using the constructor/destructor for initialisation and cleanup; instead I&#39;m using the TEST_METHOD_INITIALIZE/CLEANUP macros that call setup and cleanup code before each method is called. This is very similar to my previous article&#8230;in fact it&#39;s so similar that all I need to do is redefine my macro for MS_TEST_CASE_METHOD and define REQUIRE/FAIL and I&#39;m done!</p>

<p>We need a different test runner for native tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">NativeTestProject</span><span class="o">&gt;</span><span class="s">&quot;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsof</span>
</span><span class='line'><span class="n">t</span><span class="err">\</span><span class="n">TestWindow</span><span class="err">\</span><span class="n">vstest</span><span class="p">.</span><span class="n">console</span><span class="p">.</span><span class="n">exe</span><span class="s">&quot; /Logger:Trx debug\NativeTestProject.dll</span>
</span><span class='line'><span class="n">Microsoft</span> <span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="n">Test</span> <span class="n">Execution</span> <span class="n">Command</span> <span class="n">Line</span> <span class="n">Tool</span> <span class="n">Version</span> <span class="mf">11.0.60315.1</span>
</span><span class='line'><span class="n">Copyright</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">Microsoft</span> <span class="n">Corporation</span><span class="p">.</span>  <span class="n">All</span> <span class="n">rights</span> <span class="n">reserved</span><span class="p">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">Starting</span> <span class="n">test</span> <span class="n">execution</span><span class="p">,</span> <span class="n">please</span> <span class="n">wait</span><span class="p">...</span>
</span><span class='line'><span class="n">Passed</span>   <span class="n">Method1</span>
</span><span class='line'><span class="n">Failed</span>   <span class="n">Method2</span>
</span><span class='line'><span class="n">Error</span> <span class="nl">Message:</span>
</span><span class='line'>   <span class="n">Assert</span> <span class="n">failed</span>
</span><span class='line'><span class="n">Stack</span> <span class="nl">Trace:</span>
</span><span class='line'>        <span class="n">at</span> <span class="n">ManagedTestProject</span><span class="o">::</span><span class="n">TestWithoutInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span><span class="p">()</span> <span class="n">in</span> <span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span>
</span><span class='line'><span class="p">.</span><span class="nl">cpp:</span><span class="n">line</span> <span class="mi">23</span>
</span><span class='line'><span class="n">Passed</span>   <span class="n">Method1</span>
</span><span class='line'><span class="n">Failed</span>   <span class="n">Method2</span>
</span><span class='line'><span class="n">Error</span> <span class="nl">Message:</span>
</span><span class='line'>   <span class="n">Assert</span> <span class="n">failed</span>
</span><span class='line'><span class="n">Stack</span> <span class="nl">Trace:</span>
</span><span class='line'>        <span class="n">at</span> <span class="n">ManagedTestProject</span><span class="o">::</span><span class="n">TestWithInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span><span class="p">()</span> <span class="n">in</span> <span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cp</span>
</span><span class='line'><span class="nl">p:</span><span class="n">line</span> <span class="mi">53</span>
</span><span class='line'><span class="n">Results</span> <span class="nl">File:</span> <span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">NativeTestProject</span><span class="err">\</span><span class="n">TestResults</span><span class="err">\</span><span class="n">name_machine</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">28</span> <span class="mi">20</span><span class="n">_59_53</span><span class="p">.</span><span class="n">trx</span>
</span><span class='line'>
</span><span class='line'><span class="n">Total</span> <span class="nl">tests:</span> <span class="mf">4.</span> <span class="nl">Passed:</span> <span class="mf">2.</span> <span class="nl">Failed:</span> <span class="mf">2.</span> <span class="nl">Skipped:</span> <span class="mf">0.</span>
</span><span class='line'><span class="n">Test</span> <span class="n">Run</span> <span class="n">Failed</span><span class="p">.</span>
</span><span class='line'><span class="n">Test</span> <span class="n">execution</span> <span class="nl">time:</span> <span class="mf">0.8892</span> <span class="n">Seconds</span>
</span></code></pre></td></tr></table></div></figure>

<p>The code is identical to the managed/Catch example, so Catch works just the same:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">NativeTestProject</span><span class="err">\</span><span class="n">Debug</span><span class="o">&gt;</span><span class="n">CatchTestProject</span><span class="p">.</span><span class="n">exe</span>
</span><span class='line'>
</span><span class='line'><span class="n">CatchTestProject</span><span class="p">.</span><span class="n">exe</span> <span class="n">is</span> <span class="n">a</span> <span class="n">Catch</span> <span class="n">v1</span><span class="mf">.0</span> <span class="n">b11</span> <span class="n">host</span> <span class="n">application</span><span class="p">.</span>
</span><span class='line'><span class="n">Run</span> <span class="n">with</span> <span class="o">-?</span> <span class="k">for</span> <span class="n">options</span>
</span><span class='line'>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">TestWithoutInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">18</span><span class="p">)</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">23</span><span class="p">)</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;Fred&quot;</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">TestWithInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">49</span><span class="p">)</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">nativetestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">53</span><span class="p">)</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;Fred&quot;</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">===============================================================================</span>
</span><span class='line'><span class="mi">4</span> <span class="n">test</span> <span class="n">cases</span> <span class="o">-</span> <span class="mi">2</span> <span class="n">failed</span> <span class="p">(</span><span class="mi">8</span> <span class="n">assertions</span> <span class="o">-</span> <span class="mi">2</span> <span class="n">failed</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>Project used in this article:</p>

<p><a href="http://www.graoil.co.uk/downloads/MSTest/NativeTestProject.zip" title="NativeTestProject">NativeTestProject</a>
<a href="http://www.graoil.co.uk/downloads/MSTest/NativeTestLibrary.zip" title="NativeTestLibrary">NativeTestLibrary</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Replacing MSTest with Phil Nash's Catch framework for managed C++ tests]]></title>
    <link href="http://graoil.co.uk/blog/2013/10/28/replacing-mstest-with-phil-nashs-catch-framework-for-managed-tests/"/>
    <updated>2013-10-28T19:47:00+00:00</updated>
    <id>http://graoil.co.uk/blog/2013/10/28/replacing-mstest-with-phil-nashs-catch-framework-for-managed-tests</id>
    <content type="html"><![CDATA[<p>Visual Studio 2010 has an option for creating C++ unit tests, but these tests are &#39;managed&#39; C++.  There are a number of problems with such tests:</p>

<ol>
<li>The tests are slow to compile and slow to load/run.</li>
<li>Tests tend to be more complicated than needed - the Managed C++ compiler does not allow C++ value types as member variables for example, so these have to be kept as pointers and new/delete used.</li>
<li>The debugger doesn&#39;t understand C++ types very well, so when in managed code it is often not possible to view object values. Whilst it could be argued that using TDD should avoid most uses of the debugger, sometimes it&#39;s inevitable.</li>
<li>Sometimes the Managed C++ debugger gets a &#39;mind of its own&#39; and decides to run a test to completion part way through debugging. This can be frustrating!</li>
<li>Sometimes, the process vstest.executionengine.x86.exe gets left running after the tests have completed whcih prevents the any new builds from compiling as the DLL is held open by the executionengine.  There is <a href="https://connect.microsoft.com/VisualStudio/feedback/details/771994/vstest-executionengine-x86-exe-32-bit-not-closing-vs2012-11-0-50727-1-rtmrel" title="Bug report">a bug report for this</a> but apparently no solution other than using taskkill as a pre-build event (<a href="http://stackoverflow.com/questions/13497168/vstest-executionengine-x86-exe-not-closing" title="Stack overflow answer">http://stackoverflow.com/questions/13497168/vstest-executionengine-x86-exe-not-closing</a>)</li>
</ol>

<p>In the absence of Native C++ unit tests (note: VS2012 has these - see later) I wanted to be able to share the code base between MSTest managed tests and native tests so that the build system could happily run MSTest on its managed build and I could run native tests using Catch.  This article describes my experiment to do this&#8230;</p>

<h1 id="toc_0">Differences in test philosophy</h1>

<p>To persuade MSTest to look like Catch, we have to think about how the test needs to run.  MSTest <strong>requires</strong> a class, but Catch does not. Catch allows multiple runs by using SECTIONs, but this doesn&#39;t figure in MSTest. So my first attempt used a TEST_CASE as a &#39;class&#39; wrapper and a SECTION for each test method.  This worked pretty well, except that it wasn&#39;t possible to specify individual tests to run (SECTIONs don&#39;t support tags).</p>

<p>Looking at the tests that I wanted convert, they tended to follow a pattern:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">namespace</span> <span class="n">ManagedTestProject</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">TestClass</span><span class="p">]</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ref</span> <span class="k">class</span> <span class="nc">ClassNameForTest</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// some data that needs to be initialized...</span>
</span><span class='line'>        <span class="n">Stuff</span><span class="o">*</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">//Use TestInitialize to run code before running each test</span>
</span><span class='line'>      <span class="p">[</span><span class="n">TestInitialize</span><span class="p">()]</span>
</span><span class='line'>      <span class="kt">void</span> <span class="n">MyTestInitialize</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Stuff</span><span class="p">(...);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">//Use TestCleanup to run code after each test has run</span>
</span><span class='line'>      <span class="p">[</span><span class="n">TestCleanup</span><span class="p">()]</span>
</span><span class='line'>      <span class="kt">void</span> <span class="n">MyTestCleanup</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">delete</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span><span class="o">:</span>
</span><span class='line'>      <span class="p">[</span><span class="n">TestMethod</span><span class="p">]</span>
</span><span class='line'>        <span class="kt">void</span> <span class="n">Method1</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>      <span class="p">[</span><span class="n">TestMethod</span><span class="p">]</span>
</span><span class='line'>        <span class="kt">void</span> <span class="n">Method2</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<h1 id="toc_1">A specific solution</h1>

<p>Fortunately, they always did this; declare pointer member variables for objects the test needed, create in TestInitialize and destroy in TestCleanup, in that order, followed by test methods. I realised that I could declare the data at namespace scope and wrap the initialisation/destruction in a helper class, something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">namespace</span> <span class="n">x</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Stuff</span><span class="o">*</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">setup</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Stuff</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">cleanup</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">delete</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>        <span class="n">m_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">struct</span> <span class="n">setup_wrapper</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">setup</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="o">~</span><span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">cleanup</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TEST_CASE_METHOD</span><span class="p">(</span><span class="n">setup_wrapper</span><span class="p">,</span> <span class="s">&quot;Method1&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
TEST_CASE_METHOD is a Catch macro that creates a class instance derived from setup_wrapper for each method, then runs the test in its own method. Unfortunately, not all my tests had TestInitiaize/TestCleanup methods, so I wanted to be able to specify those in a similar way to Native C++ tests. I tried several ways to do this, but ended up with a couple of macros, used like this:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="n">TEST_METHOD_INITIALIZE</span><span class="p">(</span><span class="n">setupMethodName</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Stuff</span><span class="p">(...);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">TEST_METHOD_CLEANUP</span><span class="p">(</span><span class="n">cleanupMethodName</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">delete</span> <span class="n">m_data</span><span class="p">;</span> <span class="n">m_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
and declared like this:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#define TEST_METHOD_INITIALIZE(methodName) \</span>
</span><span class='line'><span class="cp">    void setup(int)</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define TEST_METHOD_CLEANUP(methodName) \</span>
</span><span class='line'><span class="cp">    void cleanup(int)</span>
</span></code></pre></td></tr></table></div></figure>

<p>The wrapper class then calls each:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'>    <span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">setup</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">virtual</span> <span class="o">~</span><span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">cleanup</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>If there isn&#39;t a setup method, there won&#39;t be a <code>setup(int)</code> or a <code>cleanup(int)</code> but we can fix that by defining a templated setup/cleanup function at namespace scope:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">namespace</span> <span class="n">X</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">setup</span><span class="p">(</span><span class="n">T</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">cleanup</span><span class="p">(</span><span class="n">T</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="c1">// no TEST_METHOD_INITIALIZE/CLEANUP</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">setup_wrapper</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="c1">// calls template function</span>
</span><span class='line'>            <span class="n">setup</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">virtual</span> <span class="o">~</span><span class="n">setup_wrapper</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="c1">// calls template function</span>
</span><span class='line'>            <span class="n">cleanup</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TEST_CASE_METHOD</span><span class="p">(</span><span class="n">setup_wrapper</span><span class="p">,</span> <span class="s">&quot;Method1&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
C++ overload resolution will always prefer the non-templated `setup(int)` if it exists, so will call the non-templated method.

# A final solution #

Now I can embed all the nasty bits in macros and mangle some names to avoid duplicate definitions so that my final shared codebase looks like this:
    

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#include &quot;stdafx.h&quot;</span>
</span><span class='line'><span class="cp">#include &quot;MSManagedTestMacros.hpp&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &quot;lib.h&quot;    </span><span class="c1">// code under test, declares NativeTestClass</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="n">ManagedTestProject</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TEST_CLASS</span><span class="p">(</span><span class="n">TestWithoutInitializeAndCleanup</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">TEST_CLASS_CONTEXT</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">MS_TEST_CASE_METHOD</span><span class="p">(</span><span class="n">Method1</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">NativeTestClass</span><span class="o">*</span> <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NativeTestClass</span><span class="p">(</span><span class="s">&quot;Fred&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">m_data</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>            <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">result</span> <span class="o">=</span> <span class="n">m_data</span><span class="o">-&gt;</span><span class="n">getName</span><span class="p">();</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="s">&quot;Fred&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">MS_TEST_CASE_METHOD</span><span class="p">(</span><span class="n">Method2</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">NativeTestClass</span><span class="o">*</span> <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NativeTestClass</span><span class="p">(</span><span class="s">&quot;Fred&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">m_data</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>            <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">result</span> <span class="o">=</span> <span class="n">m_data</span><span class="o">-&gt;</span><span class="n">getName</span><span class="p">();</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TEST_CLASS</span><span class="p">(</span><span class="n">TestWithInitializeAndCleanup</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">TEST_CLASS_CONTEXT</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">NativeTestClass</span><span class="o">*</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">TEST_METHOD_INITIALIZE</span><span class="p">(</span><span class="n">MyInitialize</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NativeTestClass</span><span class="p">(</span><span class="s">&quot;Fred&quot;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      
</span><span class='line'>        <span class="n">TEST_METHOD_CLEANUP</span><span class="p">(</span><span class="n">MyCleanup</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">delete</span> <span class="n">m_data</span><span class="p">;</span>
</span><span class='line'>            <span class="n">m_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">MS_TEST_CASE_METHOD</span><span class="p">(</span><span class="n">Method1</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">m_data</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>            <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">result</span> <span class="o">=</span> <span class="n">m_data</span><span class="o">-&gt;</span><span class="n">getName</span><span class="p">();</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="s">&quot;Fred&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">MS_TEST_CASE_METHOD</span><span class="p">(</span><span class="n">Method2</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">m_data</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>            <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">result</span> <span class="o">=</span> <span class="n">m_data</span><span class="o">-&gt;</span><span class="n">getName</span><span class="p">();</span>
</span><span class='line'>            <span class="n">REQUIRE</span><span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span> <span class="c1">// namespace </span>
</span></code></pre></td></tr></table></div></figure>

<p>Running this with MSTest gives this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">ManagedTestProject</span><span class="o">&gt;</span><span class="s">&quot;c:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\MSTest.exe&quot;</span> <span class="o">/</span><span class="n">testcontain</span>
</span><span class='line'><span class="nl">er:</span><span class="n">Debug</span><span class="err">\</span><span class="n">DefaultTest</span><span class="p">.</span><span class="n">dll</span>
</span><span class='line'><span class="n">Microsoft</span> <span class="p">(</span><span class="n">R</span><span class="p">)</span> <span class="n">Test</span> <span class="n">Execution</span> <span class="n">Command</span> <span class="n">Line</span> <span class="n">Tool</span> <span class="n">Version</span> <span class="mf">11.0.50727.1</span>
</span><span class='line'><span class="n">Copyright</span> <span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="n">Microsoft</span> <span class="n">Corporation</span><span class="p">.</span> <span class="n">All</span> <span class="n">rights</span> <span class="n">reserved</span><span class="p">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">Loading</span> <span class="n">Debug</span><span class="err">\</span><span class="n">DefaultTest</span><span class="p">.</span><span class="n">dll</span><span class="p">...</span>
</span><span class='line'><span class="n">Starting</span> <span class="n">execution</span><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="n">Results</span>               <span class="n">Top</span> <span class="n">Level</span> <span class="n">Tests</span>
</span><span class='line'><span class="o">-------</span>               <span class="o">---------------</span>
</span><span class='line'><span class="n">Passed</span>                <span class="n">ManagedTestProject</span><span class="p">.</span><span class="n">TestWithInitializeAndCleanup</span><span class="p">.</span><span class="n">Method1</span>
</span><span class='line'><span class="n">Failed</span>                <span class="n">ManagedTestProject</span><span class="p">.</span><span class="n">TestWithInitializeAndCleanup</span><span class="p">.</span><span class="n">Method2</span>
</span><span class='line'><span class="n">Passed</span>                <span class="n">ManagedTestProject</span><span class="p">.</span><span class="n">TestWithoutInitializeAndCleanup</span><span class="p">.</span><span class="n">Method1</span>
</span><span class='line'><span class="n">Failed</span>                <span class="n">ManagedTestProject</span><span class="p">.</span><span class="n">TestWithoutInitializeAndCleanup</span><span class="p">.</span><span class="n">Method2</span>
</span><span class='line'><span class="mi">2</span><span class="o">/</span><span class="mi">4</span> <span class="n">test</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">Passed</span><span class="p">,</span> <span class="mi">2</span> <span class="n">Failed</span>
</span><span class='line'>
</span><span class='line'><span class="n">Summary</span>
</span><span class='line'><span class="o">-------</span>
</span><span class='line'><span class="n">Test</span> <span class="n">Run</span> <span class="n">Failed</span><span class="p">.</span>
</span><span class='line'>  <span class="n">Passed</span>  <span class="mi">2</span>
</span><span class='line'>  <span class="n">Failed</span>  <span class="mi">2</span>
</span><span class='line'>  <span class="o">---------</span>
</span><span class='line'>  <span class="n">Total</span>   <span class="mi">4</span>
</span><span class='line'><span class="n">Results</span> <span class="nl">file:</span>  <span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">ManagedTestProject</span><span class="err">\</span><span class="n">TestResults</span><span class="err">\</span><span class="n">name_machine</span> <span class="mi">2013</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">28</span> <span class="mi">20</span><span class="n">_24_15</span><span class="p">.</span><span class="n">trx</span>
</span><span class='line'><span class="n">Test</span> <span class="nl">Settings:</span> <span class="n">Default</span> <span class="n">Test</span> <span class="n">Settings</span>
</span></code></pre></td></tr></table></div></figure>

<p>Recompiling and running the same code with Catch gives:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="nl">C:</span><span class="err">\</span><span class="n">Projects</span><span class="err">\</span><span class="n">ManagedTestProject</span><span class="err">\</span><span class="n">Debug</span><span class="o">&gt;</span><span class="n">CatchTestProject</span><span class="p">.</span><span class="n">exe</span>
</span><span class='line'>
</span><span class='line'><span class="n">CatchTestProject</span><span class="p">.</span><span class="n">exe</span> <span class="n">is</span> <span class="n">a</span> <span class="n">Catch</span> <span class="n">v1</span><span class="mf">.0</span> <span class="n">b11</span> <span class="n">host</span> <span class="n">application</span><span class="p">.</span>
</span><span class='line'><span class="n">Run</span> <span class="n">with</span> <span class="o">-?</span> <span class="k">for</span> <span class="n">options</span>
</span><span class='line'>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">TestWithoutInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">managedtestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">managedtestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">25</span><span class="p">)</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;Fred&quot;</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">TestWithInitializeAndCleanup</span><span class="o">::</span><span class="n">Method2</span>
</span><span class='line'><span class="o">-------------------------------------------------------------------------------</span>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">managedtestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">53</span><span class="p">)</span>
</span><span class='line'><span class="p">...............................................................................</span>
</span><span class='line'>
</span><span class='line'><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">managedtestproject</span><span class="err">\</span><span class="n">unittestcatch</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">57</span><span class="p">)</span><span class="o">:</span> <span class="nl">FAILED:</span>
</span><span class='line'>  <span class="n">REQUIRE</span><span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span> <span class="p">)</span>
</span><span class='line'><span class="n">with</span> <span class="nl">expansion:</span>
</span><span class='line'>  <span class="s">&quot;Fred&quot;</span> <span class="o">!=</span> <span class="s">&quot;Fred&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="o">===============================================================================</span>
</span><span class='line'><span class="mi">4</span> <span class="n">test</span> <span class="n">cases</span> <span class="o">-</span> <span class="mi">2</span> <span class="n">failed</span> <span class="p">(</span><span class="mi">8</span> <span class="n">assertions</span> <span class="o">-</span> <span class="mi">2</span> <span class="n">failed</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>Much more satisfactory&#8230;</p>

<h1 id="toc_2">VS2012 and Native C++ Tests</h1>

<p>In VS2010, you can create a C++ test project like this:</p>

<div style="float: center; margin: 10px;">
  <img src="http://www.graoil.co.uk/images/MSTest/VS2010TestProject.png?raw=true" alt="VS2010" Title="VS2010"/>
</div>

<p>This is always a managed C++ project and the macros above work fine.  In VS2012, there are two options&#8230;.but I think I&#39;ll leave that for another post ;-) </p>

<h3 id="toc_3"><a name="projectzips"></a> Projects used in this article:</h3>

<p><a href="http://www.graoil.co.uk/downloads/MSTest/ManagedTestProject.zip" title="ManagedTestProject">ManagedTestProject</a>
<a href="http://www.graoil.co.uk/downloads/MSTest/NativeTestLibrary.zip" title="NativeTestLibrary">NativeTestLibrary</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Debugging Phil Nash's CATCH framework with gdb on Mingw32]]></title>
    <link href="http://graoil.co.uk/blog/2013/10/15/debugging-phil-nashs-catch-framework-with-gdb-on-mingw32/"/>
    <updated>2013-10-15T19:31:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/10/15/debugging-phil-nashs-catch-framework-with-gdb-on-mingw32</id>
    <content type="html"><![CDATA[<p>So you have Mingw (or gdb on Linux) and you&#39;d like to use Phil Nash&#39;s CATCH testing framework.  This article will go through some simple tests that we can construct and how to use it in that environment.</p>

<p>Throughout this document I use a test project that I&#39;ve setup in C:\Projects\catch_gdb_example - I&#39;ll use the Mingw directory /c/Projects/catch_gdb_example to access it.</p>

<p>For testing, I was using the latest CATCH with Mingw32:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ uname -a
</span><span class='line'>MINGW32_NT-6.1 machine 1.0.18(0.48/3/2) 2012-11-21 22:34 i686 Msys</span></code></pre></td></tr></table></div></figure>
and Git:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git --version
</span><span class='line'>git version 1.8.3.msysgit.0</span></code></pre></td></tr></table></div></figure>

<h1 id="toc_0">First, CATCH your framework</h1>

<p>There are two easy ways to get CATCH, and one that is slightly harder, so guess which one I chose?  The easy way is download the source zip file, available from <a href="https://github.com/philsquared/Catch">https://github.com/philsquared/Catch</a> and unpack it - you can either use the full include headers (from <code>catch/include</code>) or the single header (from <code>catch/single_include</code>).</p>

<p>The alternative that I chose was to first download and install git for windows (<a href="http://msysgit.github.com/">http://msysgit.github.com/</a>).  </p>

<p>Then I cloned Phil&#39;s repository with:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /c/Projects/catch_gdb_example
</span><span class='line'>git clone <a href="https://github.com/philsquared/Catch.git">https://github.com/philsquared/Catch.git</a></span></code></pre></td></tr></table></div></figure></p>

<p>&#8230;this clones the CATCH framework and puts it into the &#39;Catch&#39; sub&#8211;directory.</p>

<h1 id="toc_1">Build a sanity check</h1>

<p>Next create a cpp file (e.g. main.cpp) with the following contents:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#define CATCH_CONFIG_MAIN
</span><span class='line'>#include "catch.hpp"
</span><span class='line'>
</span><span class='line'>TEST_CASE( "main/sanity check", "[sanity]" )
</span><span class='line'>{
</span><span class='line'>    REQUIRE(true);
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>

<p>Now a simple makefile:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>CC=g++
</span><span class='line'>CFLAGS=-c -DDEBUG -I./Catch/include -g -Wall -pedantic -Wextra -std=c++0x
</span><span class='line'>LDFLAGS=
</span><span class='line'>SOURCES= \
</span><span class='line'>    main.cpp
</span><span class='line'>    
</span><span class='line'>OBJECTS=$(SOURCES:.cpp=.o)
</span><span class='line'>EXECUTABLE=test.exe
</span><span class='line'>
</span><span class='line'>all: $(SOURCES) $(EXECUTABLE)
</span><span class='line'>  
</span><span class='line'>$(EXECUTABLE): $(OBJECTS) 
</span><span class='line'>  $(CC) $(LDFLAGS) $(OBJECTS) -o $@
</span><span class='line'>
</span><span class='line'>.cpp.o:
</span><span class='line'>  $(CC) $(CFLAGS) $&lt; -o $@
</span><span class='line'>
</span><span class='line'>clean:
</span><span class='line'>  rm -rf *.o $(EXECUTABLE)</span></code></pre></td></tr></table></div></figure>

<p>&#8230;and we can build the test with:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>make</span></code></pre></td></tr></table></div></figure></p>

<p>and run with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>User@machine /c/Projects/catch_gdb_example
</span><span class='line'>$ make
</span><span class='line'>g++ -c -DDEBUG -I./Catch/include -g -Wall -pedantic -Wextra -std=c++0x main.cpp -o main.o
</span><span class='line'>g++  main.o -o test.exe
</span><span class='line'>
</span><span class='line'>User@machine /c/Projects/catch_gdb_example
</span><span class='line'>$ ./test.exe main/*
</span><span class='line'>All tests passed (1 assertion in 1 test case)</span></code></pre></td></tr></table></div></figure>

<h1 id="toc_2">Now for the debugger</h1>

<p>Add the following failing test:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>TEST_CASE("test/fails","[gdb]")
</span><span class='line'>{
</span><span class='line'>    int a = 1;
</span><span class='line'>    REQUIRE(a == 0);
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>
and recompile:

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>User@machine /c/Projects/catch_gdb_example
</span><span class='line'>$ make
</span><span class='line'>g++ -c -DDEBUG -I./Catch/include -g -Wall -pedantic -Wextra -std=c++0x main.cpp -o main.o
</span><span class='line'>g++  main.o -o test.exe</span></code></pre></td></tr></table></div></figure>

<p>Now you can run the test program and set it to break on the failure of test conditions:</p>

<!-- more -->

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gdb ./test
</span><span class='line'>GNU gdb (GDB) 7.6.1
</span><span class='line'>Copyright (C) 2013 Free Software Foundation, Inc.
</span><span class='line'>License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
</span><span class='line'>This is free software: you are free to change and redistribute it.
</span><span class='line'>There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
</span><span class='line'>and "show warranty" for details.
</span><span class='line'>This GDB was configured as "mingw32".
</span><span class='line'>For bug reporting instructions, please see:
</span><span class='line'>&lt;http://www.gnu.org/software/gdb/bugs/&gt;...
</span><span class='line'>Reading symbols from c:\Projects\catch_gdb_example\test.exe...done.
</span><span class='line'>(gdb)</span></code></pre></td></tr></table></div></figure>

<p>Now you can run the (failing) test case:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(gdb) r -b
</span><span class='line'>Starting program: c:\Projects\catch_gdb_example/./test.exe -b
</span><span class='line'>[New Thread 8364.0x2398]
</span><span class='line'> 
</span><span class='line'>test.exe is a Catch v1.0 b10 host application.
</span><span class='line'>Run with -? for options
</span><span class='line'>
</span><span class='line'>-------------------------------------------------------------------------------
</span><span class='line'>test/fails
</span><span class='line'>-------------------------------------------------------------------------------
</span><span class='line'>main.cpp:9
</span><span class='line'>...............................................................................
</span><span class='line'>
</span><span class='line'>main.cpp:12: FAILED:
</span><span class='line'>  REQUIRE( a == 0 )
</span><span class='line'>with expansion:
</span><span class='line'>  1 == 0
</span><span class='line'>
</span><span class='line'> 
</span><span class='line'>Program received signal SIGTRAP, Trace/breakpoint trap.
</span><span class='line'>0x7685321a in KERNELBASE!DebugBreak () from C:\windows\syswow64\KernelBase.dll
</span><span class='line'>(gdb)</span></code></pre></td></tr></table></div></figure>

<p>If you look at the stack you&#39;ll see that we aren&#39;t actually in the test function:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>0x7685321a in KERNELBASE!DebugBreak () from C:\windows\syswow64\KernelBase.dll
</span><span class='line'>(gdb) bt
</span><span class='line'>#0  0x7685321a in KERNELBASE!DebugBreak () from C:\windows\syswow64\KernelBase.dll
</span><span class='line'>#1  0x0040602d in ____C_A_T_C_H____T_E_S_T____9 () at main.cpp:12
</span><span class='line'>#2  0x0041fcf9 in Catch::FreeFunctionTestCase::invoke (this=0xb72850)
</span><span class='line'>    at ./Catch/include/internal/catch_test_case_registry_impl.hpp:103
</span><span class='line'>#3  0x00403837 in Catch::TestCase::invoke (this=0xb72b10)
</span><span class='line'>    at ./Catch/include/internal/catch_test_case_info.hpp:78
</span><span class='line'>#4  0x00409621 in _fu32___ZSt4cerr () at ./Catch/include/internal/catch_runner_impl.hpp:277
</span><span class='line'>#5  0x0040a066 in Catch::RunContext::runTest (this=0x28fbc8, testCase=...)
</span><span class='line'>    at ./Catch/include/internal/catch_runner_impl.hpp:123
</span><span class='line'>#6  0x00417473 in Catch::Runner::runTestsForGroup (this=0x28fcdc, context=..., filterGroup=...)
</span><span class='line'>    at ./Catch/include/catch_runner.hpp:67
</span><span class='line'>#7  0x00417744 in Catch::Runner::runTests (this=0x28fcdc) at ./Catch/include/catch_runner.hpp:48
</span><span class='line'>#8  0x004182c2 in Catch::Session::run (this=0x28fe6c) at ./Catch/include/catch_runner.hpp:203
</span><span class='line'>#9  0x004181fa in Catch::Session::run (this=0x28fe6c, argc=2, argv=0xb72dc8)
</span><span class='line'>    at ./Catch/include/catch_runner.hpp:186
</span><span class='line'>#10 0x00405959 in main (argc=2, argv=0xb72dc8) at ./Catch/include/internal/catch_default_main.hpp:15
</span><span class='line'>(gdb)</span></code></pre></td></tr></table></div></figure>

<p>So we need to go up 1 frame and then we can examine variables in the test:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(gdb) up
</span><span class='line'>#1  0x0040602d in ____C_A_T_C_H____T_E_S_T____9 () at main.cpp:12
</span><span class='line'>12          REQUIRE(a == 0);
</span><span class='line'>(gdb) p a
</span><span class='line'>$1 = 1
</span><span class='line'>(gdb)</span></code></pre></td></tr></table></div></figure>

<p>Oh look, &#39;a == 1&#39;, why did I think it should be 0?</p>

<p>That&#39;s all there is to it!  Continuing the run gives the expected CATCH output:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(gdb) c
</span><span class='line'>Continuing.
</span><span class='line'>===============================================================================
</span><span class='line'>2 test cases - 1 failed (2 assertions - 1 failed)
</span><span class='line'>
</span><span class='line'>[Inferior 1 (process 8364) exited with code 01]
</span><span class='line'>(gdb)</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deconstructing compile time FizzBuzz in C++ without Boost]]></title>
    <link href="http://graoil.co.uk/blog/2013/10/09/compile-time-fizzbuzz-without-boost/"/>
    <updated>2013-10-09T05:53:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/10/09/compile-time-fizzbuzz-without-boost</id>
    <content type="html"><![CDATA[<p>Several years ago <a href="http://www.adampetersen.se/articles/fizzbuzz.htm" title="Adam Petersen&#39;s FizzBuzz">Adam Peterson published an article on how to implement FizzBuzz at cmpile time in C++</a>. The code was clever, but had a dependency on Boost and didn&#39;t go into great detail on how it worked, so I thought I&#39;d write it again from scratch and try to explain my workings.  In this article I&#39;m only going to show examples that would work for very small FizzBuzz sequences because, well, this is a learning exercise not a typing exercise!</p>

<p>At the end of this article you&#39;ll find the source that I used to run the examples below - up to 16 items in the sequence. Much of what follows is a variation on the code in chapter 5 of <a href="http://www.amazon.co.uk/Template-Metaprogramming-Concepts-Techniques-Beyond/dp/0321227255/ref=sr_1_1?ie=UTF8&amp;qid=1381403602&amp;sr=8-1&amp;keywords=c%2B%2B+template+metaprogramming" title="C++ Template Metaprogramming">C++ Template Metaprogramming</a>, in particular the use of mpl::vector and the &#39;tiny&#39; sequence.</p>

<h1 id="toc_0">First, get an error message</h1>

<p>To make this work, we first have persuade the compiler to print an error message to the console when we build the program, something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">struct</span> <span class="n">void_</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T0</span> <span class="o">=</span> <span class="n">void_</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T1</span> <span class="o">=</span> <span class="n">void_</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span> <span class="o">=</span> <span class="n">void_</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T3</span> <span class="o">=</span> <span class="n">void_</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">vector</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">vector</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T0</span> <span class="n">T0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T1</span> <span class="n">T1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T2</span> <span class="n">T2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T3</span> <span class="n">T3</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>
<!-- more -->
This is a simplified version of the mpl::vector example from C++ Template Metaprogramming. In particular note the typedef for &#8216;self&#8217; and the typedefs for template parameters; we&#8217;ll be using these in our helper templates. When we compile this with VS2010, we get this:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">ClCompile:</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>  <span class="n">main</span><span class="p">.</span><span class="n">cpp</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">243</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2039:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span class="n">member</span> <span class="n">of</span> <span class="err">&#39;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="o">&gt;</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="n">with</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">[</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T0</span><span class="o">=</span><span class="kt">int</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T1</span><span class="o">=</span><span class="kt">long</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T2</span><span class="o">=</span><span class="kt">double</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">]</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">243</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2146:</span> <span class="n">syntax</span> <span class="n">error</span> <span class="o">:</span> <span class="n">missing</span> <span class="sc">&#39;;&#39;</span> <span class="n">before</span> <span class="n">identifier</span> <span class="err">&#39;</span><span class="n">res</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">243</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C4430:</span> <span class="n">missing</span> <span class="n">type</span> <span class="n">specifier</span> <span class="o">-</span> <span class="kt">int</span> <span class="n">assumed</span><span class="p">.</span> <span class="nl">Note:</span> <span class="n">C</span><span class="o">++</span> <span class="n">does</span> <span class="n">not</span> <span class="n">support</span> <span class="k">default</span><span class="o">-</span><span class="kt">int</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">243</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2065:</span> <span class="err">&#39;</span><span class="n">res</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">undeclared</span> <span class="n">identifier</span>
</span></code></pre></td></tr></table></div></figure>
This is promising; it displays the types that we put in, and in the right order.  That&#8217;s fine, but the compiler works with types and we need to display numeric values, so we need a helper to convert intergers to types. [Loki](http://loki-lib.sourceforge.net/ &#8220;Loki library&#8221;) calls this `Int2Type` and [Boost.MPL](http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/index.html &#8220;Boost.MPL&#8221;) has `mpl::int_` that does the same thing, but it&#8217;s really easy to implement:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">N</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">int_</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">value</span> <span class="o">=</span> <span class="n">N</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>
For each distinct value &#8216;N&#8217;, this template creates a distinct type, so `int_<0>` is a different type from `int_<1>` etc.

Now we can put this into our &#8216;error&#8217; template:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span> <span class="o">&gt;::</span><span class="n">compilation_error_here</span> <span class="n">res</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>
and we get error output with increasing numeric values, which is what we want:

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">250</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2039:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span class="n">member</span> <span class="n">of</span> <span class="err">&#39;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="o">&gt;</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="n">with</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">[</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T0</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T1</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T2</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>

<h1 id="toc_1">Now generate the sequence&#8230;</h1>

<p>That&#39;s fine, but now we need to generate the sequence.</p>

<p>To get a new sequence, we have to append a new type (e.g. <code>int_&lt;1&gt;</code>) to an existing sequence (<code>int_&lt;0&gt;</code>). Loki uses typelists that we could just append to but here we&#39;re modelling our sequence on <code>mpl::vector</code> so we need to do more work.</p>

<p>We can only do that if we know how big our current sequence is, so we first need to specialize our template for every possible size of sequence (this is why we&#39;re only working with small sequences!). This is a very much simplified version of the code in C++ Template Metaprogramming, in particular I&#39;ve not implemented &#39;apply&#39; metafunctions to make it clearer what&#39;s going on. Note that here the size is derived from the <code>int_&lt;&gt;</code> helper template that we defined earlier so that we can get the &#39;value&#39; later:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T0</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T3</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size_impl</span> <span class="o">:</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">4</span><span class="o">&gt;</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T0</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size_impl</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="p">,</span><span class="n">void_</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">3</span><span class="o">&gt;</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T0</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T1</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size_impl</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T0</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size_impl</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size_impl</span><span class="o">&lt;</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="p">,</span><span class="n">void_</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">size</span> <span class="o">:</span> <span class="n">size_impl</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T0</span><span class="p">,</span> <span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T1</span>
</span><span class='line'>    <span class="p">,</span> <span class="k">typename</span>  <span class="n">Sequence</span><span class="o">::</span><span class="n">T2</span><span class="p">,</span> <span class="k">typename</span>  <span class="n">Sequence</span><span class="o">::</span><span class="n">T3</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span></code></pre></td></tr></table></div></figure>

<p>For an existing length, the &#39;size&#39; template will select the &#39;best&#39; specialisation of the size_impl template and add the new type as the last parameter. So now we can append a new type to another:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="p">,</span> <span class="kt">int</span> <span class="n">N</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back_impl</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back_impl</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="mi">0</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">:</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">void_</span><span class="p">,</span> <span class="n">void_</span><span class="p">,</span> <span class="n">void_</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back_impl</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="mi">1</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">:</span> <span class="n">vector</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T0</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">void_</span><span class="p">,</span> <span class="n">void_</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back_impl</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">:</span> <span class="n">vector</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T0</span><span class="p">,</span> <span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T1</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">void_</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back_impl</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="mi">3</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">:</span> <span class="n">vector</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T0</span><span class="p">,</span> <span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T1</span><span class="p">,</span> <span class="k">typename</span> <span class="n">Sequence</span><span class="o">::</span><span class="n">T2</span><span class="p">,</span> <span class="n">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">Sequence</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">push_back</span>
</span><span class='line'>    <span class="o">:</span> <span class="n">push_back_impl</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">size</span><span class="o">&lt;</span><span class="n">Sequence</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span></code></pre></td></tr></table></div></figure>

<p>The same idea applies here; we use the push_back template to select the most appropriate push_back_impl template for the existing size. Note that we&#39;re not checking that the sequence is already full; this shouldn&#39;t be a problem with our limited use case for this example.</p>

<p>Now we can use the recursive parts of Adam&#39;s RunFizzBuzz to generate our sequence:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">template</span><span class="o">&lt;</span><span class="kt">int</span> <span class="n">i</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">int_</span><span class="o">&lt;</span><span class="n">i</span><span class="o">&gt;</span> <span class="n">Number</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">push_back</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">,</span> <span class="n">Number</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">3</span><span class="o">&gt;::</span><span class="n">type</span><span class="o">::</span><span class="n">compilation_error_here</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>In this case the compiler will use the primary template and will recursively subtract 1 from the number and then instantiate itself until the number gets to zero, when it will use the specialisation for &#39;0&#39; to terminate the sequence.</p>

<p>which gives us:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">306</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2039:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span class="n">member</span> <span class="n">of</span> <span class="err">&#39;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="p">,</span><span class="n">T3</span><span class="o">&gt;</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="n">with</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">[</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T0</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T1</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T2</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T3</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">3</span><span class="o">&gt;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>

<p>That looks a lot like what we want, but so far we havn&#39;t output Fizz or Buzz; we&#39;ll fix that now&#8230;</p>

<h1 id="toc_2">Selecting Fizz</h1>

<p>We need to select a different type (<code>Fizz</code>) if the number is divisible by 3. This calculation is a compile time constant for each template instantiation, so we can use it as a parameter to a template; <code>if_c</code> is a fairly simple type selection template that works by specializing for one value of the condition (in this case &#39;false&#39;):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">c</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">if_c_impl</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T1</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">if_c_impl</span><span class="o">&lt;</span><span class="n">T1</span><span class="p">,</span> <span class="n">T2</span><span class="p">,</span> <span class="kc">false</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">T2</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;</span><span class="kt">bool</span> <span class="n">c</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T2</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">if_c</span> <span class="o">:</span> <span class="n">if_c_impl</span><span class="o">&lt;</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="p">,</span><span class="n">c</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{};</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now we can add the condition for Fizz:
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">struct</span> <span class="n">Fizz</span><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;</span><span class="kt">int</span> <span class="n">i</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">int<em></span><span class="o">&lt;</span><span class="n">i</span><span class="o">&gt;</span> <span class="n">Number</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">if_c</span><span class="o">&lt;</span><span class="n">i</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">==</span> <span class="mi">0</span><span class="p">,</span> <span class="n">Fizz</span><span class="p">,</span> <span class="n">Number</span><span class="o">&gt;</span> <span class="n">condition3</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">push_back</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">,</span> <span class="k">typename</span> <span class="n">condition3</span><span class="o">::</span><span class="n">type</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">int</em></span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>, which produces:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">327</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2039:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span class="n">member</span> <span class="n">of</span> <span class="err">&#39;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="p">,</span><span class="n">T3</span><span class="o">&gt;</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="n">with</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">[</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T0</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T1</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T2</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T3</span><span class="o">=</span><span class="n">Fizz</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>

<p>which is exactly what we want!</p>

<p>Adding the additional conditions for Buzz and FizzBuzz is trivial (as long as we remember to test for FizzBuzz in the right place!):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="k">struct</span> <span class="n">Fizz</span><span class="p">{};</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Buzz</span><span class="p">{};</span>
</span><span class='line'><span class="k">struct</span> <span class="n">FizzBuzz</span><span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;</span><span class="kt">int</span> <span class="n">i</span><span class="o">&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">int_</span><span class="o">&lt;</span><span class="n">i</span><span class="o">&gt;</span> <span class="n">Number</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">if_c</span><span class="o">&lt;</span><span class="n">i</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">==</span> <span class="mi">0</span><span class="p">,</span> <span class="n">Fizz</span><span class="p">,</span> <span class="n">Number</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">condition1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">if_c</span><span class="o">&lt;</span><span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">),</span> <span class="n">Buzz</span><span class="p">,</span> <span class="n">condition1</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">condition2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">if_c</span><span class="o">&lt;</span><span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">),</span> <span class="n">FizzBuzz</span><span class="p">,</span> <span class="n">condition2</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">condition3</span><span class="p">;</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="k">typename</span> <span class="n">push_back</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">,</span> <span class="n">condition3</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">template</span><span class="o">&lt;&gt;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">typedef</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">type</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="mi">1</span><span class="o">&gt;</span><span class="nl">c:</span><span class="err">\</span><span class="n">projects</span><span class="err">\</span><span class="n">fizzbuzz_example</span><span class="err">\</span><span class="n">main</span><span class="p">.</span><span class="n">cpp</span><span class="p">(</span><span class="mi">305</span><span class="p">)</span><span class="o">:</span> <span class="n">error</span> <span class="nl">C2039:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span class="n">member</span> <span class="n">of</span> <span class="err">&#39;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">T0</span><span class="p">,</span><span class="n">T1</span><span class="p">,</span><span class="n">T2</span><span class="p">,</span><span class="n">T3</span><span class="p">,</span><span class="n">T4</span><span class="p">,</span><span class="n">T5</span><span class="p">,</span><span class="n">T6</span><span class="p">,</span><span class="n">T7</span><span class="p">,</span><span class="n">T8</span><span class="p">,</span><span class="n">T9</span><span class="p">,</span><span class="n">T10</span><span class="p">,</span><span class="n">T11</span><span class="p">,</span><span class="n">T12</span><span class="p">,</span><span class="n">T13</span><span class="p">,</span><span class="n">T14</span><span class="p">,</span><span class="n">T15</span><span class="o">&gt;</span><span class="err">&#39;</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="n">with</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">[</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T0</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T1</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T2</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T3</span><span class="o">=</span><span class="n">Fizz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T4</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">4</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T5</span><span class="o">=</span><span class="n">Buzz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T6</span><span class="o">=</span><span class="n">Fizz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T7</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">7</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T8</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">8</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T9</span><span class="o">=</span><span class="n">Fizz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T10</span><span class="o">=</span><span class="n">Buzz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T11</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">11</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T12</span><span class="o">=</span><span class="n">Fizz</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T13</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">13</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T14</span><span class="o">=</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">14</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>              <span class="n">T15</span><span class="o">=</span><span class="n">FizzBuzz</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span>          <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>

<p>Just for completeness, it works on gcc (MingW) too, although it is a little harder to see&#8230;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="err">$</span> <span class="n">gcc</span> <span class="o">--</span><span class="n">version</span>
</span><span class='line'><span class="n">gcc</span><span class="p">.</span><span class="n">exe</span> <span class="p">(</span><span class="n">GCC</span><span class="p">)</span> <span class="mf">4.8.1</span>
</span><span class='line'><span class="n">Copyright</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="mi">2013</span> <span class="n">Free</span> <span class="n">Software</span> <span class="n">Foundation</span><span class="p">,</span> <span class="n">Inc</span><span class="p">.</span>
</span><span class='line'><span class="n">This</span> <span class="n">is</span> <span class="n">free</span> <span class="n">software</span><span class="p">;</span> <span class="n">see</span> <span class="n">the</span> <span class="n">source</span> <span class="k">for</span> <span class="n">copying</span> <span class="n">conditions</span><span class="p">.</span>  <span class="n">There</span> <span class="n">is</span> <span class="n">NO</span>
</span><span class='line'><span class="n">warranty</span><span class="p">;</span> <span class="n">not</span> <span class="n">even</span> <span class="k">for</span> <span class="n">MERCHANTABILITY</span> <span class="n">or</span> <span class="n">FITNESS</span> <span class="n">FOR</span> <span class="n">A</span> <span class="n">PARTICULAR</span> <span class="n">PURPOSE</span><span class="p">.</span>
</span><span class='line'>
</span><span class='line'><span class="err">$</span> <span class="n">make</span>
</span><span class='line'><span class="n">g</span><span class="o">++</span> <span class="o">-</span><span class="n">c</span> <span class="o">-</span><span class="n">Wall</span> <span class="n">main</span><span class="p">.</span><span class="n">cpp</span> <span class="o">-</span><span class="n">o</span> <span class="n">main</span><span class="p">.</span><span class="n">o</span>
</span><span class='line'><span class="n">main</span><span class="p">.</span><span class="nl">cpp:</span> <span class="n">In</span> <span class="n">function</span> <span class="err">&#39;</span><span class="kt">int</span> <span class="n">main</span><span class="p">()</span><span class="err">&#39;</span><span class="o">:</span>
</span><span class='line'><span class="n">main</span><span class="p">.</span><span class="nl">cpp:</span><span class="mi">306</span><span class="o">:</span><span class="mi">13</span><span class="o">:</span> <span class="nl">error:</span> <span class="err">&#39;</span><span class="n">compilation_error_here</span><span class="err">&#39;</span> <span class="n">in</span> <span class="err">&#39;</span><span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">15</span><span class="o">&gt;::</span><span class="n">type</span> <span class="p">{</span><span class="n">aka</span> <span class="k">struct</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">int_</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">&gt;</span><span class="p">,</span>
</span><span class='line'> <span class="n">Fizz</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">4</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Buzz</span><span class="p">,</span> <span class="n">Fizz</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">7</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">8</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Fizz</span><span class="p">,</span> <span class="n">Buzz</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">11</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Fizz</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">13</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">int_</span><span class="o">&lt;</span><span class="mi">14</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">FizzBuzz</span><span class="o">&gt;</span><span class="p">}</span><span class="err">&#39;</span> <span class="n">does</span> <span class="n">not</span> <span class="n">name</span>
</span><span class='line'><span class="n">a</span> <span class="n">type</span>
</span><span class='line'>     <span class="k">typedef</span> <span class="n">RunFizzBuzz</span><span class="o">&lt;</span><span class="mi">15</span><span class="o">&gt;::</span><span class="n">type</span><span class="o">::</span><span class="n">compilation_error_here</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'>             <span class="o">^</span>
</span><span class='line'><span class="nl">make:</span> <span class="o">***</span> <span class="p">[</span><span class="n">main</span><span class="p">.</span><span class="n">o</span><span class="p">]</span> <span class="n">Error</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>

<p>You can find the code used in this article <a href="http://www.graoil.co.uk/downloads/fizzbuzz_example.zip" title="FizzBuzz example">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Ruby Installer to install Redcarpet and Github-linguist with Octopress on Windows]]></title>
    <link href="http://graoil.co.uk/blog/2013/09/30/using-rubyinstaller-to-install-redcarpet-with-octopress-on-windows/"/>
    <updated>2013-09-30T17:32:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/09/30/using-rubyinstaller-to-install-redcarpet-with-octopress-on-windows</id>
    <content type="html"><![CDATA[<p>This article follows three posts describing how to install Ruby 1.9.3 to use Octopress with redcarpet and github-linguist in a native MingW environment; using what I learnt in that process I&#39;ve figured out how to use the Ruby Installer for Windows to do the same thing - this post describes how to do that.  I plan to leave the original posts (<a href="http://graoil.co.uk/blog/2013/09/24/setting-up-mingw/">starting here</a>) in case they may provide inspiration for someone else with similar ambitions.</p>

<p>I wanted to use redcarpet/github-linguist for markdown in Octopress, however there&#39;s a dependency on the charlock_holmes Gem that requires native code libraries (file, ICU), some of which it needs to build.  It turns out that we <em>can</em> do this with Ruby Installer</p>

<h1 id="toc_0">First, install Ruby&#8230;</h1>

<p>Install and install ruby 1.9.3 (<a href="http://rubyinstaller.org/downloads/" title="Ruby installer downloads">from rubyinstaller.org</a>)
Download the devkit (<a href="https://github.com/downloads/oneclick/rubyinstaller/DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe">current version here</a>)
Unpack dev kit, e.g. into C:\Ruby193\devkit
Setup the Ruby installation to work with the devkit:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ruby dk.rb init
</span><span class='line'>ruby dk.rb install</span></code></pre></td></tr></table></div></figure>
All of this follows the regular instructions for installing Ruby and the devkit.
&lt;!&#8211; more &#8211;&gt;</p>

<h1 id="toc_1">Install Python 2.7</h1>

<p>Next, install Python 2.7, if you havn&#39;t already - this is required for pygments.rb.  Make sure Python is in your path.  Check in a Mingw window:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>python --version</span></code></pre></td></tr></table></div></figure>

<h1 id="toc_2">Additional tools for devkit</h1>

<p>For some reason, the devkit doesn&#39;t come with tar, zip &amp; patch so install these from MingW downloads. I used 7-zip to unpack the wget and xz and then used the binaries of those tools to get the rest; if you want you can just download the missing tools and unpack them with 7-zip, then copy the binaries manually.</p>

<p>If you want to use MingW, first you need to download and unpack xz, wget and dlls for openssl and liblzma; <a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/wget/wget-1.12-1/wget-1.12-1-msys-1.0.13-bin.tar.lzma/download">download wget from here</a> , <a href="http://sourceforge.net/projects/mingw/files/MSYS/Base/xz/xz-5.0.3-1/xz-5.0.3-1-msys-1.0.17-bin.tar.lzma/download">xz from here</a>, <a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/openssl/openssl-1.0.0-1/libopenssl-1.0.0-1-msys-1.0.13-dll-100.tar.lzma/download">openssl dlls from here</a> and <a href="http://sourceforge.net/projects/mingw/files/MSYS/Base/xz/xz-5.0.3-1/liblzma-5.0.3-1-msys-1.0.17-dll-5.tar.lzma/download">liblzma dlls from here</a>. Unpack them all with 7-zip (unpack the tar files as well) and copy the binaries to the bin, etc and lib directories of your devkit (copying with Windows Explorer is fine).</p>

<p>Start the devkit using the msys.bat file located in the devkit root and check that they installed:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ wget --version
</span><span class='line'>GNU Wget 1.12 built on msys.
</span><span class='line'>...
</span><span class='line'>$ xz --version
</span><span class='line'>xz (XZ Utils) 5.0.3
</span><span class='line'>liblzma 5.0.3</span></code></pre></td></tr></table></div></figure> 
Now you should be able to use MingW/MSYS to download and install the missing tools; create a temporary directory to unpack the files into and copy the files:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~
</span><span class='line'>mkdir tmp
</span><span class='line'>cd tmp
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/MSYS/Base/tar/tar-1.22-1/tar-1.22-1-msys-1.0.11-bin.tar.lzma">http://sourceforge.net/projects/mingw/files/MSYS/Base/tar/tar-1.22-1/tar-1.22-1-msys-1.0.11-bin.tar.lzma</a>
</span><span class='line'>xz -d tar-1.22-1-msys-1.0.11-bin.tar.lzma
</span><span class='line'>tar xvf tar-1.22-1-msys-1.0.11-bin.tar
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/zip/zip-3.0-1/zip-3.0-1-msys-1.0.14-bin.tar.lzma">http://sourceforge.net/projects/mingw/files/MSYS/Extension/zip/zip-3.0-1/zip-3.0-1-msys-1.0.14-bin.tar.lzma</a>
</span><span class='line'>xz -d zip-3.0-1-msys-1.0.14-bin.tar.lzma
</span><span class='line'>tar xvf zip-3.0-1-msys-1.0.14-bin.tar
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/unzip/unzip-6.0-1/unzip-6.0-1-msys-1.0.13-bin.tar.lzma">http://sourceforge.net/projects/mingw/files/MSYS/Extension/unzip/unzip-6.0-1/unzip-6.0-1-msys-1.0.13-bin.tar.lzma</a>
</span><span class='line'>xz -d unzip-6.0-1-msys-1.0.13-bin.tar.lzma
</span><span class='line'>tar xvf unzip-6.0-1-msys-1.0.13-bin.tar
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/patch/patch-2.5.9-1/patch-2.5.9-1-msys-1.0.11-bin.tar.lzma">http://sourceforge.net/projects/mingw/files/MSYS/Extension/patch/patch-2.5.9-1/patch-2.5.9-1-msys-1.0.11-bin.tar.lzma</a>
</span><span class='line'>xz -d patch-2.5.9-1-msys-1.0.11-bin.tar.lzma
</span><span class='line'>tar xvf patch-2.5.9-1-msys-1.0.11-bin.tar
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/MSYS/Base/gzip/gzip-1.3.12-1/gzip-1.3.12-1-msys-1.0.11-bin.tar.lzma">http://sourceforge.net/projects/mingw/files/MSYS/Base/gzip/gzip-1.3.12-1/gzip-1.3.12-1-msys-1.0.11-bin.tar.lzma</a>
</span><span class='line'>xz -d gzip-1.3.12-1-msys-1.0.11-bin.tar.lzma
</span><span class='line'>tar xvf gzip-1.3.12-1-msys-1.0.11-bin.tar
</span><span class='line'>cp -r -v bin /
</span><span class='line'>cp -r -v share /
</span><span class='line'>cd .. </span></code></pre></td></tr></table></div></figure>
Now we&#39;re ready to install the dependencies for the charlock_holmes Gem&#8230;</p>

<h1 id="toc_3">Build native libraries</h1>

<p>We need some additional libraries for the Ruby Gem charlock_holmes.  I&#39;ve built them both with static linking here so that we don&#39;t need to worry about where the DLLs might have gone.</p>

<p>Download and build ICU (<a href="http://qt-project.org/wiki/Compiling-ICU-with-MinGW" title="Compiling ICU with Mingw">this post on compiling for qt</a> and <a href="http://wiki.openttd.org/Compiling_on_Windows_using_MinGW" title="Compiling for OpenTTD">this post for compiling for OpenTTD</a> both help):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~
</span><span class='line'>mkdir build32
</span><span class='line'>cd ~/build32
</span><span class='line'>wget <a href="http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.zip">http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.zip</a>
</span><span class='line'>unzip icu4c-4_6-src.zip
</span><span class='line'>wget <a href="http://devs.openttd.org/%7Eterkhen/libicu/libicu_4_6_mingw32.diff">http://devs.openttd.org/~terkhen/libicu/libicu_4_6_mingw32.diff</a>
</span><span class='line'>wget <a href="http://devs.openttd.org/%7Eterkhen/libicu/libicu_reduce_icudata_size.diff">http://devs.openttd.org/~terkhen/libicu/libicu_reduce_icudata_size.diff</a>
</span><span class='line'>cd icu
</span><span class='line'>patch -p1 -i ../libicu_4_6_mingw32.diff
</span><span class='line'>patch -p1 -i ../libicu_reduce_icudata_size.diff
</span><span class='line'>cd source
</span><span class='line'>./configure --prefix=/mingw --enable-static --disable-shared --disable-strict --disable-threads
</span><span class='line'>#./configure --prefix=$PWD/../dist --enable-static --disable-shared --disable-strict --disable-threads
</span><span class='line'>make &amp;&amp; make install
</span><span class='line'>cd ../..</span></code></pre></td></tr></table></div></figure></p>

<p>Download and install libgnurx (required for file-5.08, also a dependency of charlock_holmes):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/build32
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/Other/UserContributed/regex/mingw-regex-2.5.1/mingw-libgnurx-2.5.1-src.tar.gz">http://sourceforge.net/projects/mingw/files/Other/UserContributed/regex/mingw-regex-2.5.1/mingw-libgnurx-2.5.1-src.tar.gz</a>
</span><span class='line'>tar zxvf mingw-libgnurx-2.5.1-src.tar.gz
</span><span class='line'>cd mingw-libgnurx-2.5.1</span></code></pre></td></tr></table></div></figure>
Apply the following patch for static build:
(diff -up Makefile.in Makefile.in.new &gt; ../mingw-libgnurx-static.patch)
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- Makefile.in 2007-05-07 20:28:28 +0100
</span><span class='line'>+++ Makefile.in.new     2013-09-23 12:44:15 +0100
</span><span class='line'>@@ -56,7 +56,7 @@ SRCDIST_FILES = ${srcdir}/configure ${sr
</span><span class='line'> ZIPCMD = @ZIPCMD@
</span><span class='line'> ZIPEXT = @ZIPEXT@
</span><span class='line'>
</span><span class='line'>-all: libgnurx-$(DLLVERSION).dll libgnurx.dll.a libregex.a @GNURX_LIB@
</span><span class='line'>+all: libgnurx.a libgnurx-$(DLLVERSION).dll libgnurx.dll.a libregex.a @GNURX_LIB@
</span><span class='line'>
</span><span class='line'> Makefile: config.status Makefile.in
</span><span class='line'>        ./config.status
</span><span class='line'>@@ -69,6 +69,10 @@ $(OBJECTS): Makefile
</span><span class='line'> libgnurx-$(DLLVERSION).dll libgnurx.dll.a: $(OBJECTS)
</span><span class='line'>        $(CC) $(CFLAGS) -shared -o libgnurx-$(DLLVERSION).dll $(LDFLAGS) $(OBJECTS)
</span><span class='line'>
</span><span class='line'>+libgnurx.a: $(OBJECTS)
</span><span class='line'>+       ar rcu $@ $(OBJECTS)
</span><span class='line'>+       ranlib $@
</span><span class='line'>+
</span><span class='line'> libregex.a: libgnurx.dll.a
</span><span class='line'>        cp -p libgnurx.dll.a $@
</span><span class='line'>
</span><span class='line'>@@ -81,6 +85,11 @@ install-dll:
</span><span class='line'>        mkdir -p ${bindir}
</span><span class='line'>        cp -p $(BINDIST_FILES) ${bindir}
</span><span class='line'>
</span><span class='line'>+install-static: libgnurx.a
</span><span class='line'>+       mkdir -p ${includedir} ${libdir}
</span><span class='line'>+       cp -p ${srcdir}/regex.h ${includedir}
</span><span class='line'>+       cp -p ${srcdir}/libgnurx.a ${libdir}
</span><span class='line'>+
</span><span class='line'> install-dev:
</span><span class='line'>        mkdir -p ${includedir} ${libdir}
</span><span class='line'>        cp -p ${srcdir}/regex.h ${includedir}</span></code></pre></td></tr></table></div></figure>
Build and install:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>patch -i ../mingw-libgnurx-static.patch
</span><span class='line'>./configure -prefix=/mingw
</span><span class='line'>make &amp;&amp; make install-static</span></code></pre></td></tr></table></div></figure>
Optional: check that file-5.08 builds (note: <strong>no make install</strong>) without errors:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/build32
</span><span class='line'>wget <a href="ftp://ftp.astron.com/pub/file/file-5.08.tar.gz">ftp://ftp.astron.com/pub/file/file-5.08.tar.gz</a>
</span><span class='line'>tar zxvf file-5.08.tar.gz
</span><span class='line'>cd file-5.08
</span><span class='line'>./configure --prefix=/mingw  --disable-shared --enable-static --with-pic
</span><span class='line'>make</span></code></pre></td></tr></table></div></figure></p>

<h1 id="toc_4">Install Octopress</h1>

<p>Download Octopress (<a href="http://octopress.org/docs/setup/" title="Octopress setup">see also Octopress setup instructions</a>).  The easiest way to do this is to first install Git for Windows.  Start Git Bash, and then (note: this example uses ~/build32 but you can put octopress where you like&#8230;):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /c/Ruby193/devkit/home/[user]/build32/
</span><span class='line'>git clone git://github.com/imathis/octopress.git octopress</span></code></pre></td></tr></table></div></figure></p>

<p>At this stage (back in MingW build environment):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/build32/octopress
</span><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>io-console (0.3)
</span><span class='line'>json (1.5.5)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rdoc (3.9.5)</span></code></pre></td></tr></table></div></figure></p>

<p>Install bundler and the default bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install bundler</span></code></pre></td></tr></table></div></figure>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>bundler (1.3.5)
</span><span class='line'>io-console (0.3)
</span><span class='line'>json (1.5.5)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rdoc (3.9.5)</span></code></pre></td></tr></table></div></figure>
Then install the default bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>bundle install</span></code></pre></td></tr></table></div></figure>
Install the default Octopress theme, create a new test page and generate the site:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rake install
</span><span class='line'>rake new_post[&quot;first post&quot;]
</span><span class='line'>rake generate</span></code></pre></td></tr></table></div></figure>
You should get the site built in octopress/public.  Check that index.html is generated properly (size &gt; 0).</p>

<p>At this point we have the default Octopress installed using rdiscount for markdown generation and we&#39;ve setup the required libraries for redcarpet.  Now we need to install charlock_holmes manually:</p>

<h2 id="toc_5">Install some updates required for github-linguist</h2>

<p>Update the Gemfile to install pygments 0.3.7 - this is required so that we have the updated lexer Augeas (part contents of Gemfile):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem &#39;pygments.rb&#39;, &#39;~&gt; 0.3.7&#39;</span></code></pre></td></tr></table></div></figure>
and update the bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>bundle update pygments.rb
</span><span class='line'>gem install rake-compiler</span></code></pre></td></tr></table></div></figure>
Now it should look something like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bundle list
</span><span class='line'>Gems included by the bundle:
</span><span class='line'>  * RedCloth (4.2.9)
</span><span class='line'>  * bundler (1.3.5)
</span><span class='line'>  * chunky_png (1.2.5)
</span><span class='line'>  * classifier (1.3.3)
</span><span class='line'>  * compass (0.12.2)
</span><span class='line'>  * directory_watcher (1.4.1)
</span><span class='line'>  * fast-stemmer (1.0.1)
</span><span class='line'>  * fssm (0.2.9)
</span><span class='line'>  * haml (3.1.7)
</span><span class='line'>  * jekyll (0.12.0)
</span><span class='line'>  * kramdown (0.13.8)
</span><span class='line'>  * liquid (2.3.0)
</span><span class='line'>  * maruku (0.6.1)
</span><span class='line'>  * posix-spawn (0.3.6)
</span><span class='line'>  * pygments.rb (0.3.7)
</span><span class='line'>  * rack (1.5.2)
</span><span class='line'>  * rack-protection (1.5.0)
</span><span class='line'>  * rake (0.9.2.2)
</span><span class='line'>  * rb-fsevent (0.9.1)
</span><span class='line'>  * rdiscount (2.0.7.3)
</span><span class='line'>  * rubypants (0.2.0)
</span><span class='line'>  * sass (3.2.9)
</span><span class='line'>  * sass-globbing (1.0.0)
</span><span class='line'>  * sinatra (1.4.2)
</span><span class='line'>  * stringex (1.4.0)
</span><span class='line'>  * syntax (1.0.0)
</span><span class='line'>  * tilt (1.3.7)
</span><span class='line'>  * yajl-ruby (1.1.0)</span></code></pre></td></tr></table></div></figure></p>

<p>Create a patch file for pygments.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- popen.rb 2013-09-24 14:41:22 +0100
</span><span class='line'>+++ popen.rb.new  2013-09-24 15:12:42 +0100
</span><span class='line'>@@ -110,7 +110,7 @@
</span><span class='line'>     def lexers
</span><span class='line'>       begin
</span><span class='line'>         lexer<em>file = File.expand_path(&#39;../../../lexers&#39;, __FILE</em>_)
</span><span class='line'>-        raw = File.open(lexer_file, &quot;r&quot;).read
</span><span class='line'>+        raw = File.open(lexer_file, &quot;rb&quot;).read
</span><span class='line'>         Marshal.load(raw)
</span><span class='line'>       rescue Errno::ENOENT
</span><span class='line'>         raise MentosError, &quot;Error loading lexer file. Was it created and vendored?&quot;</span></code></pre></td></tr></table></div></figure></p>

<p>Now apply the patch to popen.rb in pygments.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/local32/lib/ruby/gems/1.9.1/gems/pygments.rb-0.3.7/lib/pygments
</span><span class='line'>patch -u -i ~/build32/pygments.rb.popen.rb.patch
</span><span class='line'>cd ~/build32/octopress</span></code></pre></td></tr></table></div></figure></p>

<h2 id="toc_6">Get and patch charlock_holmes</h2>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkdir ~/build32/tmpgems
</span><span class='line'>cd ~/build32/tmpgems
</span><span class='line'>gem fetch charlock_holmes
</span><span class='line'>gem spec charlock_holmes-0.6.9.4.gem --ruby &gt; charlock_holmes.gemspec
</span><span class='line'>gem unpack charlock_holmes-0.6.9.4.gem
</span><span class='line'>mv -v charlock_holmes.gemspec charlock_holmes-0.6.9.4
</span><span class='line'>cd charlock_holmes-0.6.9.4</span></code></pre></td></tr></table></div></figure>
Now modify ext/charlock_holmes/extconf.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- extconf.rb   2013-09-24 14:49:14 +0100
</span><span class='line'>+++ extconf.rb.new    2013-09-24 14:51:54 +0100
</span><span class='line'>@@ -9,7 +9,7 @@
</span><span class='line'>   ret
</span><span class='line'> end
</span><span class='line'> 
</span><span class='line'>-if `which make`.strip.empty?
</span><span class='line'>+if `sh which make`.strip.empty?
</span><span class='line'>   STDERR.puts "\n\n"
</span><span class='line'>   STDERR.puts "***************************************************************************************"
</span><span class='line'>   STDERR.puts "*************** make required (apt-get install make build-essential) =( ***************"
</span><span class='line'>@@ -37,7 +37,8 @@
</span><span class='line'>   end
</span><span class='line'> end
</span><span class='line'> 
</span><span class='line'>-unless have_library 'icui18n' and have_header 'unicode/ucnv.h'
</span><span class='line'>+#unless have_library 'icui18n' and have_library 'icuuc' and have_library 'regex' and have_header 'unicode/ucnv.h'
</span><span class='line'>+unless have_library 'icudata' and have_library 'icuuc' and have_library 'icui18n' and have_library 'gnurx' and have_header 'unicode/ucnv.h'
</span><span class='line'>   STDERR.puts "\n\n"
</span><span class='line'>   STDERR.puts "***************************************************************************************"
</span><span class='line'>   STDERR.puts "*********** icu required (brew install icu4c or apt-get install libicu-dev) ***********"
</span><span class='line'>@@ -57,7 +58,7 @@
</span><span class='line'> 
</span><span class='line'>   sys("tar zxvf #{src}")
</span><span class='line'>   Dir.chdir(dir) do
</span><span class='line'>-    sys("./configure --prefix=#{CWD}/dst/ --disable-shared --enable-static --with-pic")
</span><span class='line'>+    sys("sh ./configure --prefix=#{CWD}/dst/ --disable-shared --enable-static --with-pic")
</span><span class='line'>     sys("patch -p0 &lt; ../file-soft-check.patch")
</span><span class='line'>     sys("make -C src install")
</span><span class='line'>     sys("make -C magic install")</span></code></pre></td></tr></table></div></figure>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ext/charlock_holmes
</span><span class='line'>patch -u -i /build32/charlock_holmes_extconf.rb.patch
</span><span class='line'>cd ../..
</span><span class='line'>gem build charlock_holmes.gemspec
</span><span class='line'>gem install charlock_holmes-0.6.9.4.gem --platform=ruby</span></code></pre></td></tr></table></div></figure>

<p>We should now have charlock_holmes installed:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>bundler (1.3.5)
</span><span class='line'>charlock_holmes (0.6.9.4)
</span><span class='line'>chunky_png (1.2.5)
</span><span class='line'>classifier (1.3.3)
</span><span class='line'>compass (0.12.2)
</span><span class='line'>directory_watcher (1.4.1)
</span><span class='line'>fast-stemmer (1.0.1)
</span><span class='line'>fssm (0.2.9)
</span><span class='line'>haml (3.1.7)
</span><span class='line'>io-console (0.3)
</span><span class='line'>jekyll (0.12.0)
</span><span class='line'>json (1.5.5)
</span><span class='line'>kramdown (0.13.8)
</span><span class='line'>liquid (2.3.0)
</span><span class='line'>maruku (0.6.1)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>posix-spawn (0.3.6)
</span><span class='line'>pygments.rb (0.3.7, 0.3.4)
</span><span class='line'>rack (1.5.2)
</span><span class='line'>rack-protection (1.5.0)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rake-compiler (0.9.1)
</span><span class='line'>rb-fsevent (0.9.1)
</span><span class='line'>rdiscount (2.0.7.3)
</span><span class='line'>rdoc (3.9.5)
</span><span class='line'>RedCloth (4.2.9 x86-mingw32)
</span><span class='line'>rubypants (0.2.0)
</span><span class='line'>sass (3.2.9)
</span><span class='line'>sass-globbing (1.0.0)
</span><span class='line'>sinatra (1.4.2)
</span><span class='line'>stringex (1.4.0)
</span><span class='line'>syntax (1.0.0)
</span><span class='line'>tilt (1.3.7)
</span><span class='line'>yajl-ruby (1.1.0 x86-mingw32)</span></code></pre></td></tr></table></div></figure></p>

<h2 id="toc_7">Add redcarpet to Octopress</h2>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/build32/octopress</span></code></pre></td></tr></table></div></figure>

<p>Now we can modify the Gemfile to include redcarpet (part contents of Gemfile):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>  gem &#39;rdiscount&#39;, &#39;~&gt; 2.0.7&#39;
</span><span class='line'>  gem &quot;charlock_holmes&quot;, &quot;~&gt; 0.6.9.4&quot;
</span><span class='line'>  gem &quot;github-linguist&quot;, &quot;~&gt; 2.4&quot;
</span><span class='line'>  gem &#39;redcarpet&#39;, &#39;~&gt; 2.1.1&#39;
</span><span class='line'>  gem &#39;pygments.rb&#39;, &#39;~&gt; 0.3.7&#39;</span></code></pre></td></tr></table></div></figure>
And update the Gems:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ~/build32/octopress
</span><span class='line'>bundle install</span></code></pre></td></tr></table></div></figure></p>

<p>Test. Save this code into a file in (for example) /tmp/test.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>require &#39;rdiscount&#39;
</span><span class='line'>require &#39;charlock<em>holmes&#39;
</span><span class='line'>require &#39;escape_utils&#39;
</span><span class='line'>require &#39;pygments&#39;
</span><span class='line'>require &#39;yaml&#39;
</span><span class='line'>require &#39;linguist/classifier&#39;
</span><span class='line'>require &#39;linguist/samples&#39;
</span><span class='line'>require &#39;linguist/file_blob&#39;
</span><span class='line'>require &#39;redcarpet&#39;
</span><span class='line'>
</span><span class='line'>puts &quot;Ruby test&quot;
</span><span class='line'>
</span><span class='line'>#puts Pygments.highlight(File.read(</em><em>FILE</em>_), :lexer =&gt; &#39;ruby&#39;)
</span><span class='line'>
</span><span class='line'>@rdiscount_extensions = &quot;smart&quot;
</span><span class='line'>
</span><span class='line'>content = &quot;Some <em>text</em>&quot;
</span><span class='line'>rd = RDiscount.new(content, <em>@rdiscount_extensions)
</span><span class='line'>html = rd.to_html
</span><span class='line'>
</span><span class='line'>puts html
</span><span class='line'>
</span><span class='line'>detection = CharlockHolmes::EncodingDetector.detect(html)
</span><span class='line'>
</span><span class='line'>puts detection
</span><span class='line'>
</span><span class='line'>fb = Linguist::FileBlob.new(&quot;c:\Ruby193\devkit\dk.rb&quot;)
</span><span class='line'>puts fb.language.name
</span><span class='line'>
</span><span class='line'>markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink =&gt; true, :space_after_headers =&gt; true)
</span><span class='line'>puts markdown.render(&quot;This is *bongos</em> <code>c++ int main() { return 0 }</code>, indeed.&quot;)
</span></code></pre></td></tr></table></div></figure></p>

<p>And run the test:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby test.rb
</span><span class='line'>...
</span><span class='line'>Ruby test
</span><span class='line'>&lt;p&gt;Some &lt;em&gt;text&lt;/em&gt;&lt;/p&gt;
</span><span class='line'>{:type=&gt;:text, :encoding=&gt;&quot;ISO-8859-2&quot;, :confidence=&gt;40, :language=&gt;&quot;cs&quot;}
</span><span class='line'>Ruby
</span><span class='line'>&lt;p&gt;This is &lt;em&gt;bongos&lt;/em&gt; &lt;code&gt;c++ int main() { return 0 }&lt;/code&gt;, indeed.&lt;/p&gt;</span></code></pre></td></tr></table></div></figure> </p>

<p>Now modify _config.yml for octopress to generate redcarpet markdown:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>markdown: redcarpet
</span><span class='line'>redcarpet:
</span><span class='line'>  extensions: [&quot;no_intra_emphasis&quot;, &quot;fenced_code_blocks&quot;, &quot;autolink&quot;, &quot;tables&quot;, &quot;with_toc_data&quot;]</span></code></pre></td></tr></table></div></figure></p>

<p>Modify the &#39;frist post&#39; created above to include some github markdown, e.g. (note: replace last [backtick]&#8230;):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Some text</span></code></pre></td></tr></table></div></figure>c++
int main()
{
  return 0;
}
&#8220;[backtick]</p>

<p>Some more text.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>
</span><span class='line'>And regenerate:</span></code></pre></td></tr></table></div></figure>
rake generate
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>You should now have syntax highlighted code blocks, like this:
</span></code></pre></td></tr></table></div></figure>c++
int main()
{
  return 0;
}
&#8220;`</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing Ruby 1.9.3 in Windows with Redcarpet and Github Markdown]]></title>
    <link href="http://graoil.co.uk/blog/2013/09/27/installing-octopress-in-windows-with-redcarpet/"/>
    <updated>2013-09-27T17:32:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/09/27/installing-octopress-in-windows-with-redcarpet</id>
    <content type="html"><![CDATA[<p>This is the third of three posts describing how to install Ruby 1.9.3 native MingW environment. It&#39;s much simpler to <a href="http://graoil.co.uk/blog/2013/09/30/using-rubyinstaller-to-install-redcarpet-with-octopress-on-windows/">use Ruby Installer to do this</a> but if you want all the details of how to do it natively, read on&#8230;</p>

<p>If you&#39;re wondering why I did this, I wanted to use redcarpet/github-linguist for markdown in Octopress; there&#39;s a dependency on the charlock_holmes Gem that requires native code libraries (file, ICU), some of which it needs to build.  I couldn&#39;t figure out how to make the Ruby Installer do this and I wanted to understand the process, so I did the whole thing from scratch.  The <a href="http://graoil.co.uk/blog/2013/09/24/setting-up-mingw/">first part is here</a> and <a href="http://graoil.co.uk/blog/2013/09/26/installing-ruby-in-windows/">the second part is here</a>.</p>

<p><a href="http://graoil.co.uk/blog/2013/09/26/installing-ruby-in-windows/" title="Installing ruby in Windows">Setup ruby.</a>
In the build location (/build32 if following the instructions)&#8230;</p>

<p>First, install Python 2.7, if you havn&#39;t already - this is required for pygments.rb.  Make sure Python is in your path.  Check in a Mingw window:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>python --version</span></code></pre></td></tr></table></div></figure>

<p>We need some additional libraries for the Ruby Gem charlock_holmes.  I&#39;ve built them both with static linking here so that we don&#39;t need to worry about where the DLLs might have gone.
&lt;!&#8211; more &#8211;&gt;</p>

<p>Download and build ICU (<a href="http://qt-project.org/wiki/Compiling-ICU-with-MinGW" title="Compiling ICU with Mingw">this post on compiling for qt</a> and <a href="http://wiki.openttd.org/Compiling_on_Windows_using_MinGW" title="Compiling for OpenTTD">this post for compiling for OpenTTD</a> both help):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.zip">http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.zip</a>
</span><span class='line'>unzip icu4c-4_6-src.zip
</span><span class='line'>wget <a href="http://devs.openttd.org/%7Eterkhen/libicu/libicu_4_6_mingw32.diff">http://devs.openttd.org/~terkhen/libicu/libicu_4_6_mingw32.diff</a>
</span><span class='line'>wget <a href="http://devs.openttd.org/%7Eterkhen/libicu/libicu_reduce_icudata_size.diff">http://devs.openttd.org/~terkhen/libicu/libicu_reduce_icudata_size.diff</a>
</span><span class='line'>cd icu
</span><span class='line'>patch -p1 -i ../libicu_4_6_mingw32.diff
</span><span class='line'>patch -p1 -i ../libicu_reduce_icudata_size.diff
</span><span class='line'>cd source
</span><span class='line'>./configure --prefix=/mingw --enable-static --disable-shared --disable-strict --disable-threads
</span><span class='line'>#./configure --prefix=$PWD/../dist --enable-static --disable-shared --disable-strict --disable-threads
</span><span class='line'>make &amp;&amp; make install
</span><span class='line'>cd ../..</span></code></pre></td></tr></table></div></figure></p>

<p>Download and install libgnurx (required for file-5.08, also a dependency of charlock_holmes):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://sourceforge.net/projects/mingw/files/Other/UserContributed/regex/mingw-regex-2.5.1/mingw-libgnurx-2.5.1-src.tar.gz">http://sourceforge.net/projects/mingw/files/Other/UserContributed/regex/mingw-regex-2.5.1/mingw-libgnurx-2.5.1-src.tar.gz</a>
</span><span class='line'>tar zxvf mingw-libgnurx-2.5.1-src.tar.gz
</span><span class='line'>cd mingw-libgnurx-2.5.1</span></code></pre></td></tr></table></div></figure>
Apply the following patch for static build:
(diff -up Makefile.in Makefile.in.new &gt; ../mingw-libgnurx-static.patch)
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- Makefile.in 2007-05-07 20:28:28 +0100
</span><span class='line'>+++ Makefile.in.new     2013-09-23 12:44:15 +0100
</span><span class='line'>@@ -56,7 +56,7 @@ SRCDIST_FILES = ${srcdir}/configure ${sr
</span><span class='line'> ZIPCMD = @ZIPCMD@
</span><span class='line'> ZIPEXT = @ZIPEXT@
</span><span class='line'>
</span><span class='line'>-all: libgnurx-$(DLLVERSION).dll libgnurx.dll.a libregex.a @GNURX_LIB@
</span><span class='line'>+all: libgnurx.a libgnurx-$(DLLVERSION).dll libgnurx.dll.a libregex.a @GNURX_LIB@
</span><span class='line'>
</span><span class='line'> Makefile: config.status Makefile.in
</span><span class='line'>        ./config.status
</span><span class='line'>@@ -69,6 +69,10 @@ $(OBJECTS): Makefile
</span><span class='line'> libgnurx-$(DLLVERSION).dll libgnurx.dll.a: $(OBJECTS)
</span><span class='line'>        $(CC) $(CFLAGS) -shared -o libgnurx-$(DLLVERSION).dll $(LDFLAGS) $(OBJECTS)
</span><span class='line'>
</span><span class='line'>+libgnurx.a: $(OBJECTS)
</span><span class='line'>+       ar rcu $@ $(OBJECTS)
</span><span class='line'>+       ranlib $@
</span><span class='line'>+
</span><span class='line'> libregex.a: libgnurx.dll.a
</span><span class='line'>        cp -p libgnurx.dll.a $@
</span><span class='line'>
</span><span class='line'>@@ -81,6 +85,11 @@ install-dll:
</span><span class='line'>        mkdir -p ${bindir}
</span><span class='line'>        cp -p $(BINDIST_FILES) ${bindir}
</span><span class='line'>
</span><span class='line'>+install-static: libgnurx.a
</span><span class='line'>+       mkdir -p ${includedir} ${libdir}
</span><span class='line'>+       cp -p ${srcdir}/regex.h ${includedir}
</span><span class='line'>+       cp -p ${srcdir}/libgnurx.a ${libdir}
</span><span class='line'>+
</span><span class='line'> install-dev:
</span><span class='line'>        mkdir -p ${includedir} ${libdir}
</span><span class='line'>        cp -p ${srcdir}/regex.h ${includedir}</span></code></pre></td></tr></table></div></figure>
Build and install:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>patch &lt; ../mingw-libgnurx-static.patch
</span><span class='line'>./configure -prefix=/mingw
</span><span class='line'>make &amp;&amp; make install-static</span></code></pre></td></tr></table></div></figure>
Optional: check that file-5.08 builds (note: <strong>no make install</strong>) without errors:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="ftp://ftp.astron.com/pub/file/file-5.08.tar.gz">ftp://ftp.astron.com/pub/file/file-5.08.tar.gz</a>
</span><span class='line'>tar zxvf file-5.08.tar.gz
</span><span class='line'>cd file-5.08
</span><span class='line'>./configure --prefix=/mingw  --disable-shared --enable-static --with-pic
</span><span class='line'>make</span></code></pre></td></tr></table></div></figure>
Download Octopress (<a href="http://octopress.org/docs/setup/" title="Octopress setup">see also Octopress setup instructions</a>).  The easiest way to do this is to first install Git for Windows.  Start Git Bash, and then (note: this example uses /build32 but you can put octopress where you like&#8230;):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /c/mingw/build32
</span><span class='line'>git clone git://github.com/imathis/octopress.git octopress</span></code></pre></td></tr></table></div></figure></p>

<p>At this stage (back in MingW build environment):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32/octopress
</span><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>io-console (0.3)
</span><span class='line'>json (1.5.5)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rdoc (3.9.5)</span></code></pre></td></tr></table></div></figure></p>

<p>Install bundler and the default bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install bundler</span></code></pre></td></tr></table></div></figure>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>bundler (1.3.5)
</span><span class='line'>io-console (0.3)
</span><span class='line'>json (1.5.5)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rdoc (3.9.5)</span></code></pre></td></tr></table></div></figure>
Then install the default bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>bundle install</span></code></pre></td></tr></table></div></figure>
Update the Gemfile to install pygments 0.3.7 - this is required so that we have the updated lexer Augeas:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem &#39;pygments.rb&#39;, &#39;~&gt; 0.3.7&#39;</span></code></pre></td></tr></table></div></figure>
and update the bundle:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>bundle update pygments.rb</span></code></pre></td></tr></table></div></figure>
Now it should look like this:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bundle list
</span><span class='line'>Gems included by the bundle:
</span><span class='line'>  * RedCloth (4.2.9)
</span><span class='line'>  * bundler (1.3.5)
</span><span class='line'>  * chunky_png (1.2.5)
</span><span class='line'>  * classifier (1.3.3)
</span><span class='line'>  * compass (0.12.2)
</span><span class='line'>  * directory_watcher (1.4.1)
</span><span class='line'>  * fast-stemmer (1.0.1)
</span><span class='line'>  * fssm (0.2.9)
</span><span class='line'>  * haml (3.1.7)
</span><span class='line'>  * jekyll (0.12.0)
</span><span class='line'>  * kramdown (0.13.8)
</span><span class='line'>  * liquid (2.3.0)
</span><span class='line'>  * maruku (0.6.1)
</span><span class='line'>  * posix-spawn (0.3.6)
</span><span class='line'>  * pygments.rb (0.3.7)
</span><span class='line'>  * rack (1.5.2)
</span><span class='line'>  * rack-protection (1.5.0)
</span><span class='line'>  * rake (0.9.2.2)
</span><span class='line'>  * rb-fsevent (0.9.1)
</span><span class='line'>  * rdiscount (2.0.7.3)
</span><span class='line'>  * rubypants (0.2.0)
</span><span class='line'>  * sass (3.2.9)
</span><span class='line'>  * sass-globbing (1.0.0)
</span><span class='line'>  * sinatra (1.4.2)
</span><span class='line'>  * stringex (1.4.0)
</span><span class='line'>  * syntax (1.0.0)
</span><span class='line'>  * tilt (1.3.7)
</span><span class='line'>  * yajl-ruby (1.1.0)</span></code></pre></td></tr></table></div></figure></p>

<p>Create a patch file for pygments.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- popen.rb 2013-09-24 14:41:22 +0100
</span><span class='line'>+++ popen.rb.new  2013-09-24 15:12:42 +0100
</span><span class='line'>@@ -110,7 +110,7 @@
</span><span class='line'>     def lexers
</span><span class='line'>       begin
</span><span class='line'>         lexer<em>file = File.expand_path(&#39;../../../lexers&#39;, __FILE</em>_)
</span><span class='line'>-        raw = File.open(lexer_file, &quot;r&quot;).read
</span><span class='line'>+        raw = File.open(lexer_file, &quot;rb&quot;).read
</span><span class='line'>         Marshal.load(raw)
</span><span class='line'>       rescue Errno::ENOENT
</span><span class='line'>         raise MentosError, &quot;Error loading lexer file. Was it created and vendored?&quot;</span></code></pre></td></tr></table></div></figure></p>

<p>Now apply the patch to popen.rb in pygments.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /local32/lib/ruby/gems/1.9.1/gems/pygments.rb-0.3.7/lib/pygments
</span><span class='line'>patch -u -i /build32/pygments.rb.popen.rb.patch
</span><span class='line'>cd /build32/octopress</span></code></pre></td></tr></table></div></figure>
Create a file named &#39;rake&#39; in /local32/bin.  This looks like the central section of rake.bat:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#!C:/mingw/local32/bin/ruby
</span><span class='line'>
</span><span class='line'>#--
</span><span class='line'># Copyright (c) 2003, 2004, 2005, 2006, 2007  Jim Weirich
</span><span class='line'>#
</span><span class='line'># Permission is hereby granted, free of charge, to any person obtaining a copy
</span><span class='line'># of this software and associated documentation files (the &quot;Software&quot;), to
</span><span class='line'># deal in the Software without restriction, including without limitation the
</span><span class='line'># rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
</span><span class='line'># sell copies of the Software, and to permit persons to whom the Software is
</span><span class='line'># furnished to do so, subject to the following conditions:
</span><span class='line'>#
</span><span class='line'># The above copyright notice and this permission notice shall be included in
</span><span class='line'># all copies or substantial portions of the Software.
</span><span class='line'>#
</span><span class='line'># THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
</span><span class='line'># IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
</span><span class='line'># FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
</span><span class='line'># AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
</span><span class='line'># LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
</span><span class='line'># FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
</span><span class='line'># IN THE SOFTWARE.
</span><span class='line'>#++
</span><span class='line'>
</span><span class='line'>begin
</span><span class='line'>  require &#39;rubygems&#39;
</span><span class='line'>rescue LoadError
</span><span class='line'>end
</span><span class='line'>
</span><span class='line'>require &#39;rake&#39;
</span><span class='line'>
</span><span class='line'>Rake.application.run
</span><span class='line'><strong>END</strong>
</span></code></pre></td></tr></table></div></figure>
Install the default Octopress theme, create a new test page and generate the site:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rake install
</span><span class='line'>rake new_post[&quot;first post&quot;]
</span><span class='line'>rake generate</span></code></pre></td></tr></table></div></figure>
You should get the site built in octopress/public.  Check that index.html is generated properly (size &gt; 0).</p>

<p>At this point we have the default Octopress installed using rdiscount for markdown generation and we&#39;ve setup the required libraries for redcarpet.  Now we need to install charlock_holmes manually:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install rake-compiler
</span><span class='line'>mkdir /build32/tmp
</span><span class='line'>cd /build32/tmp
</span><span class='line'>gem fetch charlock_holmes
</span><span class='line'>gem spec charlock_holmes-0.6.9.4.gem --ruby &gt; charlock_holmes.gemspec
</span><span class='line'>gem unpack charlock_holmes-0.6.9.4.gem
</span><span class='line'>mv -v charlock_holmes.gemspec charlock_holmes-0.6.9.4
</span><span class='line'>cd charlock_holmes-0.6.9.4</span></code></pre></td></tr></table></div></figure>
Now modify ext/charlock_holmes/extconf.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>--- extconf.rb   2013-09-24 14:49:14 +0100
</span><span class='line'>+++ extconf.rb.new    2013-09-24 14:51:54 +0100
</span><span class='line'>@@ -9,7 +9,7 @@
</span><span class='line'>   ret
</span><span class='line'> end
</span><span class='line'> 
</span><span class='line'>-if `which make`.strip.empty?
</span><span class='line'>+if `sh which make`.strip.empty?
</span><span class='line'>   STDERR.puts "\n\n"
</span><span class='line'>   STDERR.puts "***************************************************************************************"
</span><span class='line'>   STDERR.puts "*************** make required (apt-get install make build-essential) =( ***************"
</span><span class='line'>@@ -37,7 +37,8 @@
</span><span class='line'>   end
</span><span class='line'> end
</span><span class='line'> 
</span><span class='line'>-unless have_library 'icui18n' and have_header 'unicode/ucnv.h'
</span><span class='line'>+#unless have_library 'icui18n' and have_library 'icuuc' and have_library 'regex' and have_header 'unicode/ucnv.h'
</span><span class='line'>+unless have_library 'icudata' and have_library 'icuuc' and have_library 'icui18n' and have_library 'gnurx' and have_header 'unicode/ucnv.h'
</span><span class='line'>   STDERR.puts "\n\n"
</span><span class='line'>   STDERR.puts "***************************************************************************************"
</span><span class='line'>   STDERR.puts "*********** icu required (brew install icu4c or apt-get install libicu-dev) ***********"
</span><span class='line'>@@ -57,7 +58,7 @@
</span><span class='line'> 
</span><span class='line'>   sys("tar zxvf #{src}")
</span><span class='line'>   Dir.chdir(dir) do
</span><span class='line'>-    sys("./configure --prefix=#{CWD}/dst/ --disable-shared --enable-static --with-pic")
</span><span class='line'>+    sys("sh ./configure --prefix=#{CWD}/dst/ --disable-shared --enable-static --with-pic")
</span><span class='line'>     sys("patch -p0 &lt; ../file-soft-check.patch")
</span><span class='line'>     sys("make -C src install")
</span><span class='line'>     sys("make -C magic install")</span></code></pre></td></tr></table></div></figure>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd ext/charlock_holmes
</span><span class='line'>patch -u -i /build32/charlock_holmes_extconf.rb.patch
</span><span class='line'>cd ../..
</span><span class='line'>gem build charlock_holmes.gemspec
</span><span class='line'>gem install charlock_holmes-0.6.9.4.gem --platform=ruby</span></code></pre></td></tr></table></div></figure>

<p>We should now have charlock_holmes installed:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem list
</span><span class='line'>
</span><span class='line'>*** LOCAL GEMS ***
</span><span class='line'>
</span><span class='line'>bigdecimal (1.1.0)
</span><span class='line'>bundler (1.3.5)
</span><span class='line'>charlock_holmes (0.6.9.4)
</span><span class='line'>chunky_png (1.2.5)
</span><span class='line'>classifier (1.3.3)
</span><span class='line'>compass (0.12.2)
</span><span class='line'>directory_watcher (1.4.1)
</span><span class='line'>fast-stemmer (1.0.1)
</span><span class='line'>fssm (0.2.9)
</span><span class='line'>haml (3.1.7)
</span><span class='line'>io-console (0.3)
</span><span class='line'>jekyll (0.12.0)
</span><span class='line'>json (1.5.5)
</span><span class='line'>kramdown (0.13.8)
</span><span class='line'>liquid (2.3.0)
</span><span class='line'>maruku (0.6.1)
</span><span class='line'>minitest (2.5.1)
</span><span class='line'>posix-spawn (0.3.6)
</span><span class='line'>pygments.rb (0.3.7, 0.3.4)
</span><span class='line'>rack (1.5.2)
</span><span class='line'>rack-protection (1.5.0)
</span><span class='line'>rake (0.9.2.2)
</span><span class='line'>rake-compiler (0.9.1)
</span><span class='line'>rb-fsevent (0.9.1)
</span><span class='line'>rdiscount (2.0.7.3)
</span><span class='line'>rdoc (3.9.5)
</span><span class='line'>RedCloth (4.2.9 x86-mingw32)
</span><span class='line'>rubypants (0.2.0)
</span><span class='line'>sass (3.2.9)
</span><span class='line'>sass-globbing (1.0.0)
</span><span class='line'>sinatra (1.4.2)
</span><span class='line'>stringex (1.4.0)
</span><span class='line'>syntax (1.0.0)
</span><span class='line'>tilt (1.3.7)
</span><span class='line'>yajl-ruby (1.1.0 x86-mingw32)
</span><span class='line'>cd /build32/octopress</span></code></pre></td></tr></table></div></figure></p>

<p>Now we can modify the Gemfile to include redcarpet:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>  gem &#39;rdiscount&#39;, &#39;~&gt; 2.0.7&#39;
</span><span class='line'>  gem &quot;charlock_holmes&quot;, &quot;~&gt; 0.6.9.4&quot;
</span><span class='line'>  gem &quot;github-linguist&quot;, &quot;~&gt; 2.4&quot;
</span><span class='line'>  gem &#39;redcarpet&#39;, &#39;~&gt; 2.1.1&#39;
</span><span class='line'>  gem &#39;pygments.rb&#39;, &#39;~&gt; 0.3.7&#39;</span></code></pre></td></tr></table></div></figure>
And update the Gems:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32/octopress
</span><span class='line'>bundle install</span></code></pre></td></tr></table></div></figure></p>

<p>Test. Save this code into a file in (for example) /tmp/test.rb:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>require &#39;rdiscount&#39;
</span><span class='line'>require &#39;charlock<em>holmes&#39;
</span><span class='line'>require &#39;escape_utils&#39;
</span><span class='line'>require &#39;pygments&#39;
</span><span class='line'>require &#39;yaml&#39;
</span><span class='line'>require &#39;linguist/classifier&#39;
</span><span class='line'>require &#39;linguist/samples&#39;
</span><span class='line'>require &#39;linguist/file_blob&#39;
</span><span class='line'>require &#39;redcarpet&#39;
</span><span class='line'>
</span><span class='line'>puts &quot;Ruby test&quot;
</span><span class='line'>
</span><span class='line'>#puts Pygments.highlight(File.read(</em><em>FILE</em>_), :lexer =&gt; &#39;ruby&#39;)
</span><span class='line'>
</span><span class='line'>@rdiscount_extensions = &quot;smart&quot;
</span><span class='line'>
</span><span class='line'>content = &quot;Some <em>text</em>&quot;
</span><span class='line'>rd = RDiscount.new(content, <em>@rdiscount_extensions)
</span><span class='line'>html = rd.to_html
</span><span class='line'>
</span><span class='line'>puts html
</span><span class='line'>
</span><span class='line'>detection = CharlockHolmes::EncodingDetector.detect(html)
</span><span class='line'>
</span><span class='line'>puts detection
</span><span class='line'>
</span><span class='line'>fb = Linguist::FileBlob.new(&quot;c:\Ruby193\devkit\dk.rb&quot;)
</span><span class='line'>puts fb.language.name
</span><span class='line'>
</span><span class='line'>markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink =&gt; true, :space_after_headers =&gt; true)
</span><span class='line'>puts markdown.render(&quot;This is *bongos</em> <code>c++ int main() { return 0 }</code>, indeed.&quot;)
</span></code></pre></td></tr></table></div></figure></p>

<p>And run the test:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby test.rb
</span><span class='line'>...
</span><span class='line'>Ruby test
</span><span class='line'>&lt;p&gt;Some &lt;em&gt;text&lt;/em&gt;&lt;/p&gt;
</span><span class='line'>{:type=&gt;:text, :encoding=&gt;&quot;ISO-8859-2&quot;, :confidence=&gt;40, :language=&gt;&quot;cs&quot;}
</span><span class='line'>Ruby
</span><span class='line'>&lt;p&gt;This is &lt;em&gt;bongos&lt;/em&gt; &lt;code&gt;c++ int main() { return 0 }&lt;/code&gt;, indeed.&lt;/p&gt;</span></code></pre></td></tr></table></div></figure> </p>

<p>Now modify _config.yml for octopress to generate redcarpet markdown:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>markdown: redcarpet
</span><span class='line'>redcarpet:
</span><span class='line'>  extensions: [&quot;no_intra_emphasis&quot;, &quot;fenced_code_blocks&quot;, &quot;autolink&quot;, &quot;tables&quot;, &quot;with_toc_data&quot;]</span></code></pre></td></tr></table></div></figure></p>

<p>Modify the post created above to include some github markdown, e.g. (note: replace last [backtick]&#8230;):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Some text</span></code></pre></td></tr></table></div></figure>c++
int main()
{
  return 0;
}
&#8220;[backtick]</p>

<p>Some more text.
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>
</span><span class='line'>And regenerate:</span></code></pre></td></tr></table></div></figure>
rake generate
&#8220;`
You should now have syntax highlighted code blocks!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing Ruby 1.9.3 in Windows with MingW]]></title>
    <link href="http://graoil.co.uk/blog/2013/09/26/installing-ruby-in-windows/"/>
    <updated>2013-09-26T17:32:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/09/26/installing-ruby-in-windows</id>
    <content type="html"><![CDATA[<p>This is the second of three posts describing how to install Ruby 1.9.3 native MingW environment. It&#39;s much simpler to <a href="http://graoil.co.uk/blog/2013/09/30/using-rubyinstaller-to-install-redcarpet-with-octopress-on-windows/">use Ruby Installer to do this</a> but if you want all the details of how to do it natively, read on&#8230;</p>

<p>If you &#39;re wondering why I did this, I wanted to use redcarpet/github-linguist for markdown in Octopress; there&#39;s a dependency on the charlock_holmes Gem that requires native code libraries (file, ICU), some of which it needs to build.  I couldn&#39;t figure out how to make the Ruby Installer do this and I wanted to understand the process, so I did the whole thing from scratch.  The <a href="http://graoil.co.uk/blog/2013/09/24/setting-up-mingw/">first part is here</a> and <a href="http://graoil.co.uk/blog/2013/09/27/installing-octopress-in-windows-with-redcarpet/">the final part is here</a>.</p>

<p><a href="http://graoil.co.uk/blog/2013/09/24/setting-up-mingw/" title="Mingw base system">Setup Msys base system.</a></p>

<p>Download and build libyaml. Yaml requires a built DLL and needs it to be available so we build that manually (<a href="http://jonforums.github.io/ruby/2012/02/24/hacking-a-gem.html" title="Hacking a Ruby Gem">instructions for hacking a ruby gem very useful knowledge for this</a>). Not sure if the first part to build and install the static libraries is required.  We&#39;re hard coding the target location, but just need to get it to work&#8230;:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz">http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz</a>
</span><span class='line'>tar zxvf yaml-0.1.4.tar.gz
</span><span class='line'>cd yaml-0.1.4
</span><span class='line'>./configure --prefix=/mingw CFLAGS=&quot;-DYAML_DECLARE_STATIC&quot; 
</span><span class='line'>make &amp;&amp; make install
</span><span class='line'>cd src
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT api.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT dumper.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT emitter.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT loader.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT parser.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT reader.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT scanner.c
</span><span class='line'>gcc -c -I../include -I../ -DHAVE_CONFIG_H -DYAML_DECLARE_EXPORT writer.c
</span><span class='line'>gcc -shared -o yaml.dll api.o dumper.o emitter.o loader.o parser.o reader.o scanner.o writer.o -Wl,--out-implib,libyaml.dll.a -Wl,--output-def,libyaml.def
</span><span class='line'>cp yaml.dll /mingw/bin
</span><span class='line'>cp libyaml.def libyaml.dll.a /mingw/lib
</span><span class='line'>cd ..</span></code></pre></td></tr></table></div></figure>
&lt;!&#8211; more &#8211;&gt;
Download and build libffi:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="ftp://sourceware.org/pub/libffi/libffi-3.0.13.tar.gz">ftp://sourceware.org/pub/libffi/libffi-3.0.13.tar.gz</a>
</span><span class='line'>wget <a href="http://www.linuxfromscratch.org/patches/blfs/svn/libffi-3.0.13-includedir-1.patch">http://www.linuxfromscratch.org/patches/blfs/svn/libffi-3.0.13-includedir-1.patch</a>
</span><span class='line'>tar zxvf libffi-3.0.13.tar.gz
</span><span class='line'>cd libffi-3.0.13
</span><span class='line'>patch -Np1 &lt; ../libffi-3.0.13-includedir-1.patch
</span><span class='line'>./configure --prefix=/mingw
</span><span class='line'>make &amp;&amp; make install</span></code></pre></td></tr></table></div></figure>
Download and build gdbm
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="ftp://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz">ftp://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz</a>
</span><span class='line'>tar zxvf gdbm-1.10.tar.gz
</span><span class='line'>wget <a href="https://raw.github.com/luislavena/knapsack-recipes/master/gdbm/1.10/0001-Mingw-port-of-gdbm-1.10.patch">https://raw.github.com/luislavena/knapsack-recipes/master/gdbm/1.10/0001-Mingw-port-of-gdbm-1.10.patch</a> --no-check-certificate
</span><span class='line'>cd gdbm-1.10
</span><span class='line'>patch -p1 &lt; ../0001-Mingw-port-of-gdbm-1.10.patch
</span><span class='line'>./configure --prefix=/mingw --enable-shared
</span><span class='line'>make &amp;&amp; make install</span></code></pre></td></tr></table></div></figure>
Download and build termcap:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz">http://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz</a>
</span><span class='line'>tar zxvf termcap-1.3.1.tar.gz
</span><span class='line'>cd termcap-1.3.1
</span><span class='line'>./configure --prefix=/mingw --enable-static
</span><span class='line'>make &amp;&amp; make install</span></code></pre></td></tr></table></div></figure>
Download and build readline:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="ftp://ftp.cwru.edu/pub/bash/readline-6.2.tar.gz">ftp://ftp.cwru.edu/pub/bash/readline-6.2.tar.gz</a>
</span><span class='line'>tar zxvf readline-6.2.tar.gz
</span><span class='line'>cd readline-6.2</span></code></pre></td></tr></table></div></figure>
Patch rldefs.h and util.c to make params const char<em>.  Patch _rl_strnicmp in util.c so that do{}while has trailing &#39;;&#39;:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>diff -rupN readline-6.2.orig//rldefs.h readline-6.2//rldefs.h
</span><span class='line'>--- readline-6.2.orig//rldefs.h   2009-01-04 19:32:33 +0000
</span><span class='line'>+++ readline-6.2//rldefs.h    2013-09-19 09:38:32 +0100
</span><span class='line'>@@ -79,8 +79,8 @@ extern char *strchr (), *strrchr ();
</span><span class='line'> #define _rl_stricmp strcasecmp
</span><span class='line'> #define _rl_strnicmp strncasecmp
</span><span class='line'> #else
</span><span class='line'>-extern int _rl_stricmp PARAMS((char *, char *));
</span><span class='line'>-extern int _rl_strnicmp PARAMS((char *, char *, int));
</span><span class='line'>+extern int _rl_stricmp PARAMS((const char *, const char *));
</span><span class='line'>+extern int _rl_strnicmp PARAMS((const char *, const char *, int));
</span><span class='line'> #endif
</span><span class='line'> 
</span><span class='line'> #if defined (HAVE_STRPBRK) &amp;&amp; !defined (HAVE_MULTIBYTE)
</span><span class='line'>diff -rupN readline-6.2.orig//util.c readline-6.2//util.c
</span><span class='line'>--- readline-6.2.orig//util.c 2010-05-30 23:36:02 +0100
</span><span class='line'>+++ readline-6.2//util.c  2013-09-19 09:38:57 +0100
</span><span class='line'>@@ -369,10 +369,10 @@ _rl_strpbrk (string1, string2)
</span><span class='line'>    doesn&#39;t matter (strncasecmp). */
</span><span class='line'> int
</span><span class='line'> _rl_strnicmp (string1, string2, count)
</span><span class='line'>-     char *string1, *string2;
</span><span class='line'>+     const char *string1, *string2;
</span><span class='line'>      int count;
</span><span class='line'> {
</span><span class='line'>-  register char *s1, *s2;
</span><span class='line'>+  register const char *s1, *s2;
</span><span class='line'>   int d;
</span><span class='line'> 
</span><span class='line'>   if (count &lt;= 0 || (string1 == string2))
</span><span class='line'>@@ -389,7 +389,7 @@ _rl_strnicmp (string1, string2, count)
</span><span class='line'>         break;
</span><span class='line'>       s2++;
</span><span class='line'>     }
</span><span class='line'>-  while (--count != 0)
</span><span class='line'>+  while (--count != 0);
</span><span class='line'> 
</span><span class='line'>   return (0);
</span><span class='line'> }
</span><span class='line'>@@ -397,9 +397,9 @@ _rl_strnicmp (string1, string2, count)
</span><span class='line'> /</em> strcmp (), but caseless (strcasecmp). <em>/
</span><span class='line'> int
</span><span class='line'> _rl_stricmp (string1, string2)
</span><span class='line'>-     char *string1, *string2;
</span><span class='line'>+     const char *string1, *string2;
</span><span class='line'> {
</span><span class='line'>-  register char *s1, *s2;
</span><span class='line'>+  register const char *s1, *s2;
</span><span class='line'>   int d;
</span><span class='line'> 
</span><span class='line'>   s1 = string1;</span></code></pre></td></tr></table></div></figure>
Build:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>patch -p1 &lt; ../readline-6.2.patch
</span><span class='line'>./configure --prefix=/mingw --enable-static
</span><span class='line'>make &amp;&amp; make install</span></code></pre></td></tr></table></div></figure>
Download and install openssl:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://www.openssl.org/source/openssl-1.0.1e.tar.gz">http://www.openssl.org/source/openssl-1.0.1e.tar.gz</a>
</span><span class='line'>tar zxvf openssl-1.0.1e.tar.gz
</span><span class='line'>cd openssl-1.0.1e
</span><span class='line'>perl Configure mingw no-shared no-asm --prefix=/mingw
</span><span class='line'>make depend
</span><span class='line'>make
</span><span class='line'>make install</span></code></pre></td></tr></table></div></figure>
Download and install ruby (note: dbm, pty and syslog will fail to configure, this is ok on Windows&#8230;no others should fail).  For some reason we need the drive/path to the install location or it doesn&#39;t install any files&#8230;:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz">http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz</a>
</span><span class='line'>tar zxvf ruby-1.9.3-p448.tar.gz
</span><span class='line'>cd ruby-1.9.3-p448
</span><span class='line'>./configure --prefix=C:/mingw/local32 --enable-shared --disable-install-doc
</span><span class='line'>make
</span><span class='line'>make install</span></code></pre></td></tr></table></div></figure>
Test&#8230;should output the version, e.g.:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ruby -v
</span><span class='line'>ruby 1.9.3p448 (2013-06-27 revision 41675) [i386-mingw32]</span></code></pre></td></tr></table></div></figure>
Download and install rubygems:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /build32
</span><span class='line'>wget <a href="http://production.cf.rubygems.org/rubygems/rubygems-2.0.7.tgz">http://production.cf.rubygems.org/rubygems/rubygems-2.0.7.tgz</a>
</span><span class='line'>tar zxvf rubygems-2.0.7.tgz
</span><span class='line'>cd rubygems-2.0.7
</span><span class='line'>ruby setup.rb </span></code></pre></td></tr></table></div></figure>
Test (<a href="http://phosphor-escence.blogspot.co.uk/2011/08/clean-installation-ruby-193-preview1.html" title="Clean installation Ruby 1.9.3">final part of this useful post</a>):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem list omniauth$ -r --all
</span><span class='line'>
</span><span class='line'></em>** REMOTE GEMS ***
</span><span class='line'>
</span><span class='line'>omniauth (1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.3, 1.0.2, 1.0.1, 1.0.0, 0.3.2, 0.3.0, 0.2.6, 0.2.5, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0, 0.1.6, 0.1.5, 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0, 0.0.5, 0.0.4, 0.0.3, 0.0.1)</span></code></pre></td></tr></table></div></figure>
It works!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting up Mingw ready for Ruby 1.9.3 install]]></title>
    <link href="http://graoil.co.uk/blog/2013/09/24/setting-up-mingw/"/>
    <updated>2013-09-24T21:31:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/09/24/setting-up-mingw</id>
    <content type="html"><![CDATA[<p>This is the first of three posts describing how to install Ruby 1.9.3 native MingW environment. It&#39;s much simpler to <a href="http://graoil.co.uk/blog/2013/09/30/using-rubyinstaller-to-install-redcarpet-with-octopress-on-windows/">use Ruby Installer to do this</a> but if you want all the details of how to do it natively, read on&#8230;</p>

<p>If you &#39;re wondering why I did this, I wanted to use redcarpet/github-linguist for markdown in Octopress; there&#39;s a dependency on the charlock_holmes Gem that requires native code libraries (file, ICU), some of which it needs to build.  I couldn&#39;t figure out how to make the Ruby Installer do this and I wanted to understand the process, so I did the whole thing from scratch.  The <a href="http://graoil.co.uk/blog/2013/09/26/installing-ruby-in-windows/">second part is here</a> and <a href="http://graoil.co.uk/blog/2013/09/27/installing-octopress-in-windows-with-redcarpet/">the final part is here</a>.</p>

<p>This is a prerequisite for installing Ruby 1.9.3 in a native Mingw environment on Windows.</p>

<p>Download and run mingw installer: mingw-get-setup.exe
Select &#39;mingw-developer-toolkit&#39; and apply changes. This installs a default msys and default packages.
Start msys.bat (usually in C:\MinGW\msys\1.0).</p>

<p>Edit /etc/fstab to add:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>c:/mingw        /mingw
</span><span class='line'>c:/mingw/local32        /local32
</span><span class='line'>c:/mingw/build32        /build32</span></code></pre></td></tr></table></div></figure>
&lt;!&#8211; more &#8211;&gt;
Create a directory for app install and a build directory (similar to <a href="http://ingar.satgnu.net/devenv/mingw32/base.html" title="instructions for installing a base system">instructions for installing a base system</a>)
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkdir /usr/local
</span><span class='line'>mkdir /usr/local/bin
</span><span class='line'>mkdir /c/mingw/opt
</span><span class='line'>mkdir /c/mingw/build32 /c/mingw/local32
</span><span class='line'>mkdir /c/mingw/opt/bin /local32/{bin,etc,include,lib,share}
</span><span class='line'>mkdir /local32/lib/pkgconfig</span></code></pre></td></tr></table></div></figure>
Create a profile:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cat &gt; /local32/etc/profile.local &lt;&lt; &quot;EOF&quot;
</span><span class='line'>#
</span><span class='line'># /local32/etc/profile.local
</span><span class='line'>#
</span><span class='line'>
</span><span class='line'>alias dir=&#39;ls -la --color=auto&#39;
</span><span class='line'>alias ls=&#39;ls --color=auto&#39;
</span><span class='line'>
</span><span class='line'>PKG_CONFIG_PATH=&quot;/local32/lib/pkgconfig&quot;
</span><span class='line'>CPPFLAGS=&quot;-I/local32/include&quot;
</span><span class='line'>CFLAGS=&quot;-I/local32/include&quot;
</span><span class='line'>CXXFLAGS=&quot;-I/local32/include&quot;
</span><span class='line'>LDFLAGS=&quot;-L/local32/lib&quot;
</span><span class='line'>export PKG_CONFIG_PATH CPPFLAGS CFLAGS CXXFLAGS LDFLAGS
</span><span class='line'>
</span><span class='line'>PATH=&quot;/local32/bin:$PATH&quot;
</span><span class='line'>
</span><span class='line'># package build directory
</span><span class='line'>LOCALBUILDDIR=/build32
</span><span class='line'># package installation prefix
</span><span class='line'>LOCALDESTDIR=/local32
</span><span class='line'>export LOCALBUILDDIR LOCALDESTDIR
</span><span class='line'>
</span><span class='line'>EOF</span></code></pre></td></tr></table></div></figure>
and a user profile to load it:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cat &gt;&gt; /etc/profile &lt;&lt; &quot;EOF&quot;
</span><span class='line'>if [ -f /local32/etc/profile.local ]; then
</span><span class='line'>        source /local32/etc/profile.local
</span><span class='line'>fi
</span><span class='line'>
</span><span class='line'>EOF</span></code></pre></td></tr></table></div></figure>
Remove unwanted automake&#39;s (<a href="http://puredata.info/docs/developer/WindowsMinGW" title="Mingw install instructions">following these Mingw install instructions</a>):
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mingw-get remove automake1.4 automake1.5 automake1.6 automake1.7 automake1.8</span></code></pre></td></tr></table></div></figure>
&#39;exit&#39; from all msys shells and restart.  You should see the following mounts:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ mount
</span><span class='line'>...
</span><span class='line'>c:\mingw\build32 on /build32 type user (binmode)
</span><span class='line'>c:\mingw\local32 on /local32 type user (binmode)
</span><span class='line'>c:\mingw on /mingw type user (binmode)
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>
Add some additional packages:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mingw-get install base bzip2 expat gcc-g++ gettext gmp libarchive libpdcurses libpopt libunistring lua mingw-utils mpc mpfr pdcurses pkginfo pthreads-w32 zlib
</span><span class='line'>
</span><span class='line'>mingw-get install msys-bash msys-bison msys-core-dev msys-crypt msys-cygutils msys-inetutils msys-unzip msys-wget msys-zip  </span></code></pre></td></tr></table></div></figure>
(optional) Run the mingw installer and mark mingw-tcl and mingw-tk for installation and apply changes.
Check they are there:
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /mingw
</span><span class='line'>find . -name &quot;tk.h&quot;</span></code></pre></td></tr></table></div></figure></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Time for a blog]]></title>
    <link href="http://graoil.co.uk/blog/2013/09/24/time-for-a-blog/"/>
    <updated>2013-09-24T07:45:00+01:00</updated>
    <id>http://graoil.co.uk/blog/2013/09/24/time-for-a-blog</id>
    <content type="html"><![CDATA[<p>For some time now I&#39;ve been planning to write a blog; I&#39;d seen <a href="http://mattgemmell.com/2011/09/12/blogging-with-octopress/" title="Matt Gemmell: Blogging with Octopress">Matt Gemmell&#39;s &quot;Blogging with Octopress&quot;</a> and <a href="http://mattgemmell.com/2013/05/10/a-new-site-design/" title="New site design">his new site design</a>. As a geeky software developer, that looked like just what I wanted. The only problem was getting it installed and setup just how I wanted it; I don&#39;t yet have a Mac and I&#39;d tried various Linux flavours without much success.</p>

<p>So I decided to try running it on Windows, and that led to a whole host of learning experiences involving Ruby, Windows and Native Gems that I&#39;ll blog about later&#8230;</p>

<p>Like Matt, I decided to <a href="http://mattgemmell.com/2011/11/29/comments-off/" title="comments off">turn off comments</a>.  You can contact me <a href="http://twitter.com/colonelsammy" title="ColonelSammy @ twitter">on twitter @ColonelSammy</a> or by email (mnoyes @ this domain).</p>

<p>This should come out right:
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#include &lt;iostream&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Hellow world&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></p>

<p><a href="http://www.graoil.co.uk/downloads/MatthewDOE.zip" title="for download">Matthews DOE projects</a></p>

<p>Now to go and write something more interesting&#8230;</p>
]]></content>
  </entry>
  
</feed>
