Makefile…을 만들고….

이놈을 이용해서 빌드하자…



핵심요소는


obj-y +=


이놈이다…



obj-y


obj-y


obj-y


이놈이 핵심이다.


이 키워드가 있어야….


make가 …………

빌드를 한단다…


실험해보자~~!!!


실험 개시~~!!!


test.c 파일 만들고

#include <stdio.h>


void main()

{

printf("test^___^\n");

}




Makefile 파일 만들고~~!


obj-y += test.o



자…~~


make를 해보자~~!



[root@localhost test001]# make

make: *** 타겟 없음.  멈춤.



뭐시기~~~????

타겟이 없어???


타겟을 지정해줘야 하는겨??



그런데 ‘타겟’이 뭐지?


이건가?



test:

obj-y += test.o


자….

대충 해보는 거야~~

뭐~~


다시 make~~!!


[root@localhost test001]# make

cc     test.c   -o test

오~~오~~

에러 안났어~~~

에러 없어…~~~!!

맞았어…


내 예측이 맞았어~~!


천재 천재~~~~~~!!!


[root@localhost test001]# ls -la

합계 24

drwxr-xr-x.  2 root root 4096 11월 20 18:48 .

drwx------. 18 test test 4096 11월 20 18:30 ..

-rwxr--r--.  1 root root   22 11월 20 18:48 Makefile

-rwxr-xr-x.  1 root root 7336 11월 20 18:48 test

-rwxr--r--.  1 root root   61 11월 20 18:31 test.c




test라는 실행파일이 생겼습니다.

오 그런데...object파일은 왜 없지?

지웠나?;;;스스로 지웠나???

암튼…

실행해보자…



[root@localhost test001]# ./test

test^___^



오~~오~~

정확히 찍히네~~~



obj-m


으로 해볼까???



test:

obj-m += test.o


음..obj-m 으로 해도 make 잘되네~~!


[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# ls -la

합계 24

drwxr-xr-x.  2 root root 4096 11월 20 18:59 .

drwx------. 18 test test 4096 11월 20 18:30 ..

-rwxr--r--.  1 root root   22 11월 20 18:58 Makefile

-rwxr-xr-x.  1 root root 7336 11월 20 18:59 test

-rwxr--r--.  1 root root   68 11월 20 18:59 test.c

[root@localhost test001]# ./test

test^_____^




obj-m으로 해도 ...make 잘된 화면입니다.~~~

믿어주세요~~!


그런데…

드라이버 파일은…

타겟이 없는데 어떻게 make가 되는 거지?

왜? 에러가 없지?


자 보시라… 커널 속….Makefile 을~~



[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# ls -la

합계 24

drwxr-xr-x.  2 root root 4096 11월 20 18:59 .

drwx------. 18 test test 4096 11월 20 18:30 ..

-rwxr--r--.  1 root root   22 11월 20 18:58 Makefile

-rwxr-xr-x.  1 root root 7336 11월 20 18:59 test

-rwxr--r--.  1 root root   68 11월 20 18:59 test.c

[root@localhost test001]# ./test

test^_____^





자 이제


obj-n


으로 해보자~~


test:

obj-n += test.o

make가 될까?

obj-n


뭐야???

그냥 make되잖아~~!!!

뭐여????


[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# ls -la

합계 24

drwxr-xr-x.  2 root root 4096 11월 20 19:28 .

drwx------. 18 test test 4096 11월 20 18:30 ..

-rwxr--r--.  1 root root   22 11월 20 19:27 Makefile

-rwxr-xr-x.  1 root root 7336 11월 20 19:28 test

-rwxr--r--.  1 root root   71 11월 20 19:27 test.c

[root@localhost test001]# ./test

test^________^

실행도 아주 잘됩니다~~~



obj-X

X의 의미는 뭐야???


아니 이런….

굳이….

obj-n


obj-y obj-m objn 같은것은

필요엢네요…


왜냐고요???

이렇게 하고 실험했으니까요…

Makefile을 이렇게 했어요

test:


타겟만 적고..어떤 파일을 빌드하라고 하는 말은 안한거죠~~!


그랬더니…


[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# ./test

test^_____________^



빌드 아주 잘됩니다.

아니 이런…

아니 이런….

Makefile 무식자여~~~


당신은 이제까지 뭘했단 말인가????

무식자~~~


그냥 타겟만 있으면 되는거네~~


음..그렇다면 타겟이 있으면..

현재디렉토리의 모든 소스 파일을 알아서 컴파일 해주는 것인가?

확인해보자…


  1. 새로운 c소스 파일을 만든다.

  2. 그리고...make 해본다…



[root@localhost test001]# ls -la

합계 28

drwxr-xr-x.  2 root root 4096 11월 20 19:40 .

drwx------. 18 test test 4096 11월 20 18:30 ..

-rwxr--r--.  1 root root    7 11월 20 19:35 Makefile

-rwxr-xr-x.  1 root root 7336 11월 20 19:36 test

-rwxr--r--.  1 root root   85 11월 20 19:41 test.c

-rwxr--r--.  1 root root   75 11월 20 19:40 test001.c

[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# cat test001.c

#include <stdio.h>


test()

{

       printf("I am test001.c's function~!");

}

[root@localhost test001]# make

make: 'test' is up to date.

[root@localhost test001]# touch test.c

[root@localhost test001]# make

cc     test.c   -o test

[root@localhost test001]# ^C




음...아니라는 점~~

뭐가 아닌가????

디렉토리의 모든 소스파일을 알아서 절대~~

절대~~

컴파일 해주지 않는다는점~~~~!!!

뭐냐???


위에서 보시면 아시겠지만…

test.c만 컴파일 했다는 점..~~

test001.c 는 그냥 무시했다는 점~~~~;;;;;

뭐지???


그럼… test001 이라는 타겟을 만들면 되나??


자..test001: 타겟 집어 넣었어~~

자~~


[root@localhost test001]# make

make: 'test' is up to date.

[root@localhost test001]# touch test.c

[root@localhost test001]# touch test001.c

[root@localhost test001]# make

cc     test.c   -o test




해도 소용 없다는 점~~;;;;;

여전히 test.c만 컴파일 한다는 점???

뭐야???

도대체


뭐야???

모르겠다…

컴파일의 기준을…

그러면…

test: 라는 라벨을 없애버리겠어~~!


음…

test001:만 남기니…

음…

test001.c 만 컴파일 하는군요…

즉 처음 나온타켓의 소스만 찾아서 컴파일하는 결론이 나오는 군요~~;;



[root@localhost test001]# touch test.c

[root@localhost test001]# touch test001.c

[root@localhost test001]# make

cc     test001.c   -o test001

test001.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]

test()

^

/usr/lib/gcc/i686-redhat-linux/5.1.1/../../../crt1.o: In function `_start':

(.text+0x18): undefined reference to `main'

collect2: error: ld returned 1 exit status

<builtin>: recipe for target 'test001' failed

make: *** [test001] Error 1

보이시죠~~^_^(일단 에러는 무시해주세요~~지금은 make는 누구를 컴파일 하는냐 테스트니~~)

타켓이 test001이니

test001.c 만 컴파일 했습니다.

그리고, main()함수가 test001.c에는 없느니..에러를 뱉어내십니다.




[참고해야할 곳~~]

http://developinghappiness.com/?page_id=222

http://developinghappiness.com/?page_id=222

















+ Recent posts