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