make 시스템
대규모 프로그램의 경우에는 헤더, 소스 파일, 목적 파일, 실행 파일의 모든 관계를 기억하고 체계적으로 관리하는 것이 필요
파일들의 의존관계를 파악 후 make 시스템을 이용하여 효과적으로 작업
필요한 파일만 다시 컴파일하여 실행파일을 재생성
Makefile
구성 형식
대상리스트: 의존리스트
(tab) 명령리스트
하나의 디렉토리에는 하나의 Makefile만이 존재해야 함
Makefile 파일명 외에 다른 파일명을 갖는 입력 파일을 사용할 때는
make -f <입력파일명> 처럼 사용함
ex) make -f mymakefiile.ex9
make의 실행
make를 실행하면
gcc -c main.c ##이렇게 실행됨
gcc -c copy.c
gcc -o main main.o copy.o
만약 copy.c 파일이 변경된 후에 make를 실행하면
gcc -c copy.c
gcc -c main main.o copy.o ## main.c의 재 컴파일 없이 copy.c만 컴파일 후 실행파일 main생성
Lable
레이블로 사용될 때는 의존 관계 부분은 없어도 됨. 즉, 명령어의 수행만 필요할 경우에 사용
make 파일 내부에
clean :
(tab) rm -f *.o
위와 같이 선언되어 있을 때 make clean을 실행하면
rm main.o read.o write.o ## 파일 내에서 .o 파일은 모두 삭제됨
Lable이 추가된 Makefile 예시
Macro
Makefile에 기술되는 반복적인 내용을 단순화 시키기 위해 사용
사용자 정의 매크로
반복적으로 사용되는 내용을 C언어의 #define과 같이 임의의 매크로 변수에 사용 가능
ex) OBJECTS, TARGET
위와 같은 코드를
매크로를 사용하여 실행 할 수 있음
사전 정의 매크로
내부적으로 미리 정의되어 있는 매크로의 사용
Make 유틸리티가 인식할 수 있도록 정의 대상이 미리 약속된 매크로
ex) CC - C컴파일러를 지정, CFLAGS - cc와 gcc의 옵션 지정
다른 파일명을 갖는 makefile의 macro
실행
make -f Makefile.ex9 ## gcc ex9-a.c ex9-b.c -o ex9
./ex9 ## func a 출력
Auto Macro
자동 매크로 혹은 내부 매크로
특별한 의미의 매크로이며 의미의 수정이 불가능함
$*
의존 관계가 있는 파일 중 현재 처리 중인 파일의 확장자를 제외한 이름
$*.c 형태로 사용
main.o = main.c io.h
gcc -c $*.c ## gcc -c main.c
$<
의존 관계가 있는 파일 중 현재 처리중인 파일의 이름
현재 타겟 파일보다 더 최근에 업데이트한 파일명
소스 파일 의미
main.o : main.c io.h
gcc -c $< ## gcc -c main.c
$@
현재 타겟 파일명
OBJECTS = main.o sub1.o sub2.o
maketest : ${OBJECTS}
gcc -o $@ ${OBJECTS} ## gcc -o maketest ${OBJECTS}
확장자 규칙 (suffix rule)
확장자 규칙이란 파일의 확장자를 보고, 그에 따라 적절한 연산을 수행시키는 규칙을 말한다
make 파일에 주의 깊게 처리할 파일들의 확장자를 등록
오브젝트 파일이 존재하지 않으면, make는 이를 생성하기 위해 .c, .s 소스 파일을 찾음
확장자 규칙에 의해 make는 파일들 간의 확장자를 자동으로 인식해서 필요한 작업을 수행함
.SUFFIXES : .c.o
확장자 규칙 선언 .c가 .o 로 변환
.c.o:
(tab) ${CC} ${CFLAGS} $< -o $@
확장자 규칙 정용시 사용 명령어 명시적 지정
명령리스트를 생략함
여러 목표 프로그램
make 파일 내부에 목표 프로그램이 다수일 경우 가장 상위 목표 프로그램만 처리됨
상호 의존 관계가 없는 두 목표 프로그램의 처리 시, target을 모두 지정하거나 별도의 makefile로 작성하여 관리해야함
make -f Makefile.ex8-9 ## gcc -o ex8 ex8.c ex8만 실행됨
make -f Makefile.ex8-9 ex8 ex9 ## 둘 다 지정해주면 둘다 실행됨
## gcc -o ex8 ex8.c
## gcc -o ex9 ex9-a.c ex9-b.c
다중 타겟 all
첫 줄에 all : ex8 ex9
마지막 줄에 clean 을 추가
make -f Makefile.ex8-9 clean
make all ## ex8 ex9 모두 실행됨
'Linux' 카테고리의 다른 글
[리눅스] 유닉스/리눅스 (0) | 2022.10.16 |
---|---|
[리눅스] 시스템 프로그래밍 환경 - gdb 디버거 (0) | 2022.10.16 |
[리눅스] 시스템 프로그래밍 환경 - gcc 컴파일러 (0) | 2022.10.14 |
[리눅스] 시스템 프로그래밍 환경 - vi (1) | 2022.10.14 |
[리눅스] 권한 및 쉘 (0) | 2022.10.04 |