make 함수의 개념과 종류

MySprtlty·2022년 7월 11일
0

make utility

목록 보기
9/12
post-thumbnail

🏷️함수

📌개념

  • make는 Makefile에서 사용할 수 있는 많은 함수를 제공한다.
  • 커널 소스 Makefile를 이해하려면, 최소한 어떤 함수가 있는지는 알아둬야 한다.
  • make 함수들은 이름을 듣는 순간, 기능을 추측하기 쉽다.
  • 단어를 단위로 동작하는 함수들이 많은데, 단어란 공백문자로 구분되는 문자 혹은 문자열이다.

📌함수 호출

  • $(함수명 인자1, 인자2, 인자3)형식으로 함수를 호출한다.
  • 인자는 ,(comma)로 구분한다.

🏷️함수의 종류

📌1) shell 명령 함수

1-1) $(shell 명령어)

  • shell함수는 인자로 넘긴 셸 명령을 수행한 후 결과를 리턴한다.
  • 🔍ex)
SOURCES = $(shell ls *.c)
echo:
	@echo $(SOURCES)

📌2) 문자열 관련 함수

2-1) 문자열 교체 함수

2-1-1) $(subst old, new, 문자열)

  • 🖇️cf. subst stands for substitute string
  • subst함수는 문자열에서 old를 발견하면 new로 교체한다.
  • 첫 발견 문자열이 아닌, old와 일치하는 모든 부분을 교체한다.
  • 🔍ex)
STR = $(subst are, is, My name are Troy)
echo:
	@echo $(STR)

2-1-2) $(patsubst pattern, new, 문자열)

  • 🖇️cf. patsubst stands for pattern substitute string
  • patsubst함수는 문자열에서 pattern을 발견하면 new로 교체한다.
  • 패턴에는 %기호가 사용될 수 있는데, 이는 공백과 탭을 제외한 모든 문자열을 의미한다.
    • 🖇️cf. 셸 와일드카드 *와 유사한 역할을 한다.
  • 🔍ex)
STR = $(patsubst %.c, %.o, main.c add.c sub.c)
echo:
	@echo $(STR)
  • 출력 결과는 main.o add.o sub.o가 된다.

2-1-3) $(매크로명:pattern=new)

  • 목표 문자열이 매크로로 정의되어 있을 경우, patsubst대신 $(매크로명:pattern=new)를 사용할 수 있다.
  • 매크로에 저장된 문자열에서 일치하는 pattern을 찾아 new로 교체한다.
  • :pattern사이에 공백이 있어선 안된다.
  • 🔍ex)
SOURCES = main.c add.c sub.c
STR = $(SOURCES:%.c=%.o )
echo:
	@echo $(STR)

2-2) 문자열 정렬 함수

2-2-1) $(sort 문자열)

  • sort함수는 인자로 오는 문자열에 대해 정렬을 수행한다.
  • 중복되는 문자열이 있다면 하나의 문자열로 통합하여 정렬한다.
  • 🔍ex)
STR = ddd bbb ccc bbb aaa
SORTED_STR = $(sort $(STR))
echo:
	@echo $(STR)
  • 출력 결과는 중복된 문자열인 bbb가 제거된 aaa bbb ccc ddd다.

2-3) 공백 문자 제거

2-3-1) $(strip 문자열)

  • strip함수는 문자열 앞뒤에 존재하는 공백문자를 없애고, 각 단어 사이의 공백문자를 하나로 만든다.
  • 🔍ex)
STR =   aa  bb  cc

all :
ifeq ($(strip $(STR)),aa bb cc)
	@echo "stripped."
else
	@echo "$(STR) is not stripped."
endif
  • STR<space><space>aa<space><space>bb<space><space>cc<space><space>으로 정의 되어 있다.
  • strip함수의 리턴값은 aa<space>bb<space>cc가 된다.

2-4) filtering 함수

2-4-1) $(filter pattern, 문자열)

  • filter함수는 pattern과 일치하는 문자열만 나오게 해준다.
  • 🔍ex)
FILES = add.c calc.h main.c sub.c asm.S
SOURCES = $(filter %.c %.S, $(FILES))
HEADERS = $(filter %.h, $(FILES))

echo:
	@echo $(SOURCES)
	@echo $(HEADERS)
  • 출력결과는 다음과 같다.
add.c main.c sub.c asm.S
calc.h

2-4-2) $(filter-out pattern, 문자열)

  • filter-out함수는 filter와 반대로 동작한다.
  • pattern과 일치하지 않는 문자열만 나오게 해준다.
  • 🔍ex)
FILES = add.c calc.h main.c sub.c asm.S
SOURCES = $(filter-out %.c %.S, $(FILES))
HEADERS = $(filter-out %.h, $(FILES))

echo:
	@echo $(SOURCES)
	@echo $(HEADERS)
  • 출력결과는 다음과 같이 filter함수와 정반대다.
calc.h
add.c main.c sub.c asm.S

2-5) 문자열 탐색 함수

2-5-1) $(findstring 탐색할 문자열, 문자열)

  • 문자열에서 탐색할 문자열을 찾는다.
  • 찾으면 탐색할 문자열을 리턴하고, 못찾으면 NUL문자를 리턴한다.
  • 🔍ex)
STR = aaa bbb ccc
echo:
	@echo $(findstring bbb, $(STR))

2-6) 단어 개수 리턴

2-6-1) $(words 문자열)

  • 문자열에 사용된 단어의 개수를 리턴한다.
  • 구분자는 당연히 공백문자다.
  • 🔍ex)
STR = aaa bbb ccc
echo:
	@echo $(words $(STR))
  • 출력값은 3이다.

2-7) 문자열 색인

2-7-1) $(word index, 문자열)

  • 단어 단위로 문자열 색인을 한다.
  • 🔍ex)
echo:
	@echo $(word 2, aaa bbb ccc ddd eee)
  • 두번 째 단어인 bbb가 출력된다.

2-7-2) $(wordlist 시작index, 끝index, 문자열)

  • 시작index끝index를 지정해서 단어 리스트를 뽑을 수 있다.
  • 🔍ex)
echo:
	@echo $(wordlist 2, 4, aaa bbb ccc ddd eee)
  • bbb ccc ddd가 출력된다.

2-7-3) $(firstword 문자열)

  • 첫번째 단어를 리턴한다.
  • 🔍ex)
echo:
	@echo $(firstword aaa bbb ccc ddd eee)
  • 첫번째 단어인 aaa가 출력된다.

2-8) 문자열 연결

2-8-1) $(join 앞 문자열, 뒷 문자열)

  • 앞 문자열의 단어와 뒷 문자열의 단어를 각각 연결한다.
  • 즉, 단어 단위로 결합한다.
  • 🔍ex)
echo:
	@echo $(join main asm, .c .S)
  • main+.casm+.S가 되어main.c asm.S이 출력된다.

3) 📌파일 이름 관련 함수

  • 🗽voca) suffix: 접미사
  • 🗽voca) prefix: 접두사

3-1) $(dir 문자열)

  • 문자열에서 디렉터리 부분만 추출한다.
  • 🔍ex)
PATHS = /home/rev/test.c /bin/ls /usr/bin/vim
echo:
	@echo $(dir $(PATHS))
  • 출력결과는 파일 부분을 제외한 /home/rev/ /bin/ /usr/bin/가 된다.

3-2) $(notdir 문자열)

  • dir함수와 반대로 문자열에서 파일 부분만 추출한다.
  • 🔍ex)
PATHS = /home/rev/test.c /bin/ls /usr/bin/vim
echo:
	@echo $(notdir $(PATHS))
  • 출력결과는 디렉터리 부분을 제외한 test.c ls vim가 된다.

3-3) $(suffix 문자열)

  • 확장자만 추출해낸다.
  • 🔍ex)
PATHS = /home/rev/test.c /home/rev/ss/test.sh /home/rev/test.o 
echo:
	@echo $(suffix $(PATHS))
  • 출력 결과는 .c .sh .o다.

3-4) $(basename 문자열)

  • .확장자를 제외한 순수한 파일명만 출력한다.
  • 🔍ex) /home/rev/test.c의 확장자를 제거한 순수한 파일명은 /home/rev/test다.

3-5) $(addsuffix 접미사, 문자열)

  • 문자열의 각 단어 뒤에 접미사를 붙인다.
  • 🔍ex)
$(addsuffix .c, main add sub)
  • main.c add.c sub.c를 리턴한다.

3-6) $(addprefix 접두사, 문자열)

  • 문자열의 각 단어 앞에 접두사를 붙인다.
  • 🔍ex)
$(addprefix /home/rev/, main.c add.c sub.c)
  • addprefix는 /home/rev/main.c /home/rev/add.c /home/rev/sub.c를 리턴한다.

4) 📌기타 유용한 함수

4-1) $(wildcard pattern)

  • 현재 디렉터리에서 pattern과 일치하는 파일 리스트를 뽑는다.
  • pattern에 bash wild card인 *가 사용 가능하다.
  • 🔍ex) $(wildcard *.c)를 하면, 현재 디렉터리에 존재하는 .c파일의 리스트를 리턴한다.

4-2) $(foreach 변수명, 대입 문자열, 확장 문자열)

  • 변수에 대입 문자열을 단어 단위로 대입한 후, 그 변수를 확장 문자열에서 사용한다.
  • 🔍ex)
SOURCES = $(foreach name, main add sub, $(name).c)

echo:
	@echo $(SOURCES)
  • 출력은 다음과 같다.
main.c add.c sub.c
  • 변수를 반드시 확장 문자열에서 사용할 필요는 없다.
  • 단, foreach함수 내에서 선언된 변수는 foreach 함수 내에서만 유효하다.

  • foreach함수는 wildcard함수와 함께 사용해 반복 확장할 때 유용하다.
  • 🔍ex)
TEXTFILES = $(foreach dir, Documents Desktop Downloads, $(wildcard $(dir)/*.txt))
echo:
	@echo $(TEXTFILES)
  • Documents, Desktop, Downloads 디렉터리 아래 텍스트 파일이 존재한다면 파일 리스트가 출력된다.

4-3) $(origin 매크로명)

  • origin함수는 인자로 지정한 매크로가 어떻게 정의된 매크로인지 관한 문자열을 리턴한다.

  • origin함수가 리턴하는 문자열의 의미는 다음과 같다.

    리턴한 문자열설명
    undefined정의되지 않은 매크로
    fileMakefile내에서 정의된 매크로
    environment환경 변수
    command linemake를 실행할 때, 실행인자로 정의한 매크로
    default내부 매크로
    environment override환경 변수
    automatic자동 매크로
    overrideoverride 매크로
  • 🔍ex)

echo:
	@echo $(origin CC)
  • CC는 내부 매크로므로default가 출력된다.

0개의 댓글