이전 포스트에서 lex, flex만은 Makefile을 작성하기 무척 쉬웠다. 꽤나 만족스럽다.

하지만 yacc, bison을 함께 하면서 모든게 어긋나기 시작했다.
문제의 발단은 lex도 .c파일을 만들어내고 yacc 또한 .c파일을 만들어내는데서 있다.

이게 왜 문제냐하면 두 소스를 같은 이름으로 못 한다는 것이다.

예로 계산기 소스를 작성하는데 calc.l파일과 calc.y파일을 만들었다고 치자.
bison을 먼저 돌려야 하지만(사실 아직 왜 먼저 돌리는지 모른다...) lex를 먼저 공부했기에 lex의 결과물을 보자.

'flex calc.l' 을 수행한다면 결과물은 lex.yy.c가 된다. 하지만 난 이게 싫어 -o 옵션으로 calc.c로 지정을 했다.
머...이유는 단순히 '.'문자가 두번 있는게 보기 싫어서이다.
이런 상황에서 bison을 돌려야 한다면...'bison -d calc.y' 명령을 사용하겠지만 이 또한 calc.tab.c와 calc.tab.h 파일을 만들어 낼테니 -o 옵션을 사용하려 한다. 하지만 calc.c파일은 이미 flex가 만들어낸 결과물이 있기 때문에 같은 이름을 사용할 수 없다.

젠장...결국 두 소스의 이름을 달리 가거나 두 소스의 컴파일 결과물의 파일이름을 다르게 지정해야한다.
결과적으로 현재는 두 소스의 이름을 별도로 가져갔다. 머가 옳은지 머가 일반적인지 모르겠다.

그래서 만들어진 Makefile

calc : calc.c parser.c
        $(CC) -o $@ $^ -l$(LIBS)

calc.c : calc.l parser.h
        $(LEX) -o $@ $<

parser.c : parser.y
        $(YACC) -o $*.c $<

parser.h : parser.y
        $(YACC) -o $*.c $<

'개발관련 > (Fast)Lex' 카테고리의 다른 글

lex 간단한 예제2  (0) 2013.10.25
lex 시작하기  (0) 2013.10.24
시작하기에 앞서...  (0) 2013.10.24
확장자 규칙의 사용  (0) 2013.10.24
lex를 위한 간단한 Makefile  (0) 2013.10.24