[makefile]commands commence before first target 에러

Programming 2010. 7. 7. 10:10
*** commands commence before first target. Stop 와 같은 에러가 발생하는 경우

\ 문자 뒤에 공백이 들어가서 그렇다.

Ex ) MOD :=  \
$(DIR)/Test.o \
$(DIR)/Lib.o \
$(DIR)/smc.o

위의 예와 같이 붉은 색의 빈칸이 들어가 있으면, 에러가 발생한다.

'Programming' 카테고리의 다른 글

ARM C Compiler  (0) 2010.09.18
세마포어( Semaphore )  (1) 2010.05.31
Event-driven programming  (0) 2010.05.31
undefined reference  (0) 2010.03.26
XML 이란?  (0) 2010.03.26

설정

트랙백

댓글

Makefile 만들기

Programming/OS Development 2009. 11. 22. 21:37
현재 MPOS 에서 쓰고 있는 makefile 을 가지고 설명을 하겠다.

아래는 전체 makefile 내용이다.
GCC = gcc
ASM = nasm
EFLAGS    = -Iinclude #-Wall # 기타 flag 값
EFLAGSCOFF = -f coff -o  # coff 형식 오브젝트
EFLAGSBIN  = -f bin -o   # binary 파일
OBJS =  mpos.o    \
 mmanager.o  \
 6845crt.o   \
 vsprintf.o  \
 string.o    \
 hal.o     \
 kernel.o   \
 process.o \
 syscall.o \
 kbddrv.o \
 fdddrv.o \
 hshell.o \
 gshell.o \
 fatfs.o  \
 musdrv.o \
 queue.o \
 windows.o \
 eventdriven.o \
 graphic.o \
OBJSCOFF = entry.o \
    hal_asm.o \
    handler.o \
    graphicf.o \
all: mpos_linking  # 내부에 필요한 것들만 남김
 objcopy -R .note -R .comment -S -O binary mpos MPOS.BIN
 del *.o
 del mpos
mpos_linking: mpos_compile # 링킹
 ld -o mpos -Ttext 0x20000 -e _EntryPoint16 $(OBJSCOFF) $(OBJS) hankaku.obj
mpos_compile: clean $(OBJS) # c 컴파일, asm 컴파일
 $(ASM) $(EFLAGSBIN) bootsect.bin asm/bootsect.asm
 $(ASM) $(EFLAGSCOFF) entry.o asm/entry.asm
 $(ASM) $(EFLAGSCOFF) hal_asm.o asm/hal_asm.asm
 $(ASM) $(EFLAGSCOFF) handler.o asm/handler.asm
 $(ASM) $(EFLAGSCOFF) graphicf.o asm/graphicfunc.asm
clean:   # 이전에 컴파일된 오브젝트 파일과 실행 파일 삭제
 del *.o
 del mpos
 del *.bin
.c.o:   # c파일을 오브젝트파일로
 $(GCC) $(EFLAGS) -c $<

이제, 부분적으로 설명하도록 하겠다.

GCC = gcc
ASM = nasm
EFLAGS    = -Iinclude #-Wall # 기타 flag 값
EFLAGSCOFF = -f coff -o  # coff 형식 오브젝트
EFLAGSBIN  = -f bin -o   # binary 파일

이 부분은 매크로 정의로서, C의 define 처럼 GCC, ASM 을 특정 문자열로 바꾸어 주는 것이다. 아래에서 EFLAGS 를 쓰게 되면 -Iinclude 이 치환되는 것이다. 뒤에 #은 주석을 표시 할 때 사용 된다. 아래의 대입문은 설명을 생략하도록 하겠다. 여기서 -I 옵션은 include 할 폴더 경로를 지정해주고, -Wall 은 경고를 최대한으로 체크해 주는 것이다.

all: mpos_linking  # 내부에 필요한 것들만 남김
 objcopy -R .note -R .comment -S -O binary mpos MPOS.BIN
 del *.o
 del mpos

all: 이 top target 으로, 처음 시작 하는 부분이다. mpos_linking label을 찾아 이동하게 된다. 그리고, 아래 부분은 mpos_linking을 따라가서 수행을 한 뒤에 다음에 실행을 하게 되는 명령어 부분이다. del 부분은 파일을 삭제해주는 부분으로 del *.o 는 .o 확장자 파일을 모두 지워준다.

mpos_linking: mpos_compile # 링킹
 ld -o mpos -Ttext 0x20000 -e _EntryPoint16 $(OBJSCOFF) $(OBJS) hankaku.obj

여기서도 먼저 mpos_compile 부분을 먼저 찾아서 수행을 하게 된다. 그리고 나서 ld 명령을 통해 링크를 해주는 부분이다.

mpos_compile: clean $(OBJS) # c 컴파일, asm 컴파일
 $(ASM) $(EFLAGSBIN) bootsect.bin asm/bootsect.asm
 $(ASM) $(EFLAGSCOFF) entry.o asm/entry.asm
 $(ASM) $(EFLAGSCOFF) hal_asm.o asm/hal_asm.asm
 $(ASM) $(EFLAGSCOFF) handler.o asm/handler.asm
 $(ASM) $(EFLAGSCOFF) graphicf.o asm/graphicfunc.asm

clean $(OBJS) 에서 OBJS 매크로를 사용하기 위해서는 $() 를 항상 해주어야한다. clean 은 따라가서 수행을 처리해주고 난뒤에, 아래의 명령어를 통해 asm 파일들을 컴파일 해주게 된다.

clean:   # 이전에 컴파일된 오브젝트 파일과 실행 파일 삭제
 del *.o
 del mpos
 del *.bin

clean 부분은 불필요한 파일들을 삭제해 주는 구문이다.

.c.o:   # c파일을 오브젝트파일로
 $(GCC) $(EFLAGS) -c $<

이 부분은 불분명한 어떤 .c 파일을 어떤 .o 파일로 바꿀 때 사용 하는 것이다. 링크부분에서 object 파일들이 없을 경우에 알아서 .c파일들을 .o 파일로 만들어주게 된다.

이렇게 makefile이 구성되어 있고, 이를 쉽게 실행 하기 위해서 bat 파일을 만든다. Makefile.bat 로 만들어서 메모장으로 이를 열어서 make 와 pause를 입력해 준다. 그러면 이를 실행을 하면 이 폴더에 있는 make 파일에 따라 make를 해주고 마지막에 pause를 하여 결과를 보여준다.

'Programming > OS Development' 카테고리의 다른 글

TSS( Task Statement Segment )  (0) 2009.11.29
NASM 설치  (0) 2009.11.22
djgpp 설치  (0) 2009.11.22
DMA & PIO  (0) 2009.09.23
클러스터( Cluster )  (0) 2009.09.23

설정

트랙백

댓글