简单,通用的Makefile

时间:2013-12-16 10:00:37

标签: makefile

我试图为我的大学项目创建我自己的,小但通用的Makefile。我设法写的是流动的代码。问题是,我必须多次运行make all来编译所有可执行文件。 .o个文件和相应的可执行文件是在每次make调用时逐步创建的,而不是一次创建的。该怎么做呢?

# Variables
Project = Project_Name
Src     = src
Include = inc
Lib     = lib
Build   = build
Dist    = dist
Res     = resources
LibSem  = -L$(Lib) -lbib
CC      = gcc $(CFLAGS)

# Vpaths for implicite rules.
vpath %.c $(Src)
vpath %.h $(Include)
vpath %.o $(Build)
vpath %.d $(Build)
# Src is set for explicite named files.
CPPFLAGS += -I$(Src) -I$(Include)

# Define Source variable with the list of .c files
# File is updated by Vim by the call of "make update"
include build/Sources.inc

all: prog1 prog2
    cp -fr $(Res)/* $(Dist)

bib: libbib.o
    ar -cvrs $(Lib)/libbib.a $^

prog1: prog1.o sem
    $(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)

prog2: prog2.o sem
    $(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)

update:
    #----------------------------------------
    # Updating list of sources.
    #----------------------------------------
    echo -n "Sources = " > $(Build)/Sources.inc
    find src/ -type f -name '*.c' -printf "%f " >> $(Build)/Sources.inc

clean:
    #----------------------------------------
    # Cleaning files.
    #----------------------------------------
    rm -rf $(Build)/*
    rm -rf $(Dist)/*
    rm -rf $(Lib)/*
    touch $(Build)/Sources.inc

dist: clean dep all
    #----------------------------------------
    # Distribute archive.
    #----------------------------------------
    tar -cvzf $(Project).tar.gz $(Include) $(Res) $(Src) Makefile

# changed for output in Build directory
%.o: %.c
    $(COMPILE.c) -o $(Build)/$@ $<

# autogenerated dependencies files
-include $(subst .c,.d,$(Sources))

dep %.d: %.c
    #----------------------------------------
    # Generating auto-dependencies
    #----------------------------------------
    $(CC) -M $(CPPFLAGS) $< > $(Build)/$@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $(Build)/$@.$$$$ > $(Build)/$@; \
    rm -f $(Build)/$@.$$$$

1 个答案:

答案 0 :(得分:0)

这些规则是错误的:

prog1: prog1.o sem
        $(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)

每个&#34;正常&#34; make 中的规则必须更新您告知的目标,使其更新。在这里,您的规则告诉它将更新文件prog1,但您的规则实际上做的是更新文件dist/prog1。这些是完全不同的,你的makefile不起作用,因为你已经撒谎。

一般情况下,无法使用vpath来描述生成目标的放置位置。 vpath功能仅在用于查找文件时有效。

您必须按照以下方式编写规则:

$(Dist)/prog1: $(Build)/prog1.o sem
        $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $< $(LibSem)

然而,这只是冰山一角。因此,您需要进行更多更改,以便按照您想要的方式进行更改。