03. Makefile(1)

지수호·2023년 2월 19일
0

C언어 공부

목록 보기
4/4
post-thumbnail

이전내용

  • 이전 글에선 Makefile 을 사용하는 방법을 공부했다
  • Suffix rule 이라든지 매크로 등을 사용하여 편하게 사용하는 방법도 알아봤다

Makefile 작성법

레이블

이전 글에서 Makefile의 문법을 간단하게 알아봤었다.

target ... : dependency ...
(one tab)command
                ...

여기의 target 부분을 레이블로 사용할 수 있다.

예를 들어서 빌드 과정을 거치고 나서 .o 로 끝나는 목적파일들을 한 번에 정리하고 싶다면?

clean 이라는 레이블을 만들어서 make clean 으로 편하게 사용한다든가 말이다.

# Makefile
.SUFFIXEX = .c .o
CC = gcc
TARGET = main.exe
OBJS = main.o printLine.o printLines.o 

$(TARGET): $(OBJS)				       
	$(CC) -o $(TARGET) $(OBJS)
    
clean	:								# add
	rm $(OBJS)							# add
  • 이전에 사용했던 Makefile 에 clean 레이블을 추가했다.
  • 단순히 삭제만 하는 기능이기 때문에 dependency 는 빈칸으로 뒀다.
  • make clean 혹은 mingw32-make clean 을 입력하면 오브젝트 파일들이 삭제되는 것을 확인할 수 있다.

rm 커맨드가 작동하지 않을 경우 윈도우의 경우

delete *.o

위와 같이 작성하여 사용하면 된다.

추가적으로 자주 사용하는 명령어가 있다면 레이블을 작성해두고 두고두고 사용하면 된다.


Pre-defined macro

이름 그대로 미리 정의되어있는 매크로이다.
make -p 명령어로 정의되어있는 매크로를 확인할 수 있다.
이중에서 바꿔야 할 값은 재정의를 해서 사용할 수 있다.

WEAVE = weave
# default
MAKE_COMMAND := C:/MinGW/bin/mingw32-make
# default
LINK.cpp = $(LINK.cc)
# environment
PROCESSOR_ARCHITEW6432 = AMD64
# default
F77 = $(FC)
# default
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
# environment
VSCODE_GIT_ASKPASS_EXTRA_ARGS = --ms-enable-electron-run-as-node
# environment
TERM_PROGRAM = vscode
# default
.VARIABLES :=
# default
PC = pc
...

엄청나게 많은 값들이 주르륵 나온다.

음,,, 이건 나중에 알아보는 걸로 하자.


Internal macro

make에는 내부 매크로가 정의되어있다.
따로 수정하거나 추가할 수 없고 미리 정의되어있는 대로만 사용가능하다.

이부분은 참고 사이트에 적혀있는게 좋아서 그대로 옮겼다.

$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름

=> 참고: 책에서는 $< 와 $?를 약간 구분하고 있지만 거의 같다고 봐도 무방할 것입니다.

위에 써있는 내부 매크로를 사용하여 이전에 작성했던 Makefile을 수정해보자!

# Makefile
.SUFFIXEX = .c .o
CC = gcc
TARGET = main.exe
OBJS = main.o printLine.o printLines.o 

$(TARGET): $(OBJS)		       
	$(CC) -o $@ $(OBJS)		 # edit
    
.c.o :						 # add  -> 확장자 규칙도 직접 작성했다
	gcc -c $<				 # add
    
clean	:
	rm $(OBJS)

지금 예제로는 딱히 바뀔게 없다,,,



마무리

  • 사실 Makefile을 직접 작성하기보단 Cmake를 통해서 생성하기에 이정도까지만 알면 될 것 같다.
  • 만약 Cmake 공부를 하던 중에 보충해야할 설명이 있다면 그때 추가적으로 알아보도록 하자,,,
  • 게다가 요즘엔 통합개발환경이 워낙 좋아서 직접 쓸 일은 많이 없을 듯 하다,,




사실 찐하게 하고 싶은데 이걸 벌써 찐하게 하고 시작하면 진이 빠질 것 같아서 미룬 것도 있다,,ㅎ
Cmake 도 간단하게 공부하고 나선 이제 C, C++ 만큼은 정말 찐하게 공부할 예정이다.
이전에 공부하면서 가볍게 넘어갔던 포인터, 구조체, Container 등을 자세하게 공부하고 알고리즘 공부를 할 예정이다.

profile
지수호

0개의 댓글