打印

求救makefile高手

[复制链接]
1659|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sedatefire|  楼主 | 2012-6-12 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
缘起:公司有常有的make+SoureInsight编译方案,通过make将源代码、C和汇编编译器、连接器、代码格式转换器等绑定继承在一起,相当于一个基于SoureInsight的IDE

问题:公司的makefile实现方式要求所有的源代码都在同一个目录下。编译出来的.lst和.obj等中间档也都在一个目录下,这个很郁闷的。

需求:当项目工程足够大时,就希望源码能够分到子目录中。另外,.obj和.lst等能够定向到专门的子目录中。

求makefile的高手提供下样本即可。

曾经断断续续研究过一点,对makefile的认知处于“只读简写”阶段,所以特来取经。

相关帖子

沙发
amwrdfe| | 2012-6-12 12:52 | 只看该作者
给你抄一段吧。...
RKBASE = ..\..\..\..
!include $(RKBASE)\current\sdk\Rules.mak
!include Startup.mak

DEFINES    =  $(DEFINES)
OBJS       =  $(StartupObj) \
              Main.o Menu.o project.o functions.o JmpSramMenu.o game_pic.o test_hw_c.o

INCDIRS    =  $(INCDIRS) -I$(RKBASE)\current\Kernel
LIBS       =  $(LIBS) $(SDKLIBS)

MakeTile   =  $(RKBASE)\tools\MakeTile\MakeTile.exe
SCN        =  $(RKBASE)\Screenshots
MakeMenu   =  $(RKBASE)\tools\MakeMenu\MakeMenu.exe
SCNEMD     =  $(RKBASE)\ScreenshotsEMD
HighExLow  =  $(RKBASE)\tools\HighExLow\HighExLow.exe
ECC                   =  $(RKBASE)\tools\rsecc.exe

all: SetEnv   MakeScrn Makefile $(OBJS)
  @$(CC) -T $(GCCBIN)\md.ld -Wl,-M $(OBJS) $(LIBS) $(LIBS) -nostdlib $(LIBS) -o a.out > a.map
  $(OBJC) -O binary a.out menu.bin

SetEnv:
  @set PATH=$(RKBASE)\tools\RK2Dev\bin
  @set DJGPP=$(RKBASE)\tools\RK2Dev\DJGPP.env

clean:
        $(RM) $(OBJS) a.* *.bin defines.h settings.h LG.h BG*.h Rim.h svn_ver.h \
        Scrn.h Hand.h GM_*.h *Rim*.h DispName.h *.mak driver Bank0.c

Main.o: Main.c
Menu.o: Menu.c
project.o: project.c
functions.o: functions.c
JmpSramMenu.o: JmpSramMenu.s
game_pic.o: game_pic.c
test_hw_c.o: test_hw_c.c

!include MakeData.mak

bin: SetEnv $(OBJS)
  @$(CC) -T $(GCCBIN)\md.ld -Wl,-M $(OBJS) $(LIBS) $(LIBS) -nostdlib $(LIBS) -o a.out > a.map
  $(OBJC) -O binary a.out menu.bin

使用特权

评论回复
板凳
amwrdfe| | 2012-6-12 13:01 | 只看该作者
上面是基于windos的nmake
思路是,把库文件都放在一个目录,其他文件类似。
用makefile把源文件生成库文件放在库目录里,不然mdk文件多了,编译都得大半天;P
不想一个一个编译就做个批处理脚本~~~。

把库里面的文件名做成一个列表,
工程文件使用时候包含它就可以了。

使用特权

评论回复
地板
sedatefire|  楼主 | 2012-6-12 14:04 | 只看该作者
这个还不是很满意哦
nmake不大熟悉
我是单片机开发用到的


公司那样的做法虽然不妥,不过却用了wildcard把所有*.c档都搞进去
不用一个个指定,呵呵

使用特权

评论回复
5
amwrdfe| | 2012-6-12 17:11 | 只看该作者
其实搞明白了,
都差不多的,
如果是unix下的makefile
TARGET        := lib$(notdir $(CURDIR))
OUTPUT         := $(LIBDIRS)/$(TARGET)

CFILES := $(wildcard *.c)

OFILES        :=$(addsuffix .o,$(BINFILES)) \
          $(CFILES:.c=.o)

%.o: %.c
        @echo "Compiling $<..."
        $(CC) -MMD -MP -MF $*.d $(CFLAGS) $(INCLUDE) -c $< -o $@

$(OUTPUT).a : $(OFILES)
        $(AR) ru $(OUTPUT).a $(OFILES)
指定LIBDIRS就行了。

使用特权

评论回复
6
sedatefire|  楼主 | 2012-6-13 10:23 | 只看该作者
好吧,分数给你吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4393

主题

5935

帖子

33

粉丝