1)make

-유닉스계열 OS의 프로그램 빌드 자동화 도구

-파일 간 종속관계를 파악하여 Makefile(기술파일)에 적힌 내용을 컴파일러가 순차적으로 실행되게 함

1-1) make 장점

-반복 작업 자동화로 시간 절약
-프로그램 종속 구조 파악으로 관리 용이

 

2)Makefile

-make 구조로 기술된 파일

-make (명령어?) 를 사용하여 지정된 순서대로 빌드 과정을 수행하는 스크립트 파일
-수정한 파일만 컴파일하여 전체 파일을 링크하는 작업을 도와 작업시간단축

 

3)makefile 구조

<target> : <dependency>
(tab)<command 1>
(tab)<command 2>

 

-target : 빌드 대상 이름, 결과 파일명
-dependency : 빌드 대상의 의존 파일 목록, target 생성을 위한 필요 파일들
-command : 실행 명령어

 

// 명령어의 시작은 반드시 탭으로 시작
// Dependency 없는 target도 사용 가능

 

4) all

- 명령창에서 $make 입력 시 기본적으로 $make all 이 실행됨  

all : test1 test2 test3
test1:<생략>
test2:<생략>
test3:<생략>
--> make all //test1 test2 test3 모두 실행
--> make test2 //test2만 실행

 

5) make 내장 변수
-CC:컴파일러
-CFLAGS:컴파일옵션
-OBJS: 중간 산물 Object 파일 목록
-TARGET: 빌드 대상(실행 파일) 이름
-LDFLAGS: 링커 옵션
-LDLIBS: 링크 라이브러리

 

변수 사용을 위해 
$(CC)
${CC}
위와 같은 표기로 입력된 변수를 사용

6) 자동 변수(Automatic variables)
$@ : 현재 Target 이름, 출력 파일 콜론의 왼쪽에 오는 패턴을 치환
$^ : 현재 Target이 의존하는 대상들의 전체 목록(종속항목 리스트)
$? : 현재 Target이 의존하는 대상들 중 변경된 것들의 목록
$< : 입력 파일, 콜론의 오른쪽에 오는 패턴을 치환, name of current dependency
$* : 입력 파일에서 꼬리말(.c, .s 등)을 떼넨 파일명, name of current dependency without extension



7) 매크로
Makefile은 빌드 뿐아니라 매크로를 지정하여 사용 가능 

 

7-1)clean build : $make clean 명령어 사용으로 오브젝트 파일들을 한번에 삭제하는 매크로로 정의함 
clean : 
(tab)rm -f *.o
(tab)rm -f $(TARGET)

7-2)fclean build : $make fclean 명령어로 실행파일 및 오브젝트 파일을 한번에 삭제하는 매크로로 정의함



8) .PHONY(포니 타켓)
- 동일한 이름의 파일 존재 시 충돌을 피하기 위해 사용
- makefile이 위치한 작업 디렉토리 내에 target과 같은 이름의 파일이 존재하면 make는 이미 빌드가 끝난 타켓이라 판단해 해당 명령어를 수행하지 않는다. 그러므로 .PHONY를 사용해 makefile에 명시된 target이 명령를 수행한다.

 

9) @의 의미

all:

   @echo "with @..... make will not print out the command that it executes."

 

커맨드창에 실행되는 명령이 출력안됨

 

all:

   echo "without @....."

 

커맨드창에 실행되는 명령이 출력됨

 

10)기타

${SRC:.c=.o} //SRC에서 .c파일을 .o파일로 변환

$make //터미널에서 make만 입력하면 makefile에 입력된 가장 첫번째 규칙을 찾아 실행

 

NAME = exe.a
CFLAGS = -Wall -Wextra -Werror
SRC = = ft_memcmp.c ft_strlen.c ft_strlcpy.c\
	  	ft_atoi.c ft_isalpha.c ft_isdigit.c\
	
OBJ = $(SRC:.c=.o)

.PHONY : all clean fclean re
all : $(NAME)

$(NAME) : $(OBJ)
	@echo "Compile $(NAME)...."
	@gcc $(CFLAGS) -c $(SRC)
	@ar rc $(NAME) $(OBJ)
	@ranlib $(NAME)

clean :
	@echo "Remove object file..."
	@rm -rf $(OBJ)

fclean : clean
	@echo "Remove $(Name)..."
	@rm -rf $(NAME)

re : fclean all

'Shell > 1' 카테고리의 다른 글

/etc/sudoers | visudo  (0) 2021.09.13
UFW(Uncomplicated Firewal) 설정  (0) 2021.09.06
vim .vimrc환경설정  (0) 2021.06.19
파일 디스크립터(File Descriptor) / 입출력 리다이렉션  (0) 2021.05.24
touch  (0) 2020.10.15

+ Recent posts