Makefile 을 프로젝트 Runner 로 쓰기

김형섭 (Matthew)·2022년 7월 4일
3
post-thumbnail

개요

저는 make 명령어를 매우 자주 사용 합니다.
이 명령어는 매우 오랜 역사를 지닌 빌드 도구 입니다.

여러 명령들을 서술해두고 골라서 실행 할 수 있고, 명령간 의존성을 정의 할 수
있기 때문에 요즘도 매우 유용하게 사용하고 있습니다.

make 명령어는 Makefile 을 읽어서 처리 하는 실행기로도 사용 할 수 있습니다.
유닉스 쉘스크립트 기반이지만, 비슷한 일을 하는 .sh.bat 같은 실행기와는 다소 다른 문법과 컨텍스트 정책을 가지고 있습니다.

Unix 기반 OS 에서 대부분 기본으로 사용 할 수 있습니다. (Linux, Mac OS)
Windows의 경우에도 Windows용 make 프로그램을 설치하면 사용 할 수 있습니다.

Makefile 샘플

제가 사용하는 것중 제일 간단한 파일 하나를 샘플로 설명 드릴께요.

Makefile

#!make

dev:
	yarn start:dev

install:
	brew install docker
	npm i
    
clean:
	rm -rf ./dist 
    rm -rf ./node_modules

docker:
	docker build -t test-api .

docker-run:
	docker run -ti -e PORT=3000 -p 3000:3000 test-api

이걸 뭐라고 부를지 애매했다면, 기억하세요 공식 용어는 셔뱅 입니다.
(저는 오래전부터 발음을 모른채 쉬방 으로 읽어서 지금도 좀 문제가 됩니다.)

  • 하단부터는 다음의 규칙으로 작성 합니다.
    명령어이름: (이 자리에는 먼저 실행해야 하는 다른 make 명령들을 스페이스로 구분 입력할 수 있고 생략도 가능 합니다. 아래 예시를 참고하세요.)
    (TAB) 쉘명령
    (TAB) 쉘명령
    ...
    
    예시)
    
    start: init ready
    	ls -al
    	tree
    
    // 실행 흐름
    -> make start 를 실행하면,
    -> 먼저 make init 를 하고 이 응답으로 Exitcode 0을 받으면 (성공 종료 신호)
    -> 이어서 make ready 를 하고.. 이것 까지 성공하면
    -> ls -al 을 하고.. 이것도 성공하면
    -> tree 까지 실행하여 최종 명령인 tree의 exitcode 를 리턴하고 끝납니다.

주의사항

  • make 명령의 쉘 명령 한줄 한줄은 서로 다른 Context로 실행 됩니다.
  • 즉, 매번 다른 쉘에서 실행되므로 앞 명령의 상태가 다음 명령으로 넘어오지 않습니다.
  • 따라서, cd xxx 후에 npm i 등의 작업을 연속으로 해야할 경우는 && 를 이용해 한줄로 묶어줍니다.
    • 예) cd xxx && npm i
    • 이때, 명령어가 너무 길다면 쉘의 \ 다음줄 연결자를 통해서 정리할 수 있습니다.
      cd xxx \
      && npm i \
      && npm build \
      && npm start
  • 각 명령이 성공적으로 끝나지 않으면 (exitcode가 0이 아니면) make 명령 전체가 에러를 리턴하고 거기서 멈춥니다.

변수

  • 환경 변수를 사용하거나 자체 변수를 만들어 쓸 수 있습니다.
    - (How to Use Variables)

  • $(변수명) 또는 ${변수명} 으로 사용할 수 있습니다.

명령 사용

  • make 내가만든명령어 하면 됩니다. 간단하죠.
  • make 로 아무 명령어 없이 진행하면 가장 첫번째 명령어가 실행 됩니다.
    그냥make 만 치면 가장 위의 명령어는 이름을 생략하고 실행할 수 있다는 것이죠.
    보통 기본 명령어로 활용 합니다.
  • 기본 명령어를 직접 지정하려면 아래처럼 .PHONY: default 라는 특수한 방법을 써야 합니다.
    .PHONY: default
    thisisdefault:
    	ls -al

naming 규칙

  • 특별한 강제 사항은 없지만 개발자 끼리 의미를 통일 하고 사용하면 좋습니다.
  • make 는 기본 명령어로 많이 쓰이므로 가장 자주 쓰는 명령어를 셋팅하면 좋습니다.
    • 컴파일, 서버 시작 등
  • make install 은 처음에 개발 환경을 준비할 때 좋습니다.
    • 개발환경 준비, 필수 프로그램 설치 등
  • make clean 은 개발 환경을 정리할 때 좋습니다.
    • 임시폴더 삭제, 모듈 재정리 등

언어별 Makefile 활용

  • nodejspackage.json 이라는 자체 설정 파일이 있고, 그 하위에 scripts: 섹션이 있어서 거기에 명령어를 담아두고 npm run 명령어 or yarn 명령어로 쓰기에 좋지만, 주석을 달 수 없고 JSON 형태를 유지해야 합니다.
  • php,python,ruby 등은 따로 실행기가 없으므로 Makefile 을 활용해 보세요.
  • Dockerfile 을 관리한다면 도커 빌드, 실행, 업로드등 할일이 많아지고 명령어가 복잡합니다. Makefile을 쓰기 딱 좋은 곳이죠.

저는 모든 프로젝트에 Makefile 를 애용 하는데 매우 직관적이며, 한번 만들어 두면 개발자끼리 공유하여 실수를 방지할 수 있고, Mac 과 Linux 어디서든 사용 가능하므로 개발 환경과 프로덕션 환경간에 차이 없이 실행 할 수 있기 때문 입니다.

Repository 마다 깔끔하게, 그리고 체계적으로 관리되는 Makefile,
여러분의 프로젝트에 한번 적용해 보시는 것은 어떨까요?

profile
CTO at Imweb, 20년차 개발 장인, 전) 플레이오토 CTO/창업자

0개의 댓글