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 무식자여~~~
당신은 이제까지 뭘했단 말인가????
무식자~~~
그냥 타겟만 있으면 되는거네~~
음..그렇다면 타겟이 있으면..
현재디렉토리의 모든 소스 파일을 알아서 컴파일 해주는 것인가?
확인해보자…
새로운 c소스 파일을 만든다.
그리고...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