[yummyHitOS] 만들기 (4일차/17.07.06)
후룰루룰~ 드디어 C언어를 마주할 수 있는 챕터로 넘어왔...지만 우리가 할 일은 먼저 6장의 마지막에 있던 makefile을 초큼 분석해보쟈!!
갑자기 이상한 내부 매크로가 튀어나와서 흠칫했을 것이다. 아니 $< 요곤 뭐시고 $^ 요곤 뭐시다야? 뭐시긴 뭐시여.. 궁큼한 것이제~
그래서 먼저 makefile을 만들 때 규칙과 makefile의 문법에 대해 알아보고 넘어가고 싶어졌다!(이건 순수 개인적인 궁금함일 수 있으므로.. 별로 관심이 없다~ 하시는 분들께서는 ㅜㅠㅜ 눙물이나지만 저는 정말 열심히 적고 있지만 살포시 다음 포스팅으로 넘어가시면 됩니다 눙물눙물 훌쩍훌쩍)
저번 포스팅에서 간~략하게 make명령을 이용할 때 쓰이는 makefile 예제를 만들었던 적이 있는데, 그 때는 저어어어엉말 아주 예제 기본예제!
C언어 시작했을 때 printf("Hello, World!\n"); 하나 찍고서 "훗, 난 컴퓨터를 잘해" 라는 것과 같은예제!!
오늘은 쫌 자세하게 들어갑니다!
매크로 : 사용할 옵션 및 파일명 등을 한 단어로 정의하는 것
저 정말 설명 못해요ㅜㅠ 예를 들면서 하는게 역시 가장 이해하는데 좋은 것 같지 않나요? 헤헿
(리눅스를 써보지 않으신 분에 한해 자세~하게 설명드릴테니 조금 답답하시더라도 참아주세여!!)
윈도우를 쓰시던 분들은 개발할 때 Visual Studio를 사용하시다보니 자동 컴파일이 되었겠지만.. 리눅스를 사용하면 gcc 라는 컴파일러를 이용합니다! (요즘 qt로 크로스 컴파일하는 것도 재미가 쏠쏠해요~ 해킹 툴 포스팅에서 다뤄드리죠!)
gcc 명령으로 컴파일을 할 때, 기본적으로 -c 옵션(object 파일로 컴파일하는 옵션) / -o 옵션(컴파일 후 생성되는 바이너리 파일의 이름을 정하는 옵션) 두가지 옵션은 기본중의 기본!
(책을 좀 더 열심히 공부하다 보면 뭐 이런 옵션도 있나.. 싶을 정도로 옵션이 많습니다.)
저번(2일차)에 makefile을 들여다 보면
gcc -c main.c
gcc -o helloworld.exe main.o
이 두가지 명령이 보이는데, 즉 gcc -c main.c 를 통해 main.o 파일을 생성하고, 이 main.o 오브젝트 파일을 이용해 gcc -o helloworld.exe 명령을 수행하여 helloworld.exe 파일을 생성시키는 과정이었다.
이 예제는 1개의 소스파일을 실행파일(바이너리파일)로 컴파일하는 것인데, 실제로 개발을 하다보면 여러개의 소스파일과 링크파일들이 필요하다!! 이를 위해 있는 것이
"매크로"
위 그림과 같이 구조가 되어있다고 가정해봅시다. 이런 구조의 프로젝트일 때, 우리가 알고 있는 방식으로 makefile을 만들자면 아래처럼 되겠죠?!
지금이야.. 파일이 3개지만.. 막 20개 30개 소스파일이 있다면 옵션으로 20개의 소스파일과 10개의 헤더파일과.. 으으 다 적는 것도 일이겠죠? 이럴 때를 위해 있는 매크로 기능!! 빠밤~
우리의 예제에서 복잡하게 있는 옵션은 각 오브젝트 파일을 나열해둔 것! 이것을 자신만의 이름으로(보통은 OBJECTS 혹은 COBJECTS 라고 네이밍하지만, 필자는 개성을 좋아하니까 OMYGOD으로 해야징) 지정하여 쉽게 써봅씨다!!
뭐가 바뀐지 눈치채셨나여?! OMYGOD 이라는 매크로를 만들어서 $ 문자와 ( )괄호 사이에 넣었어요!! (매크로는 콜론(:)이 아닌 등호기호(=)를 사용하셔야 합니다!!)
과연 이게 실행이 되느냐구요? 흫흐흐흫흫흐 놀라지마시라!!
짜라잔~~~ stdio.h / read.c / write.c / main.c / makefile 구현부 전부 보여드렸어요!! 그냥 짤막하게 보이기 위해 구현하다보니.. write.c에서 부득이하게 printf()함수를 인용해왔네요 핳하핳핳하
정말 잘 실행되지요!? OMYGOD 매크로가 이렇게 잘 먹혀주다니 기특하네요.. 짜식..
이 매크로가 언제 쓰일지 아직 감이 1도 안오신다구요? 이 다음에 포스팅할 7장에서 쓰이겠지만... 미리 보여드리죠 이 무서운 makefile을..!
호모나 세상에!! 난 이제 OS 개발을 그만둘테야!! 하시면 안됩니다! 차근 차근 보시면 정이 드시면서 감이 잡히실거예요. 요로케 조로케 돌아가는거구나~ 하시면서 ㅎㅎ..(전 아직 이친구와 정들기 싫어서 감이 덜잡혔습니다 ㅜㅠㅜ)
이러한 매크로에도 저처럼 항상 OMYGOD을 쓸 수는 없습니다. 미리 정의된 매크로가 있거든요..
ASFLAGS = <- as 명령어의 옵션 세팅
CFLAGS = <- gcc 의 옵션 세팅
CPPFLAGS = <- g++ 의 옵션
LDLFAGS = <- ld 의 옵션 세팅
LFLAGS = <- lex 의 옵션 세팅
YFLAGS = <- yacc 의 옵션 세팅
...위 6개가 끝이 아니라 30개가 넘는 매크로가 있다고합니다... 아아.. 어찌하여 저에게 또 이런 암기의 시련을.. 왜때문이죠..!?
이러한 옵션을 통해 gcc 명령을 이용할 때 더욱 편리함이 가증됩니다. 우리가 따로 옵션을 넣어주지 않아도 이 플래그들이 옵션을 그냥 세팅해주니까요! 핳하하핳하핳하핳 귀찮은 옵션들 한방에 꺼져버렷!! 핳핳하하핳핳
그럼 이제 처음에 제가 궁금해했던 $<, $^와 같은 내부매크로를 알아보며 makefile에 대한 규칙은 이만 하겠습니다.
이게 도대체 뭐라고하는지 1도 이해가 안됩니다. 저도 모르겠어요 이 의미만 보면 뭐라하는지...
먼저, $@는 Target 그 자체를 의미합니다. 우리가 만든 makefile을 예를 들어
helloworld.exe: $(OMYGOD)
gcc -o helloworld.exe $(OMYGOD)
으로 규칙이 있을 때, 여기서 Target은 눈치채셨겠지만 바로바로.. helloworld.exe !!
이 규칙에서 내부매크로를 이용하면 gcc -o helloworld.exe $(OMYGOD) 부분이 gcc -o $@ $(OMYGOD) 으로 바뀐다는 것이죠!!
그럼 확장자가 없는 타겟 이름은 무엇인가..
main.o: stdio.h main.c
gcc -c main.c
여기서 main 을 의미합니다. 즉, 확장자를 뺀 이름만 의미하는 것 같네요! 그럼 이 규칙에서 내부매크로를 이용하면?!
gcc -c $*.c 이렇게 바꿀 수 있겠네요!! 짧아지는 코드를 보면 희열을 느끼는 야미(가명, 나이 뱁새)
다음 내부매크로인 $< 를 보면 최근에 갱신된 파일..? 보통 소스파일은 유지보수 혹은 개발 단계중에서 계~~속 계~~속 갱신되니까 이걸 일컫지 않을까요!?
방금 예를 들었던 규칙에서 main.c -> $*.c 가 되었는데, 이것을 또 한 번 더 줄여서 $*.c -> $< 로 바꿀 수 있습니다!
꼭 신조어같은..알쓸신잡 핳하핳 알쓸신잡 선생님들 사랑합니당
그럼 뭐 그 다음 $? 매크로는 소스파일같은 파일이 아닌 필수 조건 파일 이름이라고 하네요! 필수 조건 파일이란 역시 콜론(:) 옆에 나오는 파일들을 의미하겠죠!? 이 파일들의 이름이 변경되었을 때 참조하기 위한 매크로인 것 같..긴... 한데... 아직 쓰는 분을 본 적도 없을 뿐더러.. 아무리 쓰려 해도 어디에 어떻게 써야할지 모르겠네요 ㅜㅠㅜ 예를 못들어 드리고 이렇게 짤막한 설명으로 끝내는 점 죄송합니다 ( __ __ ) 꾸벅..
마지막 매크로인 $^는 현재 모든 필수 조건 파일들!! 콜론(:) 옆 필수 조건 파일들을 전~~부 의미한다고 합니다.
helloworld.exe: main.o read.o write.o
gcc -o $@ main.o read.o write.o
여기서 main.o read.o write.o 를 가장 처음에 OMYGOD 과 같은 매크로로 정의해도 되지만, $^ 라는 내부 매크로를 사용할 수도 있다는 것이죠!! 우리가 만든 makefile이 어떻게 바뀌는지 확인해봅시다.
짜잔!! 이렇게 짧아지다니 이거이거.. makefile 정들 것 같네요! 오늘은 makefile의 규칙에 대해.. 참 마지막으로 하나만 더!! makefile의 규칙이 너무 길어진다면, \(역 슬래시 기호)를 이용하세요! 뭐.. 코딩 좀 해봤다~ 하시는 분들은 가끔 파라미터가 길어져서 쓰실 때가 있었을 겁니다!
그럼 이제 C언어를 이용한 커널을 만들러 꾜!!