编写Makefile时的最佳实践

ant*_*009 1 makefile

gcc 4.4.2 c89

我写了这个Makefile.我想知道它是一个好的设计,易于维护吗?

我的事情,我想的是,cltsvr_ults.o获取与两个链接SVR_OBJECTSCLT_OBJECTS.这看起来是否正确?

非常感谢任何建议,

# ------------- SOURCE FILE ------------------------
SVR_OBJECTS = server.o cltsvr_ults.o test_svr.o
CLT_OBJECTS = client.o cltsvr_ults.o test_clt.o

# ------------- COMPILER OPTIONS -------------------
CFLAGS = -ggdb -Wall -pthread -std=c89 
CC = gcc
PLATFORM = -DLINUX
LIBS = -lpthread

# ------------- TARGETS ----------------------------
all: svr clt

svr: $(SVR_OBJECTS)
    $(CC) $(CFLAGS) $(PLATFORM) $(SVR_OBJECTS) -o svr

clt: $(CLT_OBJECTS)
    $(CC) $(CFLAGS) $(PLATFORM) $(CLT_OBJECTS) -o clt

clean:
    rm -f clt svr *.o *~

# -------------- DEPENDENCIES ---------------------
server.o:   server.h
client.o:   client.h
test_svr.o: test_svr.c
test_clt.o: test_clt.c
cltsvr_ults.o:  cltsvr_ults.h

svr.o:      server.h cltsvr_ults.h test_svr.c
clt.o:      client.h cltsvr_ults.h test_clt.c
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

我要做的唯一建议是依赖默认规则.IOW,如果你只是写:

CFLAGS := -ggdb -Wall -pthread -std=c89
CPPFLAGS := -DLINUX
LOADLIBES := -lpthread
CC := gcc
all: svr clt
svr: $(SVR_OBJECTS)
clt: $(CLT_OBJECTS)
...snip...

如果没有明确地为svr编写规则,那么(gnumake)将生成正确的规则.但是,这可能无法在所有不同品牌的产品中移植.如果这是一个问题,那么使用automake会好得多.(换句话说,除非必须,否则不要担心Make portability,但如果你不想手动编写Makefile,那么请注意你必须使用LOADLIBES而不是LIBS来使默认规则起作用为了你.