Makefile내 접미어 규칙 관련 질문드립니다.

thisrule의 이미지

Makefile내 접미어 규칙을 아래와 같이 정의하였습니다.

Quote:
.SUFFIXES: .c .o
.c.o:
$(CC) $(INCPATH) -c $< -o $@

그랬더니 현재 디렉토리에 있는 .c 파일에 대하여 위 규칙이 적용되었습니다.
그런데 전 현재 디렉토리가 아닌 다른 디렉토리에 있는 .c 파일에 대하여도
위 규칙을 적용하고 싶습니다.
예를들어 ../common 이란 디렉토리에 있는 .c 파일에 대하여도 위 규칙을 적용하여 object 파일만 현재 디렉토리에 생성되게 하고 싶습니다.
무슨 방법이 있을까요?
codebank의 이미지

뭐 간단히

.SUFFIXES: .c .o
.c.o:
    $(CC) $(INCPATH) -c $< -o $@
    cd ../common
    $(CC) $(INCPATH) -c $< -o ../src/$@

정도로 하면 되지 않을까요?
음... 현재 디렉토리를 src로 봤을때...
(그냥 생각난대로 써서 안될 수도 있을겁니다만... 한번 해보세요. :))

다른 프로그램의 Makefile을 참조해 보는것도 좋겠죠.
(nabi에 위와 비슷한게 있어서... :))

------------------------------
좋은 하루 되세요.

thisrule의 이미지

codebank wrote:
뭐 간단히
.SUFFIXES: .c .o
.c.o:
    $(CC) $(INCPATH) -c $< -o $@
    cd ../common
    $(CC) $(INCPATH) -c $< -o ../src/$@

정도로 하면 되지 않을까요?
음... 현재 디렉토리를 src로 봤을때...
(그냥 생각난대로 써서 안될 수도 있을겁니다만... 한번 해보세요. :))

다른 프로그램의 Makefile을 참조해 보는것도 좋겠죠.
(nabi에 위와 비슷한게 있어서... :))


저도 처음엔 그렇게 했는데 잘 안되서 질문을 드린겁니다.
예를들어 현재 디렉토리명이 src이고 그 안에 a.c, b.c가 있고, ../common/com.c 가 있을 경우
a.c, b.c는 compile이 되는데 com.c가 compile되지 않습니다.
즉, 접미어규칙(확장자규칙 이라고도 하더군요)이 적용되는 범위가 현재 디렉토리외에는 적용되질 않습니다.
그걸 확대 적용하려면 어떻게 해야하는지요?
onmystep의 이미지

../common/ 에 위치한 c file도 현재 접미사가 위치한 Makefile안에
C_SOURCES += test1.c \
test2.c \
..\common\test3.c \
..

형태로 되어 있있나요?

혹시, ../common/ 에도 Makefile을 따로 두고 있다면,
접미사 정의를 파일, 가령 common.mk 로 ../common/common.mk
에 두고, root, 혹은 기타 directory에서 include 해써 쓰시면 되겠죠.
대신, 최종 실행 target은 common.mk에 있어야 합니다.

혹시해서, 시험 출력은 "make" 대신 "make -n"을 써보세요.

cinsk의 이미지

VPATH를 쓰시면 될 것 같습니다. (GNU Make만 가능할 것 임)

디렉토리 구조가 다음과 같을 때,

[SOMEDIR]
  a.c
  b.c
  [lib]
    c.c
    d.c

[SOMEDIR]에 다음과 같은 Makefile을 만듭니다:

VPATH=lib
OBJS=a.o b.o c.o d.o

all: $(OBJS)

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

실행 결과입니다:

$ ls *
Makefile  a.c  b.c

lib:
c.c  d.c
$ make
cc -c  a.c -o a.o
cc -c  b.c -o b.o
cc -c  lib/c.c -o c.o
cc -c  lib/d.c -o d.o
$ ls
Makefile  a.c  a.o  b.c  b.o  c.o  d.o	lib/
$ _
thisrule의 이미지

cinsk님께 감사드립니다.
cinsk님과는 다른 방법으로 저도 나름대로 해결했습니다.

아래와 같은 방법으로 %를 사용하니 잘 됩니다.

%.o: ../common/%.c
    $(CC) -o $@ -c $< $(INC)

답변해주신 모든 분들께 감사드립니다. :lol:

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.