[yummyHitOS] 4 day (2017.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개의 소스파일을 실행파일(바이너리파일)로 컴파일하는 것인데, 실제로 개발을 하다보면 여러개의 소스파일과 링크파일들이 필요하다!! 이를 위해 있는 것이
Macro
"매크로"
위 그림과 같이 구조가 되어있다고 가정해봅시다. 이런 구조의 프로젝트일 때, 우리가 알고 있는 방식으로 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을..!
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언어를 이용한 커널을 만들러 꾜!!
Check out the yummyhit’s website for more info on who am i. If you have questions, you can ask them on E-mail.
댓글남기기