makeFile

|

가장 기본

<target>: <prerequisite>
    <recipe>  # 앞에 무조건 탭!!
  • target
    • 작업의 제목
    • 보통 새로 만들어질 output filename으로 한다.
  • prerequisite
    • target을 실행시키기 전에 해야할 작업들
  • recipe
    • 실제 작업
    • 여러개를 가질 수 있다.

vi에서 tab을 강제하려면 ctrl+v 후 tab을 누르면 된다.

예시

hello: main.c
    g++ -o hello main.c
  • 위처럼 짠 이후, make hello를 하면
  • main.c가 수정되었는지 확인
    • 수정 안되어있으면 끝
    • 수정되었으면
      • g++ -o hello main.c를 수행

target을 지정하지 않을 경우

  • target을 지정하지 않고, make만 수행하면
    • Makefile의 가장 위의 target을 찾아서 수행

target명과 생성되는 file 이름이 다를 때

  • filename으로 build를 해야할지, 말아야할지 판단하므로, 계속 빌드됨.
  • 비효율적임

Phony target(유사 타겟)

hello: main.c
    g++ -o hello main.c
clean:
    rm -rf hello
  • Makefile을 위처럼 만들면 make clean으로 hello 파일을 지울 수 있다.
    • 이렇게 prerequisite없고, 그냥 지정된 명령을 수행하는 것을 Phony target이라 함.
  • 그런데 clean이라는 이름의 파일이 존재한다면?
    • target명으로 수행여부를 판단하기 때문에, make clean이 안먹는다.
  • 그래서 Phony를 쓰는 거였군!!
.PHONY:clean touch  # space로 각자를 구분..

hello: main.c
    g++ -o hello main.c
clean:
    rm -rf hello
touch:
    touch hello
  • 요렇게 하면 clean, touch에 대해서 Phony target으로 생각한다.

암묵적 룰

main.o: main.c

요렇게만 넣어도 자동으로 g++ -c main.c로 만들어준다. 이런 암묵적 룰은

  • *.c -> *.o
  • *.s -> *.o
  • *.p -> *.o 요런 것들이 존재한다고 한다.