[prev in list] [next in list] [prev in thread] [next in thread] 

List:       extremeprogramming
Subject:    [XP] Re: Build systems for Unit Testing
From:       David Carlton <carlton () bactrian ! org>
Date:       2008-01-29 3:43:32
Message-ID: 8763xd1el7.fsf () bactrian ! org
[Download RAW message or body]

On Tue, 29 Jan 2008 11:23:49 +1300 (NZDT), John Carter <john.carter@tait.co.nz> said:

> Turns out it has been a small sacrifice that enables extracting the
> dependency 'net on _every_ build. ie. You never have to remember to
> "make depend" and you can get the dependency 'net exactly right (apart
> from that small simplification) every build. (I _know_ from experience
> that has saved me countless, "John your dependency tracking is wrong"
> groundless complaints.

Yeah, separate 'make depend' steps are bad.

> Then I use the exact same dependency tracking magic to go from a list
> of defined and undefined symbols in the object files (generated by the
> gcc/binutils "nm --extern" program) to a minimal list of object files
> to feed to the linker to create an executable.

> If the dependency net changes, no problem, it's all autogenerated.

> Furthermore I can tweak that depending on whether I'm building a
> unit test (present appropriate mocks to linker) or the real thing
> (guarantee no test code ever)

> Additional very nice things is I can catch and block bad practices (as
> agreed on by the team) like cyclic dependencies in #include 'nets,
> debug logging symbols in release builds, architectural layer smashing,
> etc. etc. (I also provide (noisy) back doors on these blocks to allow
> quick hack spike activity)

Interesting, that's really cool!  I'll have to keep that in my bag of
tricks for the future.

(Random trivia for build geeks: if you don't want to do dependencies
every time, there's one correct time to do it: if you generate your
dependencies exactly when you compile the file, then you'll always
have your dependencies up to date without doing any more work than
necessary.  That might work with some of your other suggestions, but
probably not all of them.)

David Carlton
carlton@bactrian.org

[Attachment #3 (text/html)]

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" \
"http://www.w3.org/TR/html4/strict.dtd"> <html>
<head>
</head>




<body style="background-color: #ffffff;">

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="width:655px; position:relative;">
  <div id="ygrp-msg" style="width: 490px; padding: 0 15px 0 0; float:left;  \
z-index:1;"> <!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text">
            <p>On Tue, 29 Jan 2008 11:23:49 &#43;1300 (NZDT), John Carter &lt;<a \
href="mailto:john.carter%40tait.co.nz">john.carter@<wbr>tait.co.nz</a>&gt; said:<br> \
<br> &gt; Turns out it has been a small sacrifice that enables extracting the<br>
&gt; dependency 'net on _every_ build. ie. You never have to remember to<br>
&gt; &quot;make depend&quot; and you can get the dependency 'net exactly right \
(apart<br> &gt; from that small simplification) every build. (I _know_ from \
experience<br> &gt; that has saved me countless, &quot;John your dependency tracking \
is wrong&quot;<br> &gt; groundless complaints.<br>
<br>
Yeah, separate 'make depend' steps are bad.<br>
<br>
&gt; Then I use the exact same dependency tracking magic to go from a list<br>
&gt; of defined and undefined symbols in the object files (generated by the<br>
&gt; gcc/binutils &quot;nm --extern&quot; program) to a minimal list of object \
files<br> &gt; to feed to the linker to create an executable.<br>
<br>
&gt; If the dependency net changes, no problem, it's all autogenerated.<br>
<br>
&gt; Furthermore I can tweak that depending on whether I'm building a<br>
&gt; unit test (present appropriate mocks to linker) or the real thing<br>
&gt; (guarantee no test code ever)<br>
<br>
&gt; Additional very nice things is I can catch and block bad practices (as<br>
&gt; agreed on by the team) like cyclic dependencies in #include 'nets,<br>
&gt; debug logging symbols in release builds, architectural layer smashing,<br>
&gt; etc. etc. (I also provide (noisy) back doors on these blocks to allow<br>
&gt; quick hack spike activity)<br>
<br>
Interesting, that's really cool!  I'll have to keep that in my bag of<br>
tricks for the future.<br>
<br>
(Random trivia for build geeks: if you don't want to do dependencies<br>
every time, there's one correct time to do it: if you generate your<br>
dependencies exactly when you compile the file, then you'll always<br>
have your dependencies up to date without doing any more work than<br>
necessary.  That might work with some of your other suggestions, but<br>
probably not all of them.)<br>
<br>
David Carlton<br>
<a href="mailto:carlton%40bactrian.org">carlton@bactrian.<wbr>org</a><br>
</p>
    </div>  

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <span width="1" style="color: white;">__._,_.___</span>
    <!-- Start the section with Message In topic -->
    <div id="ygrp-actbar">
              <span class="left">
          <a href="http://groups.yahoo.com/group/extremeprogramming/message/138379;_yl \
c=X3oDMTM4amx2aXRwBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BG1zZ0lkAzEzODQzNARzZWMDZnRyBHNsawN2dHBjBHN0aW1lAzEyMDE1NzgyMTkEdHBjSWQDMTM4Mzc5">
                
            Messages in this topic          </a> (<span class="bld">14</span>)
        </span>
        <a href="http://groups.yahoo.com/group/extremeprogramming/post;_ylc=X3oDMTJyYX \
U2NW8wBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BG1zZ0lkAzEzODQzNARzZWMDZnRyBHNsawNycGx5BHN0aW1lAzEyMDE1NzgyMTk-?act=reply&messageNum=138434">
  <span class="bld">
            Reply          </span> (via web post)
        </a>  | 
        <a href="http://groups.yahoo.com/group/extremeprogramming/post;_ylc=X3oDMTJlZj \
NxY2NoBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTIwMTU3ODIxOQ--" \
class="bld">  Start a new topic        </a>
          </div> 
    <!-------     Start Nav Bar  ------>
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-vitnav">
                <a href="http://groups.yahoo.com/group/extremeprogramming/messages;_yl \
c=X3oDMTJlaTRpM2pjBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA21zZ3MEc3RpbWUDMTIwMTU3ODIxOQ--">Messages</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/files;_ylc=X3oDMTJmaX \
FndHE3BF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA2ZpbGVzBHN0aW1lAzEyMDE1NzgyMTk-">Files</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/photos;_ylc=X3oDMTJlO \
GJpcThrBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA3Bob3QEc3RpbWUDMTIwMTU3ODIxOQ--">Photos</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/links;_ylc=X3oDMTJmYm \
8xOGx2BF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA2xpbmtzBHN0aW1lAzEyMDE1NzgyMTk-">Links</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/database;_ylc=X3oDMTJ \
jNGlicmZqBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA2RiBHN0aW1lAzEyMDE1NzgyMTk-">Database</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/polls;_ylc=X3oDMTJmNn \
VqMmo1BF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA3BvbGxzBHN0aW1lAzEyMDE1NzgyMTk-">Polls</a> \
  |    <a href="http://groups.yahoo.com/group/extremeprogramming/members;_ylc=X3oDMTJl \
MWRvdTNnBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA21icnMEc3RpbWUDMTIwMTU3ODIxOQ--">Members</a> \
  
    </div>  
    <!-- |**|end egp html banner|**| -->

                <div id="ygrp-grft">
                  
<!-- |**|begin egp html banner|**| -->

          To Post a message, send it to:&nbsp;&nbsp; \
extremeprogramming@eGroups.com<BR> <BR>
To Unsubscribe, send a blank message to: \
extremeprogramming-unsubscribe@eGroups.com<BR> <BR>
ad-free courtesy of objectmentor.com          
<!-- |**|end egp html banner|**| -->

              </div>
    
    <!-- yahoo logo -->
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-ft">
      <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkM2JlaXY1BF9TAzk3MzU5NzE0BGdycElkA \
                zE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjAxNTc4MjE5">
                
      <img src="http://us.i1.yimg.com/us.yimg.com/i/yg/img/logo/ma_grp_160.gif" \
height="15" width="106" border="0" alt="Yahoo! Groups"></a> <br>  <a \
href="http://groups.yahoo.com/group/extremeprogramming/join;_ylc=X3oDMTJmMWZ0aDZuBF9TA \
zk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA3N0bmdzBHN0aW1lAzEyMDE1NzgyMTk-">Change \
settings via the Web</a> (Yahoo! ID required) <br>  Change settings via email: <a \
href="mailto:extremeprogramming-digest@yahoogroups.com?subject=Email Delivery: \
Digest">Switch delivery to Daily Digest</a> | <a href = \
"mailto:extremeprogramming-traditional@yahoogroups.com?subject=Change Delivery \
Format: Traditional">Switch format to Traditional</a> <br>

      <a href="http://groups.yahoo.com/group/extremeprogramming;_ylc=X3oDMTJkYXJtYW10B \
F9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwNmdHIEc2xrA2hwZgRzdGltZQMxMjAxNTc4MjE5">
  Visit Your Group 
      </a> |
      <a href="http://docs.yahoo.com/info/terms/">
        Yahoo! Groups Terms of Use      </a> |
      <a href="mailto:extremeprogramming-unsubscribe@yahoogroups.com?subject=">
        Unsubscribe      </a> 
    </div>     <!-- |**|end egp html banner|**| -->
  </div> <!-- ygrp-msg -->

  
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:140px;float: left; clear: none; margin-left: \
5px; background:white; margin-bottom:25px ;position:absolute; top:0; right: 0;">  \
<!-- Network content -->  
    <!-- Start vitality -->
    <div id="ygrp-vital">
              <div id="vithd">Recent Activity</div>
        <ul style="list-style-type:none; padding: 0; margin: 2px 0;">
                <li style="clear: both;">
      <div class="ct" style="float: right;"><span \
style="display:none">&nbsp;</span>26</div>  <div class="cat"><a \
href="http://groups.yahoo.com/group/extremeprogramming/members;_ylc=X3oDMTJmcWxrYWlwBF \
9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEyMDE1NzgyMTk-">New \
Members</a></div>  </li>
  
            
            
            
            
            
        </ul>
            <a href="http://groups.yahoo.com/group/extremeprogramming;_ylc=X3oDMTJlZXY \
waGZoBF9TAzk3MzU5NzE0BGdycElkAzE1MDU0MDkEZ3Jwc3BJZAMxNzA3Mjc2NzE4BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTIwMTU3ODIxOQ--">
  Visit Your Group      </a>
    </div> 
              
    <!-- Network content -->
              <div id="nc">
              <div class="ad">
                      <div id="hd1">Yahoo! Finance</div> 
<p><a href="http://us.ard.yahoo.com/SIG=13oslnvvh/M=493064.12016257.12445664.8674578/D \
=groups/S=1707276718:NC/Y=YAHOO/EXP=1201585419/L=/B=o9TtAEJe5tU-/J=1201578219568901/A= \
4507179/R=0/SIG=12de4rskk/*http://us.rd.yahoo.com/evt=50284/*http://finance.yahoo.com/personal-finance">It's \
Now Personal</a></p>  <p>Guides, news,</p> 
<p>advice & more.</p>                   </div>
                    <div class="ad">
                      <div id="hd1">Ads on Yahoo!</div> 
<p><a href="http://us.ard.yahoo.com/SIG=13ohpfmmc/M=493064.12016308.12445700.8674578/D \
=groups/S=1707276718:NC/Y=YAHOO/EXP=1201585419/L=/B=pNTtAEJe5tU-/J=1201578219568901/A= \
3848643/R=0/SIG=131q47hek/*http://searchmarketing.yahoo.com/arp/srchv2.php?o=US2005&cmp=Yahoo&ctv=Groups4&s=Y&s2=&s3=&b=50">Learn \
more now.</a></p>  <p>Reach customers</p> 
<p>searching for you.</p>                  </div>
                    <div class="ad">
                      <div id="hd1">Parenting Zone</div> 
<p><a href="http://us.ard.yahoo.com/SIG=13o8nijik/M=493064.12016283.12445687.8674578/D \
=groups/S=1707276718:NC/Y=YAHOO/EXP=1201585419/L=/B=pdTtAEJe5tU-/J=1201578219568901/A=5045820/R=0/SIG=11gsqr691/*http://advision.webevents.yahoo.com/parenting/">on \
Yahoo! Groups</a></p>  <p>Your one stop for</p> 
<p>parenting groups.</p>                  </div>
          </div>
    
  </div>   <!-- |**|end egp html banner|**| -->
  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>   <img src="http://geo.yahoo.com/serv?s=97359714/grpId=1505409/grpspId=1707276718/msgId=138434/stime=1201578219/nc1=4507179/nc2=3848643/nc3=5045820" \
width="1" height="1"> <br>

<span  style="color: white;">__,_._,___</span>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</body>
<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
<style type="text/css">
<!--
#ygrp-mkp{
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 14px 0px;
  padding: 0px 14px;
}
#ygrp-mkp hr{
  border: 1px solid #d8d8d8;
}
#ygrp-mkp #hd{
  color: #628c2a;
  font-size: 85%;
  font-weight: bold;
  line-height: 122%;
  margin: 10px 0px;
}
#ygrp-mkp #ads{
  margin-bottom: 10px;
}
#ygrp-mkp .ad{
  padding: 0 0;
}
#ygrp-mkp .ad a{
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
<head>
<style type="text/css">
<!--
#ygrp-sponsor #ygrp-lc{
  font-family: Arial;
}
#ygrp-sponsor #ygrp-lc #hd{
  margin: 10px 0px;
  font-weight: bold;
  font-size: 78%;
  line-height: 122%;
}
#ygrp-sponsor #ygrp-lc .ad{
  margin-bottom: 10px;
  padding: 0 0;
}
-->
</style>
</head>
<head>
<style type="text/css">
<!--
#ygrp-mlmsg {font-size:13px; font-family: \
arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;} #ygrp-mlmsg table \
{font-size:inherit;font:100%;} #ygrp-mlmsg select, input, textarea {font:99% \
arial,helvetica,clean,sans-serif;} #ygrp-mlmsg pre, code {font:115% \
monospace;*font-size:100%;} #ygrp-mlmsg * {line-height:1.22em;}
#ygrp-text{
    font-family: Georgia;	
}
#ygrp-text p{
    margin: 0 0 1em 0;
}
#ygrp-tpmsgs{
    font-family: Arial;	
    clear: both;
}
#ygrp-vitnav{
	padding-top: 10px;
	font-family: Verdana;
	font-size: 77%;
	margin: 0;
}
#ygrp-vitnav a{
	padding: 0 1px;
}
#ygrp-actbar{
	clear: both;
	margin: 25px 0;
	white-space:nowrap;
	color: #666;
	text-align: right;
}
#ygrp-actbar .left{
	float: left;
	white-space:nowrap;
}
.bld{font-weight:bold;}
#ygrp-grft{
	font-family: Verdana;
	font-size: 77%;
	padding: 15px 0;
}
#ygrp-ft{
  font-family: verdana;
  font-size: 77%;
  border-top: 1px solid #666; 
  padding: 5px 0; 
}
#ygrp-mlmsg #logo{
  padding-bottom: 10px;
}

#ygrp-vital{
	background-color: #e0ecee;
	margin-bottom: 20px;
	padding: 2px 0 8px 8px;
}
#ygrp-vital #vithd{
	font-size: 77%;
	font-family: Verdana;
	font-weight: bold;
	color: #333;
	text-transform: uppercase;
}
#ygrp-vital ul{
	padding: 0;
	margin: 2px 0;
}
#ygrp-vital ul li{
  list-style-type: none;
  clear: both;
  border: 1px solid #e0ecee;  
}
#ygrp-vital ul li .ct{
  font-weight: bold;
  color: #ff7900;
  float: right;
  width: 2em;
  text-align:right;
  padding-right: .5em;
}
#ygrp-vital ul li .cat{
  font-weight: bold;
}
#ygrp-vital a{
	text-decoration: none;
}

#ygrp-vital a:hover{
  text-decoration: underline;
}

#ygrp-sponsor #hd{
	color: #999;
	font-size: 77%;
}
#ygrp-sponsor #ov{
	padding: 6px 13px;
	background-color: #e0ecee;
	margin-bottom: 20px;
}
#ygrp-sponsor #ov ul{
	padding: 0 0 0 8px;
	margin: 0;
}
#ygrp-sponsor #ov li{
	list-style-type: square;
	padding: 6px 0;
	font-size: 77%;
}
#ygrp-sponsor #ov li a{
	text-decoration: none;
	font-size: 130%;
}
#ygrp-sponsor #nc{
  background-color: #eee;
  margin-bottom: 20px;
  padding: 0 8px;
}
#ygrp-sponsor .ad{
	padding: 8px 0;
}
#ygrp-sponsor .ad #hd1{
	font-family: Arial;
	font-weight: bold;
	color: #628c2a;
	font-size: 100%;
	line-height: 122%;
}
#ygrp-sponsor .ad a{
	text-decoration: none;
}
#ygrp-sponsor .ad a:hover{
	text-decoration: underline;
}
#ygrp-sponsor .ad p{
	margin: 0;
}
o{font-size: 0; }
.MsoNormal{
   margin: 0 0 0 0;
}
#ygrp-text tt{
  font-size: 120%;
}
blockquote{margin: 0 0 0 4px;}
.replbq{margin:4}
-->
</style>
</head>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</html><!--End group email -->



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic