이전 포스트에서 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

이전 포스트에서 lex를 컴파일 하기 위해 간단하게 Makefile을 작성했다.
lex를 위한 간단한 Makefile

참고로 난 개발자 입문자라고 하기에도 부족한 4년재 대학생만도 못한 실력을 지녔기에,
예제 소스를 하나 추가할 때 마다 일일히 추가해 줘야하는 번거로움이 있었다.
물론 단지 4줄에 불과하지만...먼가 방법이 있지 않을까 하고 생각했다.

기존 소스를 보자.

test : test.c
        $(CC) -o $@ $< -ll

test.c : test.l
        $(LEX) -o $@ $<

test2 : test2.c
        $(CC) -o $@ $< -ll

test2.c: test2.l
        $(LEX) -o $@ $<

number : number.c
        $(CC) -o $@ $< -ll

number.c: number.l
        $(LEX) -o $@ $<

다른 개발자 분들이 쓰는 Makefile을 참고하여 아래와 같이 추가하니 2줄이 줄어드는 기적을 낳으셨다.
이는 .c와 대응 되는 .l은 아래 규칙으로 수행하라는 의미가 된다. 이렇게 추가한 경우 .c에 대한 명령을 일일히 추가할 필요가 없어진 것이다.

.SUFFIXES : .c .l
.l.c :
        $(LEX) -o $@ $<

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

Yacc, Bison으로 인한 문제  (0) 2013.10.25
lex 간단한 예제2  (0) 2013.10.25
lex 시작하기  (0) 2013.10.24
시작하기에 앞서...  (0) 2013.10.24
lex를 위한 간단한 Makefile  (0) 2013.10.24

이제 렉스를 공부하기 시작했는데...왠지 어느정도의 성취 없이 포기할 것도 같다.

여튼 시작이 반이랬다고 한발 내딛어 가장 가벼운 샘플을 따라해 보았다.

%%
.|\n ECHO;
%%

main()
{
    yylex();
}

 

쉽게 컴파일 하기 위해서 아래와 같이 Makefile 을 작성!

 

CC = gcc
LEX = lex 

test: test.c
        $(CC) -o $@ $< -ll

test.c: test.l
        $(LEX) -o $@ $<

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

Yacc, Bison으로 인한 문제  (0) 2013.10.25
lex 간단한 예제2  (0) 2013.10.25
lex 시작하기  (0) 2013.10.24
시작하기에 앞서...  (0) 2013.10.24
확장자 규칙의 사용  (0) 2013.10.24