■Makefile



*makefile 은 Rule로 이루어져 있다.


target : dependencies

<tab>command

target : command 부분이 실행되어 나온 결과 파일

dependencies : target을 만들기 위해 사용되는 파일

command : command의 시작은 반드시 tab후 명령어 사용


*기본 예제


//    bar.c    //

#include <stdio.h>


void bar(void)

{

printf("Good bye, my love \n");

}


//    foo.c    //

extern void bar(void);

int main(void)

{

bar();

return 0;

}

//    makefile    //

baz:foo.o      bar.o

gcc -o baz foo.o bar.o


foo.o:foo.c

gcc -c foo.c


bar.o:     bar.c

gcc -c bar.c



clean:

rm -f baz foo.o bar.o

# ./baz 

Good bye, my love 



*매크로와 라벨


# ls

func1.c  func2.c  io.h  main.c  makefile



//    func1.c    //

#include <stdio.h>


void func1()

{

printf("this is function1 program\n");

}


//    func2.c    //

#include <stdio.h>


void func2()

{

printf("this is function2 program\n");

}


//    main.c    //

#include <stdio.h>
#include "io.h"

int main()
{
printf("this is main program\n");
func1();
func2();
return 0;
}

//    makefile    //           

OBJECTS= main.o func1.o func2.o

TARGET= makeprog


$(TARGET): $(OBJECTS)

gcc -o $(TARGET) $(OBJECTS)


main.o: main.c

gcc -c main.c


func1.o: func1.c

gcc -c func1.c


func2.o: func2.c

gcc -c func2.c


clean:

rm -f $(TARGET) $(OBJECTS)


/*

매크로를 사용할때는 $() 사용

미리 정의된 매크로도 있다. 예)CC = gcc




OBJECTS= main.o func1.o func2.o

TARGET= makeprog

CC= gcc                                     //(CC : Macro)

CFLAGS= -c                                //c파일을 컴파일(CFLAGS : flag)

makeprog: $(OBJECTS)

$(CC) -o $(TARGET) $(OBJECTS)


main.o: main.c

$(CC) $(CFLAGS) main.c


func1.o: func1.c

$(CC) $(CFLAGS) func1.c


func2.o: func2.c

$(CC) $(CFLAGS) func2.c


clean:

rm -f $(TARGET) $(OBJECTS)


*/


*확장자 사용

.SUFFIXES = .c .o                            =>make가 어느확장자를 가진 파일들을 처리할 것인가

OBJECTS= main.o func1.o func2.o

SRCS= main.c func1.c func2.c

TARGET= makeprog

CC= gcc

CFLAGS= -g -c


$(TARGET):      $(OBJECTS)

        $(CC) -o $(TARGET) $(OBJECTS)


.c.o :

        $(CC) $(CFLAGS) $<                    =>확장자 규칙을 직접 구현


clean:

        rm -f $(TARGET) $(OBJECTS) core


main.o: io.h main.c

func1.o: io.h func1.c

func2.o: io.h func2.c



/*
직접구현이 안되어있을 때는 
밑에와 같이 자동으로 해준다.
.c.o : 
$(CC) $(CFLAGS) -c $< -o $@
*/

/*
$@ : target
$* : 확장자가 없는 target
$< : dependency 중 최근에 갱신된 파일
*/


+ Recent posts