這是在FreeBSD上運行的,它使用PMake而不是GMake。我的Makefile始終構建所有文件
這是我的第一個Makefile文件。我用谷歌很多來幫助創建這個以及諸如'PMake - A Tutorial'等資源。我無法解決的唯一問題是,每次運行Makefile時,即使沒有更改,它也會編譯每個文件。
我有四個目錄。 src用於我的源文件,包括我的頭文件,輸出的obj和可執行文件的bin。
我在做的是掃描源文件夾並創建一個文件列表,用於源和對象以及標題。通常我運行'make debug'進行調試,否則運行'make myservice'。
如果我執行「make乾淨」,「讓調試」和「讓調試」,它會清除我的文件夾,使所有文件,然後進行改造,而不是無所事事的所有文件。
根據我的搜索,我傾向於在$(OBJ)規則是問題,但我不太明白了。爲了構建我的目標和調試規則,他們需要知道如何構建對象。
CC = clang
BINDIR = $(.CURDIR)/bin
OBJDIR = $(.CURDIR)/obj
SRCDIR = $(.CURDIR)/src
INCDIR = $(.CURDIR)/include
CFLAGS = -Wall -I/usr/local/include -I$(INCDIR)
LFLAGS = -lm -lpq -lpthread
LIBDIR = -L/usr/local/lib
_SRC != ls $(SRCDIR)/*.c
SRC = ${_SRC:T}
INC != ls $(INCDIR)/*.h
OBJ = ${SRC:S/src/obj/g:.c=.o}
TARGET = myservice
$(TARGET): $(OBJ)
$(CC) -o $(BINDIR)/[email protected] $(OBJ) $(CFLAGS) $(LIBDIR) $(LFLAGS)
debug: $(OBJ)
$(CC) -g -O0 -o $(BINDIR)/$(TARGET) $(OBJ) $(CFLAGS) $(LIBDIR) $(LFLAGS)
$(OBJ) : $(SRCDIR)/$(.PREFIX).c $(INCDIR)/$(.PREFIX).h
$(CC) -c $< $(CFLAGS)
.PHONY: clean
clean:
rm -rf $(OBJDIR)/*.o $(BINDIR)/$(TARGET)
編輯 - 新的Makefile
新的Makefile。如果沒有更改,不重建。沒有調試,仍然有問題搞清楚調試。
CC = clang
BINDIR = $(.CURDIR)/bin
OBJDIR = $(.CURDIR)/obj
SRCDIR = $(.CURDIR)/src
INCDIR = $(.CURDIR)/include
CFLAGS = -Wall -I/usr/local/include -I$(INCDIR)
LFLAGS = -lm -lpq -lpthread
LIBDIR = -L/usr/local/lib
TARGET = $(BINDIR)/myservice
_SRC != ls $(SRCDIR)/*.c
SRC = ${_SRC:T}
INC != ls $(INCDIR)/*.h
OBJ = ${SRC:S/src/obj/g:.c=.o}
$(TARGET): $(OBJ)
$(CC) -o $(TARGET) $(OBJ) $(CFLAGS) $(LIBDIR) $(LFLAGS)
$(OBJ) : $(SRCDIR)/$(.PREFIX).c $(INCDIR)/$(.PREFIX).h
$(CC) $(CFLAGS) -c $< -o [email protected]
.PHONY: clean
clean:
rm -rf $(OBJDIR)/*.o $(TARGET)
編輯 - 工作的Makefile
添加如果有條件進行調試。
CC = clang
BINDIR = $(.CURDIR)/bin
OBJDIR = $(.CURDIR)/obj
SRCDIR = $(.CURDIR)/src
INCDIR = $(.CURDIR)/include
CFLAGS = -Wall -I/usr/local/include -I$(INCDIR)
.if make(debug)
CFLAGS += -g -O0
.endif
LFLAGS = -lm -lpq -lpthread
LIBDIR = -L/usr/local/lib
TARGET = $(BINDIR)/myservice
_SRC != ls $(SRCDIR)/*.c
SRC = ${_SRC:T}
INC != ls $(INCDIR)/*.h
OBJ = ${SRC:S/src/obj/g:.c=.o}
all: $(TARGET)
debug: $(TARGET)
$(TARGET): $(OBJ)
$(CC) -o $(TARGET) $(OBJ) $(CFLAGS) $(LIBDIR) $(LFLAGS)
$(OBJ): $(SRCDIR)/$(.PREFIX).c $(INCDIR)/$(.PREFIX).h
$(CC) $(CFLAGS) -c $< -o [email protected]
.PHONY: clean
clean:
rm -rf $(OBJDIR)/*.o $(TARGET)
只是一個友好的提示:CMake是一個更高的水平,可能會迴避一些這一點。 –
@JohnZwinck謝謝你的提示。現在,我想繼續使用PMake,這樣我就可以弄清楚我錯在哪裏並從中學習。我簡單看了一下CMake的例子。一旦我瞭解了一點,這絕對是我將進一步研究的內容。 – quickblueblur