linux makefile과 target을 알아봅시다.

코딩/C 2022. 12. 26. 21:35

 프로그램을 개발하다가, 다른 환경에서 테스트를 해야 할 때, 세팅을 편하게 하는 방법이 없을까요? prod 환경일 때에도, local 환경일 때에도 단 1줄만 입력하면 알아서 컴파일 되거나, 명령어를 실행해서 세팅이 될 수 있게끔. make 명령어로 간단하게 할 수 있습니다.

 


 우리는 로컬 환경에서 구동하는 것을 목표로 하거나, 실제 배포 환경에서 구동하는 것을 목표로 할 수 있습니다. 이를 각각 LOCAL, PROD라고 할게요. 이들을 make에서는 TARGET이라고 이야기 합니다. 여기까지 정리해 봅시다. 프로그램이 실행되기 위한, 혹은 환경이 세팅되기 위한 목표를 우리가 정할 수 있어요. 로컬에서 세팅되게 하겠다는 LOCAL, 배포 환경으로 세팅되게 하겠다는 PROD.

 

 Makefile을 작성해 보겠습니다. vi Makefile을 입력합시다.

 

 그리고 위와 같이 입력해 보겠습니다. 목표가 있습니다. 그러면, 목표가 달성되기 위해서 실행되어야 하는 명령어들이 있을 겁니다. 1번째 줄의 local:은 목표 local을 의미해요. 다음에 2 ~ 3번째 줄의 명령어들은 tab으로 구분되어 있어요. local이라는 목표를 달성하기 위해, 12345를 화면에다가 출력합니다. 그리고, test3이라는 디렉토리를 만드는데요. 여기서 왜 굳이 -p를 붙였을까요?

 

 디렉토리를 만들 때 있는 디렉토리를 그냥 만들어 버리면 보통 에러가 뜨게 됩니다.

 

 

 -p 옵션을 주면, 폴더가 있을 때에도 오류가 떨어지지 않습니다.

 

 

 심지어 폴더를 만들 때 parent가 필요한 경우 자동으로 만들어 주기까지 합니다. mkdir -p a/b/c/d를 입력하고 tree 명령어로 보면, 디렉토리 a, b, c, d가 차례대로 생성되었음을 알 수 있어요. rm -rf a를 해서 디렉토리 a에 있는 것들을 모두 삭제합시다.

 

 

 이제 make local을 입력해 봅시다. target이 local이니까, 목표가 local이 되겠습니다. local이 되기 위해, 우리는 12345를 출력한 다음에, test3 디렉토리를 만듭니다.

 

 ls를 입력해 보겠습니다. 그러면, test3이라는 디렉토리가 생성되었다는 것을 알 수 있어요. local이라는 목표는 달성된 셈입니다.

 


 그런데, 다른 목표가 있을 수도 있어요. 예를 들어 배포를 위한 prod가 있을 수도 있어요. 이 경우, Makefile 안에 prod: 라고 적어주시면 됩니다. prod: 밑에 있는 명령어 2개를 보면, 67890을 출력한 다음에, 디렉토리 prod3을 만든다는 것을 알 수 있어요.

 

 

 이제 make prod를 실행해 봅시다.

 

 

 그리고 ls를 입력해 보면, prod3도 생성되었음을 알 수 있습니다. 여기까지 정리하면 Makefile은 목표와 목표를 달성하기 위해 어떤 것을 달성해야 하는지를 적어놓는 파일이라 할 수 있어요. 그래서, make A 라고 입력하면, 목표 A를 달성하기 위한 명령들이 수행되게 됩니다.