- Make 기반 빌드 시스템
- GNU Make 강좌
- gcc와 make 강좌
- make 명령에서 규칙이름이 주어지지 않는다면 Makefile 에서 가장 처음있는 규칙을 사용함 (아래의 경우 all)
CC = gcc
CFLAGS = -W -Wall
TARGET=test
all: $(TARGET)
$(TARGET) : test.o
$(CC) $(CFLAGS) -o $@ $^
%.o : %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o $(TARGET)| 기호 | 설명 |
|---|---|
| $@ | 현재 타켓의 이름 |
| $? | 현재 타겟보다 갱신된 의존성 목록 (확장자 규칙에서 사용불가) |
| $^ | 현재 타겟의 의존성 목록 (확장자 규칙에서 사용불가) |
| $< | 현재 타겟보다 갱신된 의존성 목록 (확장자 규칙에서만 사용가능) |
| $* | 현재 타겟의 의존성 목록 (확장자 규칙에서만 사용가능) |
| $% | 현재 타겟이 라이브러리 모듈일때, .o 파일에 대응되는 이름 |
| $(@F) | 현재 타겟의 파일명 |
| $(@D) | 현재 타겟의 디렉토리 경로 부분 |
| $(<F) | 현재 타겟의 의존성의 파일명 |
| $(<D) | 현재 타겟의 의존성의 디렉토리 경로 부분 |
test: 1.txt
@echo "현재 타겟:" $@
@echo "의존성 목록:" $?
@echo "======================"
@cat $?
1.txt:
@echo "TEST" > $@실행결과
현재 타겟: test
의존성 목록: 1.txt
======================
TEST
SRCS = $(whildcard *.c)
OBJS = $(SRCS:.c=.o)
all: test
test: $(OBJS)
$(CC) -o $@ $^- 각각의 명령어들은 새로운 쉘에서 실행됨
따라서 아래처럼 사용하면 현재 디렉토리의 모든 파일이 삭제됨 (
cd명령 따로rm명령따로 서로 다른 쉘에서 실행되기 때문)
del:
cd ./backup
rm -rf *그래서 다음과 같이 ; 사용하면 되길 되는데, 문제는 cd ./backup 명령이 실패할 경우(backup 폴더가 없을경우) 현재 디렉토리의 모든 파일이 삭제됨
del:
cd ./backup; rm -rf *따라서 다음과 같이 && 를 사용하면 됨
del:
cd ./backup && rm -rf *- 기본적으로 표준 출력으로 실행되는 명령어도 같이 출력되는데, 앞에
@를 붙이면 실행되는 명령어는 보이지 않음 (즉, 명령어 실행결과만 출력)
echo:
@echo "test!"- make는 명령의 종료상태코드(Exit status code)가 0이 아니라면 이후 동작을 수행하지 않고 실패로 종료하게 되지만
- 앞에
-를 붙이면 명령어가 실패하더라도 계속 진행함
skipable:
-cat temp.txt각 폴더내의 Makefile
OBJS = $(patsubst %c, %o, $(wildcard *.c))
CFLAGS = -I../include
all: $(OBJS)
cp -rf $^ ../
clean:
rm -rf *.c상위 디렉토리의 Makefile
- DIRS를 순회하며 재귀적 make
DIRS = lib1 lib2 main
OBJS = lib1.o lib2.o main.o
TARGET = myapp
all: objects
@for dir in $(DIRS); do \
make -C $$dir || exit $?; \
done
clean:
@for dir in $(DIRS); do \
make -C $$dir clean \
done \
-rm -rf *.o $(TARGET)- 서브 Makefile에 매크로를 전달하고 싶다면
export CC = gcc와 같은 형태로 export 키워드를 붙임
- ifeq .. else .. endif
- ifneq .. else .. endif
- ifdef .. else .. endif
- ifndef .. else .. endif
RESULT = $(shell cat result.txt)- 문자열 처리 (sort / 공백제거 / 필터링 등..)
- 파일 관련 등..