<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Hi all</p>
<p><br>
</p>
<p>I've worked out how to do it and learnt some things along the way which I'll document for future travelers. The -compile module attribute is the correct place for per file compile options, however not for any custom values you want to supply. Unlike other
 module attributes, a<span style="font-size: 12pt;">ny values </span><span style="font-size: 12pt;">that are </span><span style="font-size: 12pt;">p</span><span style="font-size: 12pt;">assed via -compile don't end up in the AST which was a surprise to me.</span></p>
<p><br>
</p>
<p>E.g. my example</p>
<p></p>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
-compile([</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
  {parse_transform, lager_transform},</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
  {<span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">lager_parse_transform_functions</span>, [</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
    {metadata_value, {module_name, function_name}}</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
  ]}</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
]).</div>
<p></p>
<p><br>
</p>
<p>Got turned into:</p>
<p>{attribute,3,compile,[]),<br>
<br>
If you use :module_info() on a module in which you've included the -compile options it also doesn't include the values. I'll assume that the options passed to parse_transform/2 come from the same source as the compile values in :module_info().</p>
<br>
To apply these transforms per file I've set my own module attribute and as we're walking the AST merge the values into any globally supplied values as long as I set it before I start transforming the logging lines themselves.
<div><br>
</div>
<div>E.g</div>
<div>-lager_parse_transform_functions([</div>
<div>  <span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">{metadata_value,
 {module_name, function_name}}</span></div>
<div>]).</div>
<div><br>
</div>
<div>Now everything works as expected and the tests pass!</div>
<div><br>
</div>
<div>Michael</div>
<div><br>
<div style="color: rgb(0, 0, 0);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> erlang-questions-bounces@erlang.org <erlang-questions-bounces@erlang.org> on behalf of Michael Kokich <mkokich@wetafx.co.nz><br>
<b>Sent:</b> Thursday, 23 February 2017 9:05 a.m.<br>
<b>To:</b> erlang-questions@erlang.org<br>
<b>Subject:</b> [erlang-questions] Question about per file compile options</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Arial,Helvetica,sans-serif,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<p></p>
<div>Hi everyone</div>
<div><br>
</div>
<div>I'm hitting up against against how Erlang passes compile options to parse_transform and was wanting some guidance.</div>
<div><br>
</div>
<div>I'm making changes to lager's parse_tranform and I'm making eunit tests to check these changes. The changes involve setting compile options to add extra metadata to logging calls, such as the example below.</div>
<div><br>
{erl_opts, [</div>
<div>  {parse_transform, lager_transform},</div>
<div>  {lager_function_transforms, [</div>
<div>    {metadata_value, {module_name, function_name}}</div>
<div>  ]}</div>
<div>]}.<br>
<br>
</div>
<div>One of these tests involves calls to a undefined Module:Function and I need to apply the transform only to the specific test file since this will break all the other tests.</div>
<div><br>
If I set lager_function_transforms in lager's rebar.config eunit_compile_opts it applies the transforms to all  the tests with -compile([{parse_transform, lager_transform}]). If I supply these options to the -compile, they don't appear in the options provided
 to the parse_transform.</div>
<div><br>
-compile([</div>
<div>  {parse_transform, lager_transform}, % If you don't supply this to the test file it won't transformed</div>
<div>  {lager_function_transforms, [ % But these options seem to be ignored</div>
<div>    {metadata_value, {module_name, function_name}}</div>
<div>  ]}</div>
<div>]).</div>
<div><br>
</div>
<div>Is there a way a to compile these new tests with my specific settings without applying them globally, or having to compile them separately?</div>
<div><br>
</div>
<div>Thank you</div>
<div>Michael</div>
<p></p>
<p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>