๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TIL (Today I Learned)/Linux

[Linux] make์™€ Makefile

728x90

make์™€ Makefile

make

  • SHELL์—์„œ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ข…์ข… ๋ณด์ด๋Š” make ๋ช…๋ น์–ด
  • Makefile์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ make๋งŒ ์น˜๋ฉด ์ปดํŒŒ์ผ์ด ์‹คํ–‰
  • ํŒŒ์ผ ๊ด€๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ
  • ํŒŒ์ผ ๊ฐ„ ์ข…์†๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ Makefile์— ์ ํžŒ ๋Œ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ช…๋ นํ•˜์—ฌ SHELL ๋ช…๋ น์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•œ๋‹ค.

make ์žฅ์ 

  • ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์  ๋ช…๋ น์˜ ์ž๋™ํ™”๋กœ ์ธํ•œ ์‹œ๊ฐ„ ์ ˆ์•ฝ
  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ข…์† ๊ตฌ์กฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ด
  • ๋‹จ์ˆœ ๋ฐ˜๋ณต ์ž‘์—… ๋ฐ ์žฌ์ž‘์„ฑ์„ ์ตœ์†Œํ™”

์˜ˆ์ œ diary_exe

image

3๊ฐœ์˜ c ํŒŒ์ผ์ด include ํ•  ํ—ค๋”ํŒŒ์ผ ์ƒ์„ฑ

1. diary.h

#include <stdio.h>
void memo();
void calendar();

2. ์žฌ๋ฃŒ๋กœ ์‚ฌ์šฉ ๋  CํŒŒ์ผ

vi memo.c
vi calendar.c
vi main.c
  • memo.c
    #include "diary.h"
    void memo(){
    printf("I'm function Memo \n");
    }
  • calendar.c
    #include "diary.h"
    void calendar(){
    printf("I'm function Calendar() \n");
    }
  • main.c
    #include "diary.h"
    int main(void){
    memo();
    calendar();
    return 0;
    }

    3. ์ƒ์„ฑ๋œ ํŒŒ์ผ ํ™•์ธํ•˜๊ธฐ

    image

๊ธฐ๋ณธ์ ์ธ ์ปดํŒŒ์ผ ๊ณผ์ •

  • gcc๋ฅผ ์ด์šฉํ•œ ์ปดํŒŒ์ผ

1. cํŒŒ์ผ์—์„œ object ํŒŒ์ผ ์ƒ์„ฑ

gcc -c -o memo.o memo.c
gcc -c -o calendar.o calendar.c
gcc -c -o main.o main.c

image

2. ๊ฐ object ํŒŒ์ผ์„ ๋ฌถ์–ด ์ปดํŒŒ์ผ์„ ํ†ตํ•ด diary_exe ์‹คํ–‰ํŒŒ์ผ ์ƒ์„ฑ

gcc -o diary_exe main.o memo.o calendar.o

image

3. ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ

image

  • ๊ธฐ์กด์˜ ์ปดํŒŒ์ผ ๊ณผ์ •์ด ์ง€๊ธˆ๊นŒ์ง€๋Š” 3๊ฐœ์˜ ํŒŒ์ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์ง€ ์•Š๋‹ค.
  • 3๋ฒˆ๋งŒ ๋ช…๋ นํ•ด ์ฃผ๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค.
  • ํ•˜์ง€๋งŒ 1,000,000๊ฐœ c ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด 100๋งŒ ๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Makefile์˜ ๊ตฌ์„ฑ

Makefile์˜ ๊ตฌ์กฐ

  • ๋ชฉ์ ํŒŒ์ผ(Target) : ๋ช…๋ น์–ด๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ
  • ์˜์กด์„ฑ(Dependency) : ๋ชฉ์ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์žฌ๋ฃŒ
  • ๋ช…๋ น์–ด(Command) : ์‹คํ–‰ ๋˜์–ด์•ผ ํ•  ๋ช…๋ น์–ด๋“ค
  • ๋งคํฌ๋กœ(Macro) : ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™” ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
CC = gcc

target 1 : dependency1 dependency2
        command1
        command2
target 2 : dependency3 dependency4
        command3
        command4

Makefile ์ž‘์„ฑ๊ทœ์น™

  • ๋ชฉํ‘œํŒŒ์ผ : ๋ชฉํ‘œํŒŒ์ผ์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋“ค
  • (tab)๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น1
  • (tab)๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น2
    • Makefile์— ์ •์˜ํ•œ string์œผ๋กœ ์น˜ํ™˜
    • ๋ช…๋ น์–ด์˜ ์‹œ์ž‘์€ ๋ฐ˜๋“œ์‹œ tab์œผ๋กœ ์‹œ์ž‘
    • Dependency๊ฐ€ ์—†๋Š” target๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

image

  • $ make clean ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  object ํŒŒ์ผ๋“ค๊ณผ ์ƒ์„ฑ๋œ ์‹คํ–‰ํŒŒ์ผ์ธ diary_exe๋ฅผ rm ๋ช…๋ น์–ด๋กœ ์ œ๊ฑฐ

  • $ make๋กœ ์‹คํ–‰

    image

๋งคํฌ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์ค‘๋ณต๋˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ ๋‹จ์–ด๋กœ ์น˜ํ™˜

์ž‘์„ฑ๊ทœ์น™

  • ์†Œ๊ด„ํ˜ธ๋‚˜ ์ค‘๊ด„ํ˜ธ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์•ž์— '$'๋ฅผ ๋ถ™์ธ๋‹ค.
  • ํƒญ์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ , :,=,#,"" ๋“ฑ ๋งคํฌ๋กœ ์ด๋ฆ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋งคํฌ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ์น˜ํ™˜๋  ์œ„์น˜๋ณด๋‹ค ๋จผ์ € ์ •์˜ ๋˜์–ด์•ผ ํ•œ๋‹ค.
CC = gcc
CFLAGS = -W -WALL
TARGET = diary_exe

$(TARGET) : memo.o calendar.o main.o
    $(CC) $(CFLAGS)  $(TARGET)  memo.o calendar.o main.o

memo.o : memo.c
    $(CC) $(CFLAGS) -o memo.o memo.c

calendar.o : calendar.c
    $(CC) $(CFLAGS) -o calendar.o calendar.c

main.o : main.c
    $(CC) $(CFLAGS) -o main.o main.c

clean :
    rm * .o diary_exe

๋‚ด๋ถ€ ๋งคํฌ๋กœ ์‚ฌ์šฉ

CC = gcc
CFLAGS = -W -Wall
TARGET = diary_exe
OBJECT = memo.o main.o calendar.o

all : $(TARGET)

.c.o :
    $(CC) $(CFLAGS) -c $<

$(TARGET) : $(OBJECT)
    $(CC) $(CFLAGS) -o $@ $^

clean :
    rm *.o diary_exe

image

์ฐธ์กฐ
๋ฉ๋ฉ๋ฉ make์™€ Makefile