problem:
rebar(엄밀히 말하면 rebar2)에서 rebar3로 업그레이드를 진행중인데, sqerl에서 아래와 같은 오류가 났다.
===> Compiling project
===> Compiling path/to/file.erl failed
path/to/file.erl:none: error in parse transform 'sqerl_gobot': {function_clause,
[{lists,map,
[#Fun<sqerl_gobot.1.114344583>,
undefined],
[{file,lists.erl},{line,1237}]},
{sqerl_gobot,who_types_the_untyped,
1,
[{file,
/path/to/project/_build/default/lib/sqerl/src/sqerl_gobot.erl},
{line,81}]},
{sqerl_gobot,parse_transform,2,
[{file,
/path/to/project/_build/default/lib/sqerl/src/sqerl_gobot.erl},
{line,51}]},
{compile,
'-foldl_transform/2-anonymous-2-',
2,
[{file,compile.erl},{line,932}]},
{compile,foldl_transform,2,
[{file,compile.erl},{line,934}]},
{compile,
'-internal_comp/4-anonymous-1-',2,
[{file,compile.erl},{line,295}]},
{compile,fold_comp,3,
[{file,compile.erl},{line,321}]},
{compile,internal_comp,4,
[{file,compile.erl},
{line,305}]}]}
root cause:
사실 제법 많은 시간을 헤맸는데, 원본 파일이 컴파일 되지 않는 것이었다. 아래 라인을 소스 파일에서 제거하고 돌려보면 컴파일 에러(include 파일을 찾지 못함)가 났다.
-compile({parse_transform, sqerl_gobot}).
AST구성후 parse transform후에 컴파일을 진행하게 되므로 상기 에러와 같은 이상한 에러가 나온다.
직접적인 원인은 include가 되지 않아 정상적인 AST가 생성되지 않았는데 그 AST를 조작질(parse trasform)하려니깐 문제가 생긴 것인데... 에러 메시지만으로 알아보기 힘들었다.
solution:
include path 정확히 설정해 준다. release의 root에 rebar.config 파일이 있다면 아래처럼 설정한다 (사실 이거말고 다른 방법도 몇개 존재한다).
{erl_opts, [debug_info
,{parse_transform, lager_transform}
,{i, "apps/project"}]}.
요점은 parser transform을 요하는 소스 파일이라해도 적용전의 형태에서 컴파일은 되어야만 한다는 것.
parser transform 관련해서 문제 생기면 transform을 disable하고 컴파일 테스트해보는 것을 추천하고 싶다.
happy hackin'