본문 바로가기
OS/Linux

make 와 makefile 언제 사용할까?

by BTC_222 2022. 12. 21.

💙베하💙 누구든 탑승할 수 있는  팀입니다!!💨😉

리눅스 기반의 프로젝트들을 수행하다보면 종종 makefile 을 발견하곤 한다.

여태까지는 내가 makefile 을 수정하거나 만들어서 작업해야 하는 경우가 없었지만,

친구가 python 을 make & makefile 을 이용해 쉽게 사용할 수 있지않냐고 해서 공부하게 되었다.


make

make 는 리눅스의 명령어로 파일 관리 유틸리티이다.

찾아보니 윈도우에서도 사용 가능한 명령어라고 하는데, 윈도우보다는 UNIX / LINUX 계열의 OS에서 주로 사용되는 것 같다.

 

이 make 명령어를 사용하면 반복적으로 발생하는 컴파일을 쉽게 할 수 있고,

make 명령어를 사용할 때 makefile 이라는 설정 파일을 참조해 컴파일이 이루어진다.

 

즉 makefile 에서 library 및 컴파일 환경, 실행 명령어 등을 관리하고 make 명령어로 makefile 에 적힌 내용들을 실행하게 한다.



makefile

위에 적어놓았듯 make 명령어로 컴파일을 할 때 사용되는 make 의 설정파일이다.

당연히 그냥 makefile 만 만들면 안되고,

make 라는 명령 프로그램이 인식할 수 있는 형태로 양식을 맞춰 작성해 줘야 한다.



위와 같은 양식으로 makefile 을 만들면 make 명령어로 참조할 수 있게 되는데,

target 으로 의존성 있는 object 파일들이나 c 파일등을 넣어주면 된다.

(뒤에 나오지만 반드시 object 나 c 파일이 아닌 txt 등도 가능하다)


예시를 보자면

run : hello.o haha
    echo "print run"

hello.o : hello.c
    echo "hello"

haha : haha.c
    echo "haha"

테스트를 해 보진 않았지만, 이런 방식으로 가능한 것 같다.

 

여기서 make 를 하면 기본적으로 가장 상위의 target인 run 이 실행되면서 의존성이 있는 hello.o 와 haha 를 먼저 실행하는 것 같고,

$ make haha

이런 방식으로 하면 haha 에 해당되는 명령어만 수행되는 것으로 보인다.

 

makefile 의 예제는 아래 블로그를 참고하면 더 자세한 설명이 나와 있다.

https://bowbowbow.tistory.com/12#make-%EC%99%80-makefile

 

왜 사용할까?

프로젝트를 진행하면서 컴파일이 필요한 여러개의 파일들이 생기고,

각각의 파일들을 하나씩 컴파일 하기는 매우 귀찮은 작업이다.

 

또, 컴파일 시 순서가 있는 경우도 있을 것이기에 이를 간편화 하기 위해 make 를 사용한다.

 

make 를 사용하여 한번에 컴파일을 할 수 있기에 일반적으로 c계열의 프로그램 개발 시 많이 사용한다고 한다.

 

 

단순하게 shell script 에 실행할 명령어들을 순서대로 작성해도 되지 않을까?

사실 이 부분이 제일 궁금했다.

굳이 왜? shell script 를 놔두고 makefile 을 만들어 make 로 컴파일을 할까?

 

그냥 script 로 만들어서 순차적으로 여러 파일들을 컴파일 해도 될텐데...?

 

이에 관해서는 https://www.tuwlab.com/ece/27193 이 블로그에 자세하게 나와 있는데

요약하자면,

 

script 로 만들어서 사용하면 매번 script 의 처음부터 끝까지 빌드하게 된다.

makefile 은 Incremental build 를 제공하기 때문에 빌드 과정에서 변경된 소스코드와 의존 관계에 있는 애들만 새롭게 빌드해준다.

 

이 차이점으로 인해 makefile 을 사용하면 컴파일 할 대상이 많은 프로그램에서는 시간을 매우 절약할 수 있다.

 

 

 

python 실행을 makefile 로 만들어 사용 가능할까?

가능하다.

makefile 을 만들 때 실행할 target과 command 에  python 실행을 위한 명령을 적으면 된다.

자세한 내용은 아래 외국인이 작성한걸 구글 번역기로 돌린 블로그를 통해 확인할 수 있다.

https://earthly.dev/blog/python-makefile/

 

요약해서 블로그의 최종적인 모습만 분석해 본다.

 

- makefile 작성

VENV = venv
PYTHON = $(VENV)/bin/python3
PIP = $(VENV)/bin/pip

run: $(VENV)/bin/activate
 $(PYTHON) app.py


$(VENV)/bin/activate: requirements.txt
 python3 -m venv $(VENV)
 $(PIP) install -r requirements.txt


clean:
 rm -rf __pycache__
 rm -rf $(VENV)

- make 실행

make VENV=my_venv run

 

- 설명

1) make 실행 시 VENV 란 환경변수를 my_venv 로 지정하였고, "run" 이란 target 을 실행시킴

2) makefile 의 "run" target 에 해당되는 의존성이 "$(VENV)/bin/activate" 이고, 이 의존성이 있는 target이 실행됨

3) "$(VENV)/bin/activate" target 이 실행되면서 python3 가상환경을 만들고, requirements.txt 에 적혀있는 python module 들을 install 하게 됨

4) 3번의 과정이 끝난 뒤, PYTHON 환경변수의 경로(venv 가상환경으로 설치한 python)로 app.py 를 실행함

 

위 1 ~ 4의 과정은 python3 버전에서 venv 가상환경을 제공하기에 가능한 것이며,

결론적으로 makefile 로 python 실행을 위한 환경을 만들어 제공할 수 있다. 

 

makefile vs dockerfile 비교

문득 makefile 과 Dockerfile 이 비슷하게 느껴졌다.

물론 makefile 의 용도는 컴파일을 자동화 시킴이고,

Dockerfile 의 용도는 도커 컨테이너 생성을 위한 이미지를 만드는 목적이다.

 

하지만 Dockerfile 내에서도 RUN, ENV 등의 설정을 해서 이미지를 만들 때 명령어를 실행시킬 수 있는 점을 보아 아마도 Dockerfile 을 만들 때 makefile 의 방식을 가져오지 않았나 싶다.

 

컴퓨터를 공부하다보면, makefile 과 Dockerfile 처럼 전혀 관계없지만 비슷한 개념이나 방식을 가져와 사용하는 경우들을 발견하곤 한다. 

 

 

 

 

참고한 블로그들

- https://bowbowbow.tistory.com/12#make-%EC%99%80-makefile

 

make와 Makefile

make 와 Makefile make 와 Makefile make 와 Makefile make & Makefile 이란? make를 쓰는 이유 예제 기본적인 컴파일 과정 make를 이용한 컴파일 과정 Makefile 의 구성 Makefile의 기본구조 Makefile 작성규칙 make 예제 따

bowbowbow.tistory.com



길다면 길고 짧다면 짧은 글 읽어주셔서 감사합니다.

다음번엔 더욱 유익한 내용으로 찾아오겠습니다.

 

'OS > Linux' 카테고리의 다른 글

k8s tomcat 배포  (0) 2022.12.21
k8s Ignite 설치 방법  (0) 2022.12.21
[Linux] 파이프, 필터, 리디렉션  (0) 2022.12.09
[Linux] 사용자와 그룹  (1) 2022.12.02
[Linux] Service  (0) 2022.11.25

댓글