Makefile 작성 도와주세요.

thisrule의 이미지

현재 디렉토리 하위에 aaa, bbb라는 두개의 서브 디렉토리가 있고,
aaa아래에 여러 C source파일이 있고, bbb아래에도 그렇습니다.
현재 디렉토리에서

Quote:
make aaa
하면 aaa디렉토리에 있는 C program들이 compile되고,
Quote:
make bbb
하면 bbb디렉토리에 있는 C program들이 compile되게 하려 합니다.

그래서 예로 각 디렉토리에 main.c 만 있다고 생각하고 아래와 같이 작성하였습니다.

aaa: TDIR=aaa
aaa: VPATH=aaa
aaa: main.o
    gcc -o main main.o

bbb: TDIR=bbb
bbb: VPATH=bbb
bbb: main.o
    gcc -o main main.o

%.o: %.c
    gcc -o $@ -c $<

clean:
    -rm aaa/*.o bbb/*.o

그런데 잘 동작하지 않습니다.
지적해 주세요.
쿨링팬의 이미지

thisrule의 이미지

쿨링팬 wrote:
http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html

도움이 되실겁니다.

GNU 홈피의 make manual site를 뒤지다 힘들어 질문드린건데...
말씀하신 곳에선 제가 원하는답을 찾을 수 없었습니다.
쿨링팬님께선 위 사이트에서 답을 찾거나 힌트가 있어서 제게 추천해주신건가요?
wariua의 이미지

make: *** No rule to make target 'main.o', needed by 'aaa'. Stop.

메시지의 원인만을 말씀드리자면, Makefile 규칙에서 명기된 파일들의 경로가 올바르지 않기 때문입니다.
...
aaa: aaa/main.o 
    gcc -o aaa/main aaa/main.o 

...
bbb: bbb/main.o 
    gcc -o bbb/main bbb/main.o 
...

로 하면 됩니다.

$PWD `date`

쿨링팬의 이미지

Quote:
말씀하신 곳에선 제가 원하는답을 찾을 수 없었습니다.
쿨링팬님께선 위 사이트에서 답을 찾거나 힌트가 있어서 제게 추천해주신건가요?

그럼요.

Makefile 하나에다가 다 넣으려고 하면, 어떤 경우에는 힘이 듭니다.
각 서브 디렉토리에 Makefile을 넣고, 최상위 디렉토리에서 서브 디렉토리로 들어가서 Makefile을 수행하고, 끝나면 다시 나오고 하는 방법이 수월할 때도 있습니다.

thisrule의 이미지

wariua wrote:
make: *** No rule to make target 'main.o', needed by 'aaa'. Stop.

메시지의 원인만을 말씀드리자면, Makefile 규칙에서 명기된 파일들의 경로가 올바르지 않기 때문입니다.
...
aaa: aaa/main.o 
    gcc -o aaa/main aaa/main.o 

...
bbb: bbb/main.o 
    gcc -o bbb/main bbb/main.o 
...

로 하면 됩니다.

각 rule에서 디렉토리명을 적지 않으려고 VPATH를 설정했습니다.
Make manual에 보면 VPATH에 설정된 디렉토리 아래의 모든 파일에 대하여
rule이 적용된다 하기에 사용하였는데 어떨땐 되고 어떨땐 안되기에 질문드렸습니다.
아래는 make manual에서 발췌한 내용입니다.
Quote:
For example,
VPATH = src:../headers
specifies a path containing two directories, `src' and `../headers', which make searches in that order.
With this value of VPATH, the following rule,
foo.o : foo.c
is interpreted as if it were written like this:
foo.o : src/foo.c
assuming the file `foo.c' does not exist in the current directory but is found in the directory `src'.
쿨링팬의 이미지

aaa: TDIR=aaa
aaa: VPATH=aaa
aaa: main.o
    gcc -o main main.o

bbb: TDIR=bbb
bbb: VPATH=bbb
bbb: main.o
    gcc -o main main.o

%.o: %.c
    gcc -o $@ -c $<

clean:
    -rm aaa/*.o bbb/*.o

위 코드에서 'aaa', 'bbb'라는 target이 세 번 쓰였습니다.
이런 경우 앞의 두 개는 무시됩니다.

그러면,

aaa: main.o
    gcc -o main main.o

이를 수행하게 되는데, dependency가 main.o 입니다.

%.o: %.c
    gcc -o $@ -c $<

여기를 찾아가지만, 앞서 무시된 구문에 VPATH가 있기 때문에 파일을 찾을 수 없어서 수행이 되지 않는 것입니다.

VPATH의 문제가 아니라, Makefile의 target, dependency, command의 잘못된 사용으로 인한 결과입니다.

여러 개의 sub-directory에 들어있는 file들을 효과적으로 compile할 수 있는 방법이 recursive make방법이며, 이는 앞서 제가 언급한 문서에 자세히 설명되어 있습니다.

도움이 되셨길 바랍니다.

wariua의 이미지

결국 aaa target에 대한 dependency 확인이 수행되기 '전에' VPATH를 "aaa"로 설정해 줄 수 있는 적당한 방법이 없어서 그런 것 같은데요... 디렉터리 별로 Makefile을 만드는 것이 정히 싫으시면

...
aaa: objclean
    TDIR=aaa VPATH=aaa make aaa2

aaa2: main.o
    gcc -o main main.o
...
objclean:
    -rm main.o

식으로도 가능하겠습니다. aaa의 dependency에 objclean을 추가한 건, main.o가 aaa/main.c에서 만들어진 것인지 bbb/main.c에서 만들어진 것인지 확인할 방법이 없으므로 무조건 지우고 새로 만들게 하기 위한 것입니다.

좀 아름답지 못하다는 느낌이기는 합니다만, 잠깐 쓰는 소스에서 사용을 좀 편하게 하기 위한 거라면, 까이꺼, 제대로 동작만 하면 되지요~ :wink: (하지만 이 정도가 돼버리면 차라리 각 target별로 디렉터리를 지정해 주는 게 타이핑 양이 더 적을 것 같은... 쿨룩;; )

$PWD `date`

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.