Git, CocoaPods, Xcode, Shell

[Shell] ShellScript, Makefile, make (쉘 프로그래밍)

jake-kim 2023. 3. 27. 01:42

Make

  • 원래는 실행파일을 생성하는 도구이지만 shell script와 같이 사용하면 script들을 쉽게 관리할 수 있기 때문
    • 실행파일의 생성: source code(사람이 읽을 수 있는 코드) 컴파일을 통해 -> object file(기계가 읽는 바이너리 파일) -> exec file
  • 원래는 .c 파일을 컴파일하고 자동화할때 유용하게 사용할 수 있는 GNU의 한 종류
    • c 를 컴파일할때 변경된 부분만 재컴파일하여 효율적인 컴파일러
  • Makefile은 또 여러가지의 source code를 묶어서 하나의 exec 파일로 만들수 있는 장점도 존재
  • makefile을 잘 활용하면 build script를 만들었을때 이 build script를 실행하기에 매우 유용한 도구

ShellScript가 있을때 Make와  같이 사용할때의 장점

  • ShellScript만 가지고도 원하는 일들을 수행할 수 있지만, Makefile은 조금 더 체계적이기 때문에 처음오는 개발자라도 script의 내용들을 파악하기 용이
  • make -j 를 사용하면 병렬적으로 실행도 가능
  • 만약 사용자로부터 하나의 입력을 받고, 그 입력 값을 여러개의 shell script에 그대로 넣고 실행하고 싶은 경우, make에서 값을 받아서 여러개의 shell script를 실행하도록하면 매우 쉽게 사용이 가능

Make 사용 방법

  • Makefile 생성
$ vi Makefile
  • 내용 입력
    • Makefile은 .PHONY 키워드로 타겟 이름을 설정
    • .PHONY 키워드: '가짜'라는 단어의 포니는, 해당 디렉토리에 test라는 중복된 이름이 있어도 PHONY에 명시된 이름을 실행하게끔하고 성능이 더 좋음
    • shell의 명령어는 앞에 골뱅이를 붙여서 사용
# Makefile

.PHONY: test
test:
    @echo "this is test"
  • 위 test를 실행할땐 terminal에서 make test로 입력
% make test
this is test
  • 변수 입력
    •  입력은 그냥 키워드 없이 간편하게 =으로 선언
    • 사용할땐 ${}로 사용
abc = this is test

.PHONY: test
test:
    @echo ${abc}
  • 미리 정해진 매크로 상수
    • $@: 현재 target의 이름
abc = this is test

.PHONY: test
test:
	@echo ${abc}
	@echo 현재 target의 이름: $@

결과) 

% make test
현재 target의 이름: test
  • 만약 타겟을 여러개 실행시키고 싶은 경우, PHONY를 활용하면 매우 쉽게 사용이 가능
    • 예제를 위해서 test2 타겟 추가
abc = this is test

.PHONY: test
test:
    @echo ${abc}
    @echo 현재 target의 이름: $@

.PHONY: test2
test2:
    @echo "this is test2"

 

  • 밑에 all이라는 변수를 만들고 콜론으로 위 타겟들을 띄어쓰기 기준으로 나열한 후 .PHONY로 설정하면 커맨드 라인에서 사용 가능
abc = this is test

.PHONY: test
test:
    @echo ${abc}
    @echo 현재 target의 이름: $@

.PHONY: test2
test2:
    @echo "this is test2"

# 이 부분 추가
all: test test2
.PHONY: all

결과) make all로 실행 가능

% make all
this is test
현재 target의 이름: test
this is test2

* 참고

https://sodocumentation.net/makefile/topic/5542/-phony-target

https://www.gnu.org/software/make/