💙베하💙 누구든 탑승할 수 있는 유임승차 팀입니다!!💨😉
리눅스 기반의 프로젝트들을 수행하다보면 종종 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
길다면 길고 짧다면 짧은 글 읽어주셔서 감사합니다.
다음번엔 더욱 유익한 내용으로 찾아오겠습니다.
'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 |
댓글