학교 강의를 복습하는 차원에서 작성하는 글입니다.
학부생 수준의 글이므로, 오류가 있을 수 있는 점 양해바람니다.
자동 컴파일 make 유틸리티
증분 컴파일로, 프로그램 그룹 중에서 어느 부분이 컴파일 되어야 하는 지를 자동으로 판단한다.
필요한 커맨드를 이용 재 컴파일 및 링크한다.
즉 makefile 이란 하나의 실행 파일을 작성하기 위해서 관련된 소스 코드 파일들을 컴파일하고 링크하는 순서를 정의하 고 있는 텍스트 형식의 파일이다.
컴파일시 간단히 'make' 명령을 통해 수행한다.
기본 Makefile 구문
target : prerequisite
[TAB] command
target
command가 수행되어 나온 결과물
대부분 목적 파일이나 실행 파일이나. make clean 같은 간단한 레이블 기능도 제공함
prerequisite
이 부분의 파일이 변경 되었을 경우, command 실행
command
전제 조건에 해당하는 파일이 변경되었거나 목표 파일이 없을때. 정의된 명령을 차례로 수행
#은 주석으로 이 문자 뒤 문자열 모두 무시
EX)
foo.o : foo.c foo.h
gcc -c foo.c
=> foo.c 나 foo.h 파일이 변경되었을 경우 foo.c을 컴파일해 foo.o 생성
EX2)
edit : main.o kbd.o insert.o
gcc -o edit main.o kbd.o insert.o
main.o : main.c defs.h
gcc -c main.c
kbd.o : kbd.c defs.h command.h
gcc -c kbd.c
insert.o : insert.c defs.h buffer.h
gcc -c insert.c
clean:
rm edit main.o kbd.o insert.o
Makefile 작성법
파일이 반복되는 경우 변수로 나타내 사용
Ex)
object = main.o kbd.o insert.o
edit : $(object)
gcc -o edit $(object)
main.o : main.c defs.h
kbd.o : kbd.c defs.h command.h
insert.o : insert.c defs.h buffer.h
# command가 없는 경우 make가 알아서 한다.
clean:
rm edit main.o kbd.o insert.o
# prerequisite가 없는 경우 밑에 명령만 수행한다.
고정 패턴 규칙
이름이 반복되는 경우 %를 사용한다.
Ex)
objects = foo.o bar.o
all : $(objects)
$(objects) : %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
==
all : foo.o bar.o
foo.o : foo.c
bar.o : bar.c
*
$* : 확장자가 없는 현재 타겟 파일 ($@ 에서 확장자만 지운 파일 이름)
$@ : 현재의 타겟 파일 (위의 예에서는 foo.o bar.o)
$< : 첫번째 prerequisite 이름 (위의 예에서는 foo.c bar.c
$? : 현재 타겟 파일보다 더 최근에 갱신된 모든 prerequisites 이름
$(objects) : %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
=> .c 파일이 수정되었을 때, .o CC 컴파일을 통해 목적 파일을 만든다.
==> $(CC) -c $(CFALGS) foo.c -o foo.o
==> $(CC) -c $(CFLAGS) bar.c -o bar.o
암묵적 사용되는 변수
변수 선언 없이 사용되는 변수들
=> 재 선언 없이 사용할 경우 디폴트 값이 들어가고. 크로스 컴파일 할 때는 반드시 새로 지정해 줘야 한다.
AR
=> ar(디폴트 값) 아카이브 관리 프로그램
AS
=> as(디폴트 값) 어셈블 컴파일러
CC
=> cc(디폴트 값) C 컴파일러
CXX
=> g++(디폴트 값) C++ 컴파일러
CFLAGS
=> 추가 C 컴파일러 flag
LDFLAGS
=> 링커를 부를 때 컴파일러에게 추가적인 flag
'프로그래밍 > Linux' 카테고리의 다른 글
[Linux]파일시스템 (1) | 2023.10.08 |
---|---|
[Linux]Debug (0) | 2023.10.08 |
[Linux]리눅스 컴파일 (0) | 2023.10.08 |
[Linux]리눅스 디렉토리 (트리 구조) (1) | 2023.10.08 |
[Linux]리눅스 커널 (0) | 2023.09.17 |