2
7
2010
0

通用多源代码格式支持、依赖关系支持Makefile

本站文章,皆为原创,如需转载,请注明出处,违者必究

介绍

我们在第三章中介绍了一种通用Makefile的写法,但是那个Makefile仍然是最基础形式的,除了能按照需求完成简单的编译之外,不能自动的根据依赖关系更新目标文件。

在这里,我们所说的依赖关系支持,是指比如源代码中的 test.c 文件 include 了 test.h 文件,但是在修改代码的过程中我们很有可能只修改了 test.h 而没有修改 test.c,因而输入 make 命令之后,test.c 文件并不能自动被重新编译更新,导致我们的 Makefile 不能完美的完成它的使命。

在大多数 Linux 代码包中普遍采用了基于依赖关系的自动编译方法,当然依赖关系的具体实现方式也不同,有的采用 mkdepend 命令来实现,有的采用 gcc 的自动依赖生成来实现,在这里我们采用的是后者的方法。

同时,在使用上这个 Makefile 与第三章中所描述的没有太大的区别,唯一的区别就是多了一些代码,而这些代码不需要用户来进行维护。

为了尽量扩大这个Makefile的使用范围,笔者扩展了这个通用 Makefile 支持了更多的源代码格式:

  1. ".s" 汇编代码
  2. ".c" C语言代码
  3. ".cpp" C++代码
  4. ".f" Fortran代码
  5. ".rc" Windows资源文件代码
  6. ".m" ObjectiveC/C++源代码

 

 

Martin版本源代码

###############################################################################
# GENERIC DEPENDENCY DRIVEN MAKEFILE FOR MSYS
#
# Currently supported source formats:
#  *.s, *.c, *.cpp, *.f, *.rc, *.m
#
# PROVIDED WITH NO WARRANTY OF ANY KIND, AND NO COPYRIGHT RESTRICTIONS
###############################################################################
# Toolchain Setup
PP
=cpp
AS
=as
CC
=gcc
CX
=g++
FC
=gfortran
RC
=windres
MC
=windmc
LD
=gcc
DB
=insight

# Compilation Configurations
INCLUDE
=
ASFLAGS
=$(INCLUDE) -g
CCFLAGS
=$(INCLUDE) -g
CXFLAGS
=$(INCLUDE) -g
FCFLAGS
=$(INCLUDE) -g
RCFLAGS
=
LDFLAGS
=

# Objectives
OBJECT
=
TARGET
=
DEPEND
=$(OBJECT:.o=.dep)

# Procedures
all
: $(TARGET)
       
@$(RM) $(DEPEND)

$
(TARGET) : $(OBJECT)
        $
(LD) -o $@ $^ $(LDFLAGS)

debug
: all
       
@$(DB) $(TARGET)

run
: all
       
@$(TARGET)

clean
:
       
@$(RM) $(OBJECT) $(DEPEND) $(TARGET)

# Standard Procedures
%.dep : %.s
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.dep : %.c
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.dep : %.m
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.dep : %.cpp
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.dep : %.f
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.dep : %.rc
       
@$(PP) $(INCLUDE) -MM -MT $(@:.dep=.o) -o $@ $<

%.o : %.s
        $
(AS) $(ASFLAGS) -o $@ $<

%.o : %.c
        $
(CC) $(CCFLAGS) -c -o $@ $<

%.o : %.m
        $
(CC) $(CCFLAGS) -c -o $@ $<

%.o : %.cpp
        $
(CX) $(CXFLAGS) -c -o $@ $<

%.o : %.f
        $
(FC) $(FCFLAGS) -c -o $@ $<

%.o : %.rc
        $
(RC) $(RCFLAGS) $< $@

-include $(DEPEND)

 

 

 

Category: 程序开发 | Tags: | Read Count: 1093

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com