[WIL] WEEK05 - 발표 자료

woo__j·2024년 4월 25일
0

WIL - Weekly I Learned

목록 보기
2/4
post-thumbnail


우리가 부여받고 작성한 과제인 rbtree.c 코드를 테스트 해보려면 'make test'를 수행하라고 나와있다.

원래 같으면 우린 gcc 명령어를 사용해서 우리가 작성한 소스코드 파일인 'rbtree.c'와 테스트 케이스가 적혀있는 'test-rbtree.c' 파일을 각각 컴파일 한 후, 오브젝트 파일을 생성하고 이 두 개의 오브젝트 파일을 링크해서 하나의 실행파일로 만들어 실행하는 과정을 거쳐야 한다.

그런데 우리는 이 귀찮은 과정들을 모두 생략하고 'make test'라는 하나의 명령어로 테스트를 수행했다.
이게 어떻게 가능한 일 일까?

답은 Makefile에 있다.

우리가 부여받은 과제에서 각각의 폴더에 Makefile이 있었던 걸 확인할 수 있다.
이 Makefile은 프로그래밍 언어로 된 소스코드 파일들을 컴파일하고 링크하고, 실행파일을 생성/실행하고, 삭제하고... 등등
이 귀찮은 작업들을 자동화하기 위해 미리 규칙을 선언해놓고, 각 규칙에서 수행할 일을들 미리 정의해놓을 수 있는 파일이다.

우리는 이렇게 각 파일에서 규칙들을 미리 선언&정의해놓고 하나의 명령어로 특정 작업을 수행할 수 있게 된다.
나는 이걸 보고 약간 함수와 비슷하지 않나? 라는 생각을 했다.

예를 들어 위와 같은 ./src/Makefile을 보면 driver라는 함수명을 선언하고, 그 함수의 내용은 '해당 디렉토리에 있는 driver.c, rbtree.c 각각의 소스코드를 obj파일로 컴파일 한 다음, 만들어진 obj파일들을 링크해 driver라는 실행파일을 만드는 일을 해라'라고 정의해놓았다.

그럼 우리는 해당 디렉토리 내에서 'make driver'라는 함수를 호출하기만 하면 각 규칙에 맞게 일을 수행하고 driver라는 실행파일이 만들어질 것이다. 함수랑 원리는 비슷한 느낌이다.



정리하자면, 우리는 rbtree-lab 디렉토리에서 make test를 했을 것이다.
그럼 이 말은 rbtree-lab 디렉토리에 있는 Makefile의 test라는 규칙에 맞게 수행을 하게 될 건데,
이는 src 디렉토리의 rbtree.c와 test 디렉토리의 test-rbtree.c를 각각 컴파일해서 obj파일을 만든 다음 링크해서 실행파일을 생성하고 실행/검사까지 하는 명령어 수행들을 자동화해서 실행해주게 된다.

각 폴더의 Makefile에 선언&정의되어 있는 규칙(명령?)들을 한 눈에 정리해놓았다.
이는 rbtree-lab 디렉토리에 있다는 가정 하에 작성했다.

최종적으로 Makefile을 왜 쓰냐?
첫 장에서 적혀있듯이, 본래 gcc를 활용해서 컴파일/링크/실행을 하려면 각각의 수행들을 한 줄에 적어 실행하고, 실행하고... 하는 과정을 거쳐야 한다. 우리가 했던 과제처럼 소스코드 파일이 적다면 괜찮겠지만, 만약 소스코드 파일이 더 많다면?

규모가 큰 프로그램을 개발할 때 , 하나의 파일을 여러 개로 나누어 진행하게 될텐데 그럼 그걸 하나씩 빌드해야 할까?
이것만 생각해도 비효율적인데, 만일 귀찮음을 감수하고 모든 소스코드 파일을 빌드해서 기껏 실행파일을 만들어놨는데, 그 여러 개의 파일 중 하나의 파일에 문제가 생겨 컴파일 과정을 다시 거쳐야 한다면?... 이 모든 과정을 다시 해야 한다.
이 때 사용하는 것이 Make다.

Make는 여러 모듈화된 소스코드 파일을 빌드할 때 사용하는 '프로그램 빌드 도구'라고 보면 된다.
여러 파일 사이 의존성과 각 파일에 필요한 명령을 '정의'해놓음으로서 프로그램을 컴파일할 수 있으며, 최종 프로그램인 실행 파일을 만드는데 필요한 명령어들을 서술할 수 있는 표준 문법을 제공한다.

1개의 댓글

comment-user-thumbnail
2024년 5월 12일

정말 많이 도움됐습니다

답글 달기

관련 채용 정보