如何编写干净的Makefile?

时间:2011-07-06 17:11:26

标签: makefile

我所处理的Makefile大部分都是复杂的,隐藏着很多关系。我自己从未写过一篇,并且想知道是否有人有关于编写易于阅读和可重用的Makefile的一些技巧?

4 个答案:

答案 0 :(得分:3)

我通常使用这样的东西,在这个例子中,源文件是main.c file2.c file3.c file4.c,添加更多只需添加到OBJECTS var。

它们都依赖于Makefile,因此对于完整的重新编译,简单的touch Makefile就足够了。

PROGNAME = hi2u
LIBS = -ljpeg -ldirectfb -pthread 
INCLUDES = -I/usr/local/include/directfb 
LDFLAGS = -Llibs/
OBJECTS = main.o file2.o \
            file3.o file4.o

CFLAGS = -W -Wall -O2 -ggdb 

all: $(PROGNAME)

$(PROGNAME): $(OBJECTS)
    gcc -o $(PROGNAME) $(OBJECTS) $(LIBS) $(INCLUDES) $(LDFLAGS)

$(OBJECTS): Makefile

.c.o: 
    gcc -c $(CFLAGS) $(INCLUDES) -o $@ $< 

clean:
    rm *.o $(PROGNAME)

答案 1 :(得分:2)

我发现有助于理解Makefile的教程是http://www.jfranken.de/homepages/johannes/vortraege/make_inhalt.en.html

另一个提示是大量使用源文件和依赖项的正则表达式

答案 2 :(得分:1)

对我来说,让我思考这些问题的读物是经典的“Recursive Make Considered Harmful”。

当我有机会从头开始创建makefile时,我尝试尽可能地使用隐式规则,并在单独的文件中定义规则,我可以从“真实”的makefile中包含这些规则。

使用 make 的挑战可分为两大类:

  • make 本身固有的问题,其丰富的语义和语法以及有些过时的外观

  • 不会导致“错误”的问题,而是来自make用于调用另一个make进程的问题。突然间,我们手头有另一项任务 - 在两个或更多制造流程之间进行沟通。使用环境变量或其他传递信息的方式很容易迷失方向。 制作本身的平​​台差异旨在隐藏,可能会变得可见。

答案 3 :(得分:1)

老实说,makefile的复杂性依赖于程序的复杂性。如果你有很多文件夹和文件以及不同的编译过程,你的makefile可能会有点长而复杂。如果您有一个helloworld计划,则没有理由让它超过几行。

以下是关于makefile的一些提示:http://mrbook.org/tutorials/make/

这是一个非常可重用的makefile,它并不太复杂:

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@