이 글을 우리반 똑띠에게 헌정합니다.
사건의 발단은 이렇다.
echo 서버를 구축하던 도중 (코드를 따라치던 중)
우리반 똑띠한테 어떻게 하는 거냐고 질문을 했다.
똑띠답게 '파일을 두 개를 만들고 ~~' 하면서 설명을 해줬다.
그러더니 마지막에
'gcc 입력을 잘못해서 파일을 날렸다. 그래서 한 번 더 쳐야했다.'라고 했다.
사실 나는 몆 주간 c언어를 계속하면서 컴파일도 몇 번이고 했지만...
gcc 명령어를 입력한 적이 손에 꼽는다..

이 친구가 딸깍하면 다 만들어줬기 때문이고
터미널에 'make' 하면 다 만들어줬기 때문이다.
그런데 이번에는 좀 어려운 상황에 봉착했다.
make 파일도 없고 파일 구조 자체도 [csapp.c csapp.h echoclient.c echoserveri.c] 이런 식으로 되어있었기 때문에 code runner 딸깍도 어려운 상황이었다.
그 와중에 보인 것은
이 녀석이었다.
혼자서 echo용 makefile을 만들어보려고 했으나 gpt에게 pt를 받은 것은 나중의 이야기
아무튼 구조를 살펴봤다.
tiny 메이크 파일로도 잘 이해가 안돼서 proxy 메이크 파일도 살펴봤다.
지금이야 돌아가는 방식이 보이지만, 그때는 이 코드를 봐도 잘 이해가 안갔다.
그래서 도움을 받았다.
대충 보이는 것은 '파란색이 변수로 $()안에 변수를 넣을 수 있겠구나'였다.
그리고 지금 보이는 것은
make를 치면 all이 실행이 되고,
현재 노란색으로 보이는 글자(뭐라고 부르는 지는 모르겠다.) 옆에 있는 하얀색 글자들이 다시 실행된다.
하얀색 글자는 다시 노란색 글자로 이어지고
만약 목적 파일이 존재하지 않으면 아래에 있는 명령문(?)을 실행하는 것 같다.
다시 제대로 된 용어로 바꿔보자.
이 Makefile은 gcc 컴파일러를 이용해 echoclient와 echoserveri라는 두 개의 실행 파일을 만드는 빌드 스크립트입니다.
맨 위에는 CC = gcc와 CFLAGS = -O0 -Wall -I . -g 같은 변수들이 정의돼 있습니다.
CC는 사용할 컴파일러를 의미하고,
CFLAGS는 컴파일 시 적용할 옵션들을 의미합니다.
예를 들어 -O0은 최적화를 하지 않는다는 뜻이고,
-Wall은 경고 메시지를 모두 출력하겠다는 의미입니다.
-I .는 현재 디렉토리를 헤더 파일 검색 경로에 추가하고,
-g는 디버깅 정보를 포함하겠다는 의미예요.
그 아래 all이라는 기본 타겟이 정의되어 있는데, 이는 사용자가 터미널에 make만 입력했을 때 자동으로 실행되는 부분입니다.
all은 echoclient와 echoserveri를 의존성으로 갖고 있으므로
이 두 개의 실행 파일을 만들기 위해 아래에 정의된 규칙들을 차례로 따라갑니다.
예를 들어,
echoclient 타겟은 echoclient.c와 csapp.o가 필요하다고 명시되어 있고,
이 파일들이 준비돼 있지 않거나 수정되었으면 그 아래에 있는 gcc 명령어를 실행합니다.
이 명령어는 변수로 정의된 $(CC), $(CFLAGS), $(LIB) 등을 사용해 echoclient 실행 파일을 생성합니다.
마찬가지로 echoserveri도 echoserveri.c와 csapp.o를 사용하여 비슷하게 빌드됩니다.
이때 csapp.o는 csapp.c와 csapp.h를 기반으로 먼저 컴파일되는데, 이 과정도 별도로 정의되어 있습니다.
마지막으로 clean이라는 타겟이 있는데, 이건 실행 파일이나 오브젝트 파일(.o), 백업 파일(~) 등을 지워주는 역할을 합니다.
터미널에서 make clean을 실행하면 이 명령이 수행되어 디렉토리가 깨끗한 상태로 초기화됩니다.
전체적으로 보면, Makefile은 어떤 파일을 만들기 위해 어떤 파일이 필요한지(의존성)를 명확히 정의하고,
조건에 따라 어떤 명령을 실행할지를 순서대로 지정해둔 스크립트라고 할 수 있습니다.
위 내용 그대로 요약해서 쓸 예정이니 넘어가고 싶으면 넘어가자.
1번과 2번의 CC, CFLAGS는 변수라고 부른다.
CC는 사용할 컴파일러이며 현재 gcc로 설정되어 있다.
CFLAGS는 컴파일 시 적용할 옵션이며 현재 여러 가지 옵션들이 있다. 옵션들에 대한 설명은 위에서 참고하자.
3번의 -lpthread는 컴파일 시 POSIX 스레드 라이브러리를 링크하라는 의미인데,
여기서 두 가지를 확인할 수 있다.
첫 번째는 proxy에서 이 파일을 가져왔다는 것이고
두 번째는 gpt의 도움을 생각보다 많이 안 받았다는 것이다.
무슨 의미냐면, 사실 echo서버에서는 저게 전혀 필요없다.
왼쪽에 있는 노란색 글자를 타겟이라고 부른다.
사실 내가 하이라이팅 설정을 해서 그렇지 다른 설정이라면 다른 색으로 보일 수도 있다.
4번의 all은 기본 타겟이라고 부른다. 우리가 항상 'make'를 입력할 때 실행되는 친구이다.
그리고 그 옆에 있는 echoclient와 echoserveri는 의존성이라고 부르는 친구들이다.
5번 역시 마찬가지로 csapp.o라는 타겟과 csapp.c, csapp.h라는 의존성이 있다.
6번은 gcc 명령어이고 위에 있는 변수들을 대입하면 다음과 같은 문장이 된다.
gcc -O0 -Wall -I . -g -c csapp.c
이를 통해 csapp.o 목적 파일을 생성할 수 있다.
8번은 make clean을 입력하면 실행하는 삭제 관련 명령어이다.
딸
칵

자, 이렇게 make 파일의 구조를 살펴봤는데,
이제 make 파일이 뭔지 알아보자.

다 알아봤다.
그 밑에 있는 내용은 탄생 배경과 관련된 내용인데, 우리가 컴파일하면서 느낀 느낌과 비슷하다.
힘들어서 만들었다고 한다.

나는 코딩 흥선대원군이다.


몇 개 빠졌지만 참자.