编写Makefile时的最佳实践

时间:2010-01-19 14:43:52

标签: makefile

gcc 4.4.2 c89

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

我想到的是cltsvr_ults.oSVR_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

1 个答案:

答案 0 :(得分: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来使默认规则起作用对你而言。