牛叔也邪恶之最简Makefile



niubo_
2009-05-16 10:51:25

自从看懂了点编译参数,牛叔就开始飘飘然起来。现在他连模板中的Makefile都不屑一顾了。

后来他又搭建了eclipse下的C/C++编译环境,由于没有直接安装MinGW,eclipse没有显示任何可用toolchain,索性自己把修改工程属性,硬是把dev-cpp的编译器拿过来做了一个make项目,当然Makefile也是从其他dev-cpp的项目里copy过来的了。不过貌似直接拿过来的这个Makefile没法用,查看那个Makefile时,牛叔乐了:这个低级的Makefile也太小儿科了,遂参考DS项目的Makefile重写了一个,居然编译成功了。

牛叔对着黑洞洞的控制台窗口上显示的Hello World,不禁喃喃自语,“原来我也会写Makefile了。”

为了炫耀自己何等的牛X,他决定自己写一个DS项目的Makefile,要求,一切从简。

在一番复制/粘贴大法之后,一个最简Makefile的雏形就出现了,后经多处修改,终于在牛叔面前又出现了黑洞洞的No world……[code]
#-----------------------------------------------------------------------
# 使用这个伪目标清除make的默认后缀
#-----------------------------------------------------------------------
.SUFFIXES:
#-----------------------------------------------------------------------
# 把devkitARM/bin的路径添加到环境变量PATH中
#-----------------------------------------------------------------------
PATH := $(DEVKITARM)/bin:$(PATH)
#-----------------------------------------------------------------------
# 重定义C编译器,链接器objcopy的名字
#-----------------------------------------------------------------------
PREFIX := arm-eabi-
CC := $(PREFIX)gcc
LD := $(CC)
OBJCOPY := $(PREFIX)objcopy
#-----------------------------------------------------------------------
# 设定“目标”变量为当年目录的目录名
#-----------------------------------------------------------------------
TARGET := $(shell basename $(CURDIR))
#-----------------------------------------------------------------------
# 设定要传递给编译器和链接器的参数
#-----------------------------------------------------------------------
CFLAGS := -DARM9
LDFLAGS = -specs=ds_arm9.specs
#-----------------------------------------------------------------------
# 指定要使用的外部库
#-----------------------------------------------------------------------
LIBS := -lnds9
#-----------------------------------------------------------------------
# 这些变量名字都很清楚,我想不用多解释了吧
#-----------------------------------------------------------------------
OUTPUT := $(CURDIR)/$(TARGET)
CFILES := $(foreach dir,$(CURDIR),$(notdir $(wildcard $(dir)/*.c)))
OFILES := $(CFILES:.c=.o)
INCLUDE := $(DEVKITPRO)/libnds/include
LIBPATH := $(DEVKITPRO)/libnds/lib
#-----------------------------------------------------------------------
# 声明一个伪目标clean,从而可以使用make clean清除生成文件
#-----------------------------------------------------------------------
.PHONY: clean
#-----------------------------------------------------------------------
# 主要目标以及他们之间的依赖关系
#-----------------------------------------------------------------------
$(OUTPUT).nds : $(OUTPUT).arm9
$(OUTPUT).arm9 : $(OUTPUT).elf
$(OUTPUT).elf : $(OFILES)
#-----------------------------------------------------------------------
# 用make clean调用Makefile时会执行下面的操作
#-----------------------------------------------------------------------
clean:
@echo clean ...
rm -fr *.o $(TARGET).elf $(TARGET).nds $(TARGET).arm9
#-----------------------------------------------------------------------
# 使用通配符对特定后缀的文件进行匹配,根据依赖规则执行后面的命令
#-----------------------------------------------------------------------
%.nds: %.arm9
@echo -------------------------------------------------------------
@echo -ndstool build $(notdir $@) [arm9 TO nds]-
@echo -------------------------------------------------------------
ndstool -c $@ -9 $<
@echo -----All Done!-----
#-----------------------------------------------------------------------
%.arm9: %.elf
@echo -------------------------------------------------------------
@echo -objcopy $(notdir $@) [elf TO arm9]-
@echo -------------------------------------------------------------
$(OBJCOPY) -O binary $< $@

#------------------------------------------------------------------------
%.arm7: %.elf
@echo -------------------------------------------------------------
@echo -objcopy $(notdir $@) [elf TO arm7]-
@echo -------------------------------------------------------------
$(OBJCOPY) -O binary $< $@
#------------------------------------------------------------------------
%.elf:
@echo --------------------------------------------------------------
@echo -linking $(notdir $@) [o TO elf]-
@echo --------------------------------------------------------------
$(LD) $(LDFLAGS) $(OFILES) -L$(LIBPATH) $(LIBS) -o $@
#------------------------------------------------------------------------
%.o: %.c
@echo --------------------------------------------------------------
@echo -compilting $(notdir $<) [c TO o]-
@echo --------------------------------------------------------------
$(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o $@

[/code]不过简单虽然简单,限制也挺大:只能用C语言,不能调用bin2o,不能调用grit,更没法用EFSlib……所有源码码都要放在项目的根目录下,而且只能搜索一个外部库的路径。
无论如何,这个Makefile总算是能用的。想到这里,牛叔嘴角不禁泛起一丝邪恶的微笑……

众人:完了,这娃儿被雷叔给带坏了……


lipop
2009-06-03 14:26:06

O(∩_∩)O~


白枫
2009-07-17 19:18:28

我爱牛叔