글
Makefile 만들기
Programming/OS Development
2009. 11. 22. 21:37
현재 MPOS 에서 쓰고 있는 makefile 을 가지고 설명을 하겠다.
아래는 전체 makefile 내용이다.
이제, 부분적으로 설명하도록 하겠다.
이 부분은 매크로 정의로서, C의 define 처럼 GCC, ASM 을 특정 문자열로 바꾸어 주는 것이다. 아래에서 EFLAGS 를 쓰게 되면 -Iinclude 이 치환되는 것이다. 뒤에 #은 주석을 표시 할 때 사용 된다. 아래의 대입문은 설명을 생략하도록 하겠다. 여기서 -I 옵션은 include 할 폴더 경로를 지정해주고, -Wall 은 경고를 최대한으로 체크해 주는 것이다.
all: 이 top target 으로, 처음 시작 하는 부분이다. mpos_linking label을 찾아 이동하게 된다. 그리고, 아래 부분은 mpos_linking을 따라가서 수행을 한 뒤에 다음에 실행을 하게 되는 명령어 부분이다. del 부분은 파일을 삭제해주는 부분으로 del *.o 는 .o 확장자 파일을 모두 지워준다.
여기서도 먼저 mpos_compile 부분을 먼저 찾아서 수행을 하게 된다. 그리고 나서 ld 명령을 통해 링크를 해주는 부분이다.
clean $(OBJS) 에서 OBJS 매크로를 사용하기 위해서는 $() 를 항상 해주어야한다. clean 은 따라가서 수행을 처리해주고 난뒤에, 아래의 명령어를 통해 asm 파일들을 컴파일 해주게 된다.
clean 부분은 불필요한 파일들을 삭제해 주는 구문이다.
이 부분은 불분명한 어떤 .c 파일을 어떤 .o 파일로 바꿀 때 사용 하는 것이다. 링크부분에서 object 파일들이 없을 경우에 알아서 .c파일들을 .o 파일로 만들어주게 된다.
이렇게 makefile이 구성되어 있고, 이를 쉽게 실행 하기 위해서 bat 파일을 만든다. Makefile.bat 로 만들어서 메모장으로 이를 열어서 make 와 pause를 입력해 준다. 그러면 이를 실행을 하면 이 폴더에 있는 make 파일에 따라 make를 해주고 마지막에 pause를 하여 결과를 보여준다.
아래는 전체 makefile 내용이다.
GCC = gcc
ASM = nasm
ASM = nasm
EFLAGS = -Iinclude #-Wall # 기타 flag 값
EFLAGSCOFF = -f coff -o # coff 형식 오브젝트
EFLAGSBIN = -f bin -o # binary 파일
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 \
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 \
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
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
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
$(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
del *.o
del mpos
del *.bin
.c.o: # c파일을 오브젝트파일로
$(GCC) $(EFLAGS) -c $<
$(GCC) $(EFLAGS) -c $<
이제, 부분적으로 설명하도록 하겠다.
GCC = gcc
ASM = nasm
ASM = nasm
EFLAGS = -Iinclude #-Wall # 기타 flag 값
EFLAGSCOFF = -f coff -o # coff 형식 오브젝트
EFLAGSBIN = -f bin -o # binary 파일
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
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
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
$(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
del *.o
del mpos
del *.bin
clean 부분은 불필요한 파일들을 삭제해 주는 구문이다.
.c.o: # c파일을 오브젝트파일로
$(GCC) $(EFLAGS) -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 |