2012-04-30 15 views
1

私はmakefileを修正するのに1時間以上をかけてきましたが、修正する以上に壊れています。とにかく、私はかなり(非常に)Makefileに新しく、私は経験がほとんどないです。私の問題は、オブジェクトファイルが既にビルドされていてもソースが更新されていなくても、makefileがすべての単一のソースファイルを再コンパイルすることです。 makefileは宣言型プログラミングと非常によく似ているので、何が間違っているのか正しいのか分かりません。簡単な説明は、この分野での私の知識を買うためmakefileがすべてのソースファイルを再コンパイルしないようにします

申し訳ありませんが

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

あなたのラインは、あなたのオブジェクトファイルがから構築されていると言うべきである...

#--------------------------------------------------------- 
# 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) 

非常に限られていますそれらを含むディレクトリほぼすべてのアクションによってビルドディレクトリのタイムスタンプが更新されるため、オブジェクトはほとんど常に古くなっています。

+0

ありがとう、完璧に近づいた、ちょっとしたことが1つあります。 makeと呼ばれるたびにビルドディレクトリを作成するための前提条件をそこに置くことを覚えています。この設定では、ビルドディレクトリは前提条件ではないため、作成されません。どんな考え? –

+0

@Elliott:注文専用の前提条件を使用することができます。たとえば、http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.htmlの下部を参照してください。 – Idelic

+0

@Idelic - クール、私は前にその構文を見たことがない。ありがとう! –

関連する問題