manywaypark's Blog
개발, 검색, 함수

'function_clause'에 해당되는 글 1건

  1. 2016.10.19 error in parse transform 'sqerl_gobot': function_clause

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}).

rebar2와 rebar3(정확히는 rebar3의 release)의 디렉토리 구조가 달라서 아예 컴파일이 안되는 것이 었다. 

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'



1 
분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

03-28 15:58