[완료]초보적인 Makefile 해석입니다. (근데 잘 모르겠어요)

daigerlee의 이미지

우선적으로 지금 하고 있는 일에 관해서 말씀 드려야 겠네요

요즘에 한빛미디어에서 나온 "리눅스 커널 프로그래밍"이라는 책으로 공부를 하고 있는데요

거기서 chapter 5장에 나오는 "문자디바이스 드리아버" 만들기 예제를 하고 있습니다.

그럼 여기서 질문이 있는데 makefile에서 2.6기준으로 작성된 것입니다.
여기서 exam은 문자디바이스를 작성한 것이고, use_exam은 작성한 문자디바이스를 이용하는 것입니다.

즉 exam.ko를 만들어야 하고 use.exam이라는 파일을 만들어야 한다는 것이죠.

자.... 질문들어갑니다.

1 KERNELDIR = /lib/modules/$(shell uname -r)/build
2
3 obj-m = exam.o
4
5 TARGETS = use_exam
6
7 KDIR := /lib/modules/$(shell uname -r)/build
8 PWD := $(shell pwd)
9
10 default: $(TARGETS)
11 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
12
13 CC := /usr/bin/gcc
14
15 %.c%:
16 $(CC) -o $@ @^
17
18 clean:
19 rm -rf *.ko
20 rm -rf *.mod.*
21 rm -rf .*.cmd
22 rm -rf *.o
23

10 default: $(TARGETS)
11 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

여기서 해석(치환)을 하면 ------------------
default: use_exam
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
요렇게 되는데 그렇게 되면 use_exam.ko가 만들어져야 하지 않을까 생각합니다. 물론 결과물을 보면 생각대로 안되지만요~~

13 %.c%:
14 $(CC) -o $@ @^
그리고 여기서는 모든 .c파일을 gcc로 컴파일 하게 되는데 exam은 그냥 피해가는게 의문이고요~~~~~

많은 makefile 해석하는 문서들을 봤는데 2.6기준의 모듈컴파일하는 해석은 어떻게 되는지 나온것을 잘 못봤어요. 그리고 지금 위에서 드리는 저의 의문이 풀리지 않구요~

혹 지나가시는 고수님들 한번 웃으면서 답해주세요~~~ 제발~~~~ :)

좋은 하루되세요~~~~

bushi의 이미지

12 행 이후의 것들은 없어도 됩니다. 아니... 없어야 마땅합니다.
SUBDIRS= 대신 M= 으로 고쳐도 됩니다. 아니.. 고쳐야 마땅합니다.

이상없이 컴파일이 진행됐다면 exam.ko 가 만들어 집니다.

커널의 kbuild 시스템을 시작하기 위한 스크립트라 보셔도 큰 무리가 없습니다.

Makefile 에

obj-m = exam.o

라 한 줄만 적어주고, shell 에서
make -C /lib/modules/`uname -r`/build M=`pwd` modules

라고 실행하는 것을 편의상 Makefile 하나에 때려넣었다고 생각하시면 이해가 되실 겁니다.
(해보면 아시겠지만 modules_install, clean 등등도 가능합니다. distclean 은 하지마시고요.)

실제로, 2.4 커널때는 위 처럼 나눠서 쓰지 않으면 곤란한 상황이 더러 있었습니다.
(이때는 M 이 없었고 SUBDIRS 만 사용가능했었습니다. 약간 변칙적이었죠.)

2.6 커널에서 공식적으로 extra 빌드를 지원하기 시작한 후 M 이 추가되었는데,
2.4 커널처럼 SUBDIRS 를 사용해서 외부모듈을 빌드하려 할 경우, 원래는 경고문이 나왔었습니다.
언제부턴가 이 경고문이 나오지 않더군요. 사람들을 설득하기에 지쳤는지... 내부적으로 어떻게 해결을 한 모양입니다.
그렇다해도 SUBDIRS 보다는 M 을 사용하는 습관을 처음부터 들이세요.

2.4 커널 시절에 나온 허술한 책들 때문에 한참 귀찮았는데,
2.6 커널이 나온 시점에서도 또 이렇게 허술한 책들이 나오는군요.

OTL

daigerlee의 이미지

근데 아직 저의 질문은 해결해주시지 않았군요.

매크로를 defult에 대입을 하였는데도 use_exam.ko가 만들어지지 않고 넘어간 것이 궁금하고, %.c%:에서는 exam.c를 실행파일로 만들어지지 않은점이 궁금합니다.

그리고 %.c%:는 필요하다고 생각합니다. 왜냐하면 실행파일을 생성시켜야 하기 때문입니다.

''@ 답변을 해주셔서 이 글을 볼지는 모르겠지만~~ ㅎㅎ

bushi의 이미지

GNU make 매뉴얼보시고, 커널의 kbuild 스크립트들을 보셔야겠습니다. 대강의 흐름정도만이라도.

kbuild 가 동작해서 .ko 를 만들어내려면 싫든 좋든 obj-m = 에 오브젝트(들)을 적어줘야 합니다.

default 에 $(TARGETS) 라는 의존성이 걸렸습니다.
default 에 대한 액션을 취하기 전에 $(TARGETS) 항목을 찾아서 먼저 처리합니다.

$(TARGETS) 는 use_exam 이었습니다.
$(TARGETS): 라는 항목도 없고 use_exam: 이란 항목도 없습니다.

이런 경우 기본적으로
$(CC) $(CFLAGS) use_exam.c -o use_exam
로 동작해서 use_exam 이란 실행파일을 만들어냅니다.

만약 $(TARGETS) 가 use_exam.o 였다면,
$(CC) $(CFLAGS) -c -o use_exam.o use_exam.c
로 동작해서 use_exam.o 라는 오브젝트를 만들어냅니다.

%.c%:
라는 정체불명, 의도불명의 항목이 도대체 뭣에 필요하단 말인가요.

OTL

daigerlee의 이미지

감사합니다. :)

TARGETS 에 대한 의문은 풀렸습니다.

10 default: $(TARGETS)
11 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
즉 10줄과 11번줄은 종속적인 관계가 아닌 독립적인 것이군요

제가 이해한것이 맞다면
* default: $(TARGETS) <------- 이건 default : use_exam 이되고 이것은 기본적인 매크로로 인해 gcc -o use_exam use_exam.c 로 실행이 되고
*kbuild를 하기 위해서 써둔 obj-m = exam에의해 11번줄에 대입이 되어서...(아직 어떻게 대입이 되는지는 커널 kbuild스크립트를 보지않아서 잘 모르겟지만요 ..;;) 실행이 되어 exam.ko가 생성이 되는군요~~~

요거 " %.c%: "
처음에 제 친구도 이건 무슨뜻인지 모르겠다고 했었고, "bushi"님께서 지적하셔서 이 책의 저자의 습관이라고 생각이 되었습니다. 그러다나 "bushi"님의 충고로 GNU make 메뉴얼을 보면서 우연히 발견한 %에 대한 정의가 나오더군요

<출처> http://www.gnu.org/software/make/manual/make.html

Each pattern normally contains the character `%' just once. When the target-pattern matches a target, the `%' can match any part of the target name; this part is called the stem. The rest of the pattern must match exactly. For example, the target foo.o matches the pattern `%.o', with `foo' as the stem. The targets foo.c and foo.out do not match that pattern.

The prerequisite names for each target are made by substituting the stem for the `%' in each prerequisite pattern. For example, if one prerequisite pattern is %.c, then substitution of the stem `foo' gives the prerequisite name foo.c. It is legitimate to write a prerequisite pattern that does not contain `%'; then this prerequisite is the same for all targets.

`%' characters in pattern rules can be quoted with preceding backslashes (`\'). Backslashes that would otherwise quote `%' characters can be quoted with more backslashes. Backslashes that quote `%' characters or other backslashes are removed from the pattern before it is compared to file names or has a stem substituted into it. Backslashes that are not in danger of quoting `%' characters go unmolested. For example, the pattern the\%weird\\%pattern\\ has `the%weird\' preceding the operative `%' character, and `pattern\\' following it. The final two backslashes are left alone because they cannot affect any `%' character.

Here is an example, which compiles each of foo.o and bar.o from the corresponding .c file:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

아직 kbuild에 관련된건 아직 못찾아서 더 읽어보고 질문드릴께요~~~

좋은 하루되시구 이렇게 답변해 주신거 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.