Это работает на FreeBSD, который использует PMake вместо GMake.My Makefile всегда создает все файлы
Это мой первый файл Makefile. Я использовал Google много, чтобы помочь создать это, а также источники, такие как «PMake - A Tutorial». Единственная проблема, которую я не могу решить, заключается в том, что каждый раз, когда я запускаю Makefile, он скомпилирует каждый файл, даже если никаких изменений не будет.
У меня есть четыре каталога. src для моих исходных файлов, включить для моих заголовков, obj для вывода и bin для исполняемого файла.
Что я делаю, это сканирование исходной папки и создание списка файлов для использования как для источника, так и для объекта, а также для заголовков. Обычно я запускаю «отлаживать» для отладки и «делать myservice» в противном случае.
Если я запустил «make clean», «make debug» и «make debug», он очистит мои папки, создаст все файлы, а затем переделает все файлы вместо того, чтобы ничего не делать.
Основываясь на моем поиске, я склоняюсь к правилу $ (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