Цель build
никогда не создается, поэтому команды после нее выполняются при каждом запуске make
(или make all
или make build
), поэтому программа связывается каждый раз.
Измените build
цель так, чтобы она была фальшивой:
.PHONY: build clean
и зависела от программы, а не от объектных файлов:
build: $(OUTPUT_DIR)\$(OUTFILE).sm8
и затем имела правило(рецепт), который создает программу, если объектные файлы более поздние:
$(OUTPUT_DIR)\$(OUTFILE).sm8: $(OBJECT_FILES)
$(info ********** Build the Application ***********)
clnk -m $(OUTPUT_DIR)\$(OUTFILE).map -o $(OUTPUT_DIR)\$(OUTFILE).sm8 $(LINKFILE)
cvdwarf $(OUTPUT_DIR)\$(OUTFILE).sm8
chex -o $(OUTPUT_DIR)\$(OUTFILE).s19 $(OUTPUT_DIR)\$(OUTFILE).sm8
Мне не на 100% ясно, что я выбрал правильный суффикс для программы.Я бы также создал серию макросов, чтобы избежать повторения, которое я вижу:
OUTFILE.sm8 = $(OUTPUT_DIR)\$(OUTFILE).sm8
OUTFILE.s19 = $(OUTPUT_DIR)\$(OUTFILE).s19
OUTFILE.map = $(OUTPUT_DIR)\$(OUTFILE).map
build: $(OUTFILE.sm8)
$(OUTFILE.sm8): $(OBJECT_FILES)
$(info ********** Build the Application ***********)
clnk -m $(OUTFILE.map) -o $(OUTFILE.sm8) $(LINKFILE)
cvdwarf $(OUTFILE.sm8)
chex -o $(OUTFILE.s19) $(OUTFILE.sm8)
Кроме того, поскольку я в основном работаю в Unix, я бы использовал /
вместо \
, но это незначительная деталь.