<html>#41: When an external library is rebuilt, its dependencies should also be rebuilt
<table style='border-spacing: 1ex 0pt; '>
<tr><td style='text-align:right'> Reporter:</td><td>Erik Schnetter</td></tr>
<tr><td style='text-align:right'>   Status:</td><td>open</td></tr>
<tr><td style='text-align:right'>Milestone:</td><td></td></tr>
<tr><td style='text-align:right'>  Version:</td><td></td></tr>
<tr><td style='text-align:right'>     Type:</td><td>bug</td></tr>
<tr><td style='text-align:right'> Priority:</td><td>minor</td></tr>
<tr><td style='text-align:right'>Component:</td><td>Cactus</td></tr>
</table>

<p>Comment (by Roland Haas):</p>
<p>Not so easy after all. It seems as if gfortran ends up in a chicken and egg situation where in order to generate the dependency file for a F90 file which uses modules, those very modules need to already exist: <a data-is-external-link="true" href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49149" rel="nofollow">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49149</a> . The gfortran devs do not seem to consider this a bug. The workaround mentioned in that ticket is some clever use of makefile targets that has make try and generate the dependency files again and again until it eventually succeeds. This makefiles (which generates its own sources) demonstrates the method:</p>
<p>‌</p>
<div class="codehilite language-plaintext"><pre><span></span><span class="nv">SOURCES</span> <span class="o">:=</span> foo.f90 bar.f90 baz.f90

<span class="nf">.PHONY</span><span class="o">:</span> <span class="n">all</span> <span class="n">clean</span>

<span class="nf">all</span><span class="o">:</span> <span class="k">$(</span><span class="nv">patsubst</span> %.<span class="nv">f</span>90,%.<span class="nv">o</span>,<span class="k">$(</span><span class="nv">SOURCES</span><span class="k">))</span>

<span class="nf">clean</span><span class="o">:</span>
    rm -f *.mod *.o *.d *.f90

<span class="nf">%.d</span><span class="o">:</span> %.<span class="n">f</span>90
    gfortran -cpp -M -MF <span class="nv">$@</span> $&lt;

<span class="nf">%.o</span><span class="o">:</span> %.<span class="n">f</span>90 %.<span class="n">d</span>
    gfortran -c $&lt;

<span class="c"># include any gnerated dependency files, don&#39;t worry about ones you did not</span>
<span class="c"># find yet</span>
<span class="cp">ifneq ($(MAKECMDGOALS),clean)</span>
<span class="cp">-include $(patsubst %.f90,%.d,$(SOURCES))</span>
<span class="cp">endif</span>

<span class="c"># demo files:</span>
<span class="cp">define FOO_F90</span>
<span class="err">subroutine</span> <span class="err">foosub</span>
  <span class="err">use</span> <span class="err">baz</span>

<p>--<br/>
Ticket URL: <a href='https://bitbucket.org/einsteintoolkit/tickets/issues/41/when-an-external-library-is-rebuilt-its'>https://bitbucket.org/einsteintoolkit/tickets/issues/41/when-an-external-library-is-rebuilt-its</a></p>
</html>