2012-04-30 4 views
1

Я пытался более часа исправлять мой make-файл, но я ломаю больше, чем исправляю. Во всяком случае, я довольно (очень) новичок в Makefiles, и у меня мало опыта. Моя проблема заключается в том, что мой makefile перекомпилирует каждый отдельный исходный файл, даже если уже были созданы объектные файлы (а источник не обновлен). Поскольку makefile похож на декларативное программирование, я понятия не имею, что я делаю неправильно или правильно.Запретить makefile перекомпилировать все исходные файлы

Извините за короткое описание купить мои знания в этой области очень ограничены ...

#--------------------------------------------------------- 
# Compiler and linker flags 
#--------------------------------------------------------- 

CC  = g++ 
CMNFLAGS = -ggdb3 -Wextra -Wall -Wno-int-to-pointer-cast -Wno-reorder -Wno- write-strings -DOPT_TYPE="\"debugging\"" 
CFLAGS  = $(CMNFLAGS) -fPIC 
LDFLAGS  = $(CMNFLAGS) -shared -ldl -lm -static-libgcc 

#--------------------------------------------------------- 
# All the different directories 
#--------------------------------------------------------- 

BUILD  = build 
SOURCE  = source 
INCLUDE  = include 
TARGET  = $(BUILD)/$(shell basename $(CURDIR))_mm_i386.so 

#--------------------------------------------------------- 
# Directory and include variables/files 
#--------------------------------------------------------- 

SRCSDK  = ../sdk 
METADIR  = $(INCLUDE)/metafiles 

INSTDIR  = /usr/local/test/$(shell basename $(CURDIR))/dlls 
INCLUDES = -I$(INCLUDE) -I$(METADIR) -I$(SRCSDK)/engine -I$(SRCSDK)/common \ 
     -I$(SRCSDK)/pm_shared -I$(SRCSDK)/dlls -I$(SRCSDK) 

#--------------------------------------------------------- 
# Special variables 
#--------------------------------------------------------- 

VPATH  = $(SOURCE) $(foreach dir, $(MODULES), $(SOURCE)/$(dir)) 

#--------------------------------------------------------- 
# Source and object files 
#--------------------------------------------------------- 

MODULES  = game 

SRC_DIR  = $(addprefix $(SOURCE)/, $(MODULES)) 
SOURCES  = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.cpp)) 

SOURCES  += $(wildcard $(SOURCE)/*.cpp) 
OBJECTS  = $(foreach dir, $(SOURCES:.cpp=.o), $(BUILD)/$(notdir $(dir))) 

#--------------------------------------------------------- 
# All the makefile directives 
#--------------------------------------------------------- 

.PHONY: clean install 

all: $(SOURCES) $(TARGET) 

$(TARGET): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

$(BUILD)/%.o: %.cpp $(BUILD) 
    $(CC) $(CFLAGS) $(INCLUDES) -o [email protected] -c $< 

$(BUILD): 
    @mkdir [email protected] 

clean: 
    -rm -r $(BUILD) 
    @echo clean... 

install: $(TARGET) 
    @cp $(TARGET) $(INSTDIR) 
    @echo installation done... 

ответ

5
$(BUILD)/%.o: %.cpp $(BUILD) 

должен быть

$(BUILD)/%.o: %.cpp 

Ваша линия говорит, что ваши файлы объектов построены из каталог, который содержит их. Почти все действия будут обновлять временную метку вашего каталога создания, поэтому объекты почти всегда устарели.

+0

Спасибо, работали близко к совершенству, есть только одна мелочь. Я помню, что я поставил для этого необходимое условие для создания каталога «build» всякий раз, когда я вызывал make. С этой установкой каталог сборки не является обязательным условием, поэтому он не создается. Любая идея почему? –

+0

@Elliott: для этого вы можете использовать только предварительные условия для заказа. См., Например, нижнюю часть http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html. – Idelic

+0

@Idelic - круто, я никогда не видел этот синтаксис раньше. Благодаря! –

Смежные вопросы