Makefile을 사용하여 컴파일시 변경된 파일만 컴파일 하기

teratis의 이미지

안녕하세요. 처음 프로젝트에 Makefile을 사용해본 초짜입니다.

프로그램 개발시 항상 IDE를 사용하다가 이번에 필요가 있어서 Makefile 베이스로 프로젝트를 변경했습니다.

질문1. 컴파일시 변경된 파일만 컴파일을 해야 하는데 항상 빌드 올로 컴파일 됩니다. 이를 해결할 방법이 궁금합니다.

Makefile에 대하여 검색을 해서 공부를 하다보니 '의존성 검사'라는것을 알게 되었습니다.

질문2. winxp환경에서도 '의존성 검사' 툴을 사용할 수 있는지 궁금합니다. 가능하다면 간단한 사용법이라도 부탁드립니다.

프로젝트 구성이 재귀 호출 Makefile로 구성되어 있습니다. 각 디렉토리마다 Makefile이 있으며 아래 컴파일 스크립트로 컴파일을
수행합니다.

질문3. OBJECTS 변수에 들어가는 값들이 디렉토리를 이동하면서 계속 누적시킬수 있는 방법이 궁금합니다.

OBJECTS 값들이 해당 디렉토리에서는 유지가 되는데 디렉토리를 이동하고 다른 Makefile을 수행하면 이전 내용을 잃어버립니다.
export 키워드를 사용해서 하면 될것 같기도 해서 이것저것 해봤는데 성공하지 못했습니다.

저의 환경에 대하여 설명드리겠습니다.

개발환경 OS는 winxp이며 GnuWin32 Utility Makefile 3.81을 사용하고 있고 타겟은 ARM입니다.

디렉토리 구성은 아래와 같습니다.
ROOT = $(shell cd)
SRC_DIR = $(ROOT)\source
OBJ_DIR = $(ROOT)\object
OUT_DIR = $(ROOT)\output
export ROOT SRC_DIR OBJ_DIR OUT_DIR

ROOT : 최상위 디렉토리
source : 소스코드들이 있는 디렉토리이며 컴파일시 생성된 오브젝트 파일은 아래 object디렉토리로 바로 이동
object : 오브젝트 코드들이 있는 디렉토리
output : 최종 이미지가 위치할 디렉토리

컴파일을 시작하기 전에 해당 디렉토리 존재여부를 검사하여 있으면 지나가고 없으면 생성시킵니다.

컴파일은 아래와 같이 내부 확장자 규칙을 사용하여 컴파일합니다.
.SUFFIXES : .o .s
%.o : %.s
$(AS) $(ASFLAGS) $< -o $(OBJ_DIR)\$@
.SUFFIXES : .o .c
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $(OBJ_DIR)\$@

하위 디렉토리 별로 있는 Makefile 내용입니다.
OBJECTS += $(patsubst %.s, %.o, $(wildcard *.s))
OBJECTS += $(patsubst %.c, %.o, $(wildcard *.c))

all: $(OBJECTS)

링크는 아래 스크립트로 수행합니다.
$(LD) $(LFLAGS) -o$(OUT_DIR)\$(join $(TARGET),.axf) $(wildcard $(OBJ_DIR)/*.o)

댓글 달기

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