본문 바로가기
멀티코어 프로그래밍/Basic

Make / Makefile

by 기리의 개발로그 2022. 3. 30.

Make

  • makefile을 이용하여 프로그램을 자동으로 컴파일

  • 다수 소스 코드가 포함된 프로젝트에서 유용하게 사용


makefile 구조

  • 기본적으로 세가지 구조
    • 목표(Target)
    • 의존 관계(Dependency)
    • 명령(Command)
  • 라인에 #이 나오면 해당 라인의 그 이후는 무시
[Target]   [Dependency]

[Tab]      [Command]

[Tab]      [Command]

[Target]

  • 아래의 [Command]들이 실행되어 나온 결과 파일

[Dependency]

  • 여기 지정된 파일들이 존재하지 않거나 내용이 변하면 아래의 명령을 실행

[Tab] [Command]

  • make에 의해 실형되는 명령

  • 반드시 탭 문자로 공백을 넣어야 함

  • make 명령어로 실행


매크로

  • C언어의 변수와 유사하게 사용 가능

  • 특정 단어를 다른 구문으로 치환

  • 매크로 작성은 등호를 이용

    • ex) INCLUDE = -l/user/include
  • 매크로로 정의된 변수의 값을 사용

    • ex) $(INCLUDE)
  • 작성된 기존 매크로에 += 를 사용하여 내용 추가 가능

    • ex) INCLUDE += -l/user/local/include ----> INCLUDE = -l/user/include -l/user/local/include
  • 매크로의 '=' 이후에 아무런 문자열이 없는 매크로

  • 해당 매크로에는 NULL 문자열이 할당됨

  • 매크로를 정의하지 않고 사용하는 경우

  • 해당 매크로는 NULL 문자열로 치환됨

  • 같은 이름으로 정의된 여러 개의 매크로가 존재

  • 가장 마지막에 정의된 매크로를 이용하여 실행


커맨드라인에서 정의한 매크로

  • 커맨드라인에서 매크로를 정의할 수 있음

    • ex) make test DIR=/user/project
  • 여러 단어들로 구성된 매크로는 따옴표(" " 또는 ' ') 필요

    • ex) make test DIR="user/project user/project/lib"
  • 매크로를 make 명령어 이전에 정의 가능 (makefile에 매크로가 정의되어 있다면 적용되지 않는다)

    • ex) DIR="user/project user/project/lib" make test

make 내부에 정의된 매크로

  • $@ : [Target]으로 하는 이름
    • ex) test: main.o foo.o bar.o
    • gcc -o $@ main.o foo.o bar.o
  • $* : [Target]으로 하는 이름에서 확장자를 뺀 이름
    • ex) main.o: main.c main.h
    • gcc -c $*.c
  • $< : [Dependency] 열거된 이름 중 첫 번째 이름
    • ex) bar.o: bar.c bar.h
    • gcc -c $< (bar.c)
  • $^ : [Dependency] 에 존재하는 모든 이름
    • ex) test: main.o foo.o bar.o
    • gcc -o $@ $^ (main.o foo.o bar.o)

매크로 사용 예

옵션

-c [Directory]

  • 현재 디렉토리에서 makefile을 읽지 말고 [Directory]로 이동

    • ex) tt/makefile 일때, make -c tt ----> cd tt; make; cd ..

-d

  • make 수행 중 각종 정보 출력

  • 파일로 출력하여 make의 동작 확인 가능


-f [File]

  • makefile이 아닌 [file] 을 makefile로 취급하여 컴파일

    • ex) make -f mymakefile

-v

  • make의 버전 출력


헤더 파일 의존 관계 생성

  • gcc 컴파일러의 옵션 (-M)을 통해 의존파일의 리스트 작성 가능
    • ex) gcc -M test1.c


make를 이용한 프로젝트 관리

  • make를 makefile에서 명령어로 사용
  • 대부분의 프로젝트에서는 소스 파일을 계층 구조로 구성
  • 디렉토리 계층 구조를 통한 make 과정
  • 각 하위 디렉토리에 별도의 makefile 존재
  • 마스터 makefile에서 각 하위 디렉토리의 makefile을 재귀적으로 실행
반응형

'멀티코어 프로그래밍 > Basic' 카테고리의 다른 글

프로세스와 스레드  (21) 2022.04.04
스레드 스케줄링  (29) 2022.03.31
gcc 컴파일러  (13) 2022.03.29
프로파일링  (13) 2022.03.28
GDB 명령어  (13) 2022.03.27

댓글