簡體   English   中英

將Makefile調整為僅在文件已更改時重新編譯

[英]Adjust Makefile to only recompile files if they have changed

我有一個關於我的Makefile的問題。 Makefile打算使用Cosmic編譯器編譯包含STM8μC代碼的C文件。 問題是每次我調用構建目標時,都會重新編譯所有可用的源文件而不做任何更改。 我是Makefiles領域的新手,我不知道如何修復它。

第二個問題與兩個目標“%。o:src /%。c”和%.o:src / stm8 /%。c有關。 它們完全相同,我更喜歡能夠處理src文件夾中所有子目錄的通用的。 使用此解決方案,需要為src文件夾的每個子文件夾添加其他規則

#***************PROJECT INFORMATIONS****************
PROJECT_NAME = stm8template
MODULES = stm8

#****************SET BUILD MODE*********************
ifeq ($(MODE), )
  MODE=Debug
endif

#***************DIRECTORY INFORMATION***************
SRCDIR = src
INCLUDES = includes
OUTPUT_DIR = bin/$(MODE)

#**************HELPER FUNCTIONS*********************
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

#***************FILE SPECIFICATIONS***************
SOURCE_FILES = $(foreach d, $(call rwildcard,$(SRCDIR),*.c), $(notdir $d))
OBJECT_FILES = $(patsubst %.c, %.o, $(SOURCE_FILES))
HEADER_FILES = $(wildcard $(INCLUDES)/*.h) $(wildcard $(INCLUDES)/**/*.h)
INCLUDE_DIRS_PARAM=$(foreach d, $(MODULES), -iincludes/$d) -iincludes -iC:\Hstm8

#***************COMPILER INFORMATIONS***************
CC = cxstm8
LIBS = -l +mods0
ifeq ("$(MODE)","Debug")
CFLAGS = $(INCLUDE_DIRS_PARAM) -cl$(OUTPUT_DIR) -co$(OUTPUT_DIR) -pxp -no -pp +debug 
else
CFLAGS = $(INCLUDE_DIRS_PARAM) -cl$(OUTPUT_DIR) -co$(OUTPUT_DIR) -pxp -no -pp
endif

#***************LINKER INFORMATIONS***************
LINKFILE=$(OUTPUT_DIR)\$(PROJECT_NAME).lkf
OUTFILE=$(PROJECT_NAME)
LFLAGS = -lC:\Lib

#*************FLASHER CONFIGURATIONS***************
FLASHER_PATH="C:\Program Files (x86)\STMicroelectronics\st_toolset\stvp\STVP_CmdLine.exe"
DEVICE=STM8S105x6
PORT=USB
PROG_MODE=SWIM
BOARD_NAME=ST-LINK
FLASHER_PARAM = -no_loop

#***************BUILT TARGETS***************
all: build run

%.o: src/%.c
  $(info ********** Compile $< ***********)
  $(CC) $(CFLAGS) $(LIBS) $<

%.o: src/stm8/%.c
  $(info ********** Compile $< ***********)
  $(CC) $(CFLAGS) $(LIBS) $<

build: $(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

run:
  $(info ********** Flashing the Application ***********)
  $(FLASHER_PATH) -BoardName=$(BOARD_NAME) -Device=$(DEVICE) -Port=$(PORT) -ProgMode=$(PROG_MODE) -FileProg="$(OUTPUT_DIR)\$(OUTFILE).s19" $(FLASHER_PARAM) 

永遠不會創建build目標,因此每次運行make (或make allmake build )時都會執行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上工作,我會使用/而不是\\ ,但這是一個小細節。

更新:謝謝大家的幫助。 我按照下面顯示的方式更改了Makefile。 第二個問題現在已經解決,但第一個問題仍然存在。

每次調用構建規則時,都會重新編譯所有.c文件。 我想,僅編譯已更改的文件是使用make的主要目的/好處。 所以有些事情是錯的,但不幸的是我沒有發現錯誤。

#***************PROJECT INFORMATIONS****************
PROJECT_NAME = stm8template
MODULES = stm8

#****************SET BUILD MODE*********************
ifeq ($(MODE), )
    MODE=Debug
endif

#***************DIRECTORY INFORMATION***************
SRCDIR = src
INCLUDES = includes

#**************HELPER FUNCTIONS*********************
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

#***************FILE SPECIFICATIONS***************
SOURCE_FILES = $(foreach d, $(call rwildcard,$(SRCDIR),*.c), $(notdir $d))
OBJECT_FILES = $(patsubst %.c, %.o, $(call rwildcard,$(SRCDIR),*.c))
HEADER_FILES = $(wildcard $(INCLUDES)/*.h) $(wildcard $(INCLUDES)/**/*.h)
INCLUDE_DIRS_PARAM=$(foreach d, $(MODULES), -iincludes/$d) -iincludes -iC:\Hstm8

#***************COMPILER INFORMATIONS***************
CC = cxstm8
LIBS = -l +mods0
ifeq ("$(MODE)","Debug")
  CFLAGS = $(INCLUDE_DIRS_PARAM) -cl$(OUTPUT_DIR) -co$(OUTPUT_DIR) -pxp -no -pp +debug 
else
  CFLAGS = $(INCLUDE_DIRS_PARAM) -cl$(OUTPUT_DIR) -co$(OUTPUT_DIR) -pxp -no -pp
endif

#***************LINKER INFORMATIONS***************
LINKFILE=$(OUTPUT_DIR)\$(PROJECT_NAME).lkf
LFLAGS = -LC:\Lib

#*******************OUTPUT FILES********************
OUTPUT_DIR = bin/$(MODE)
OUTFILE=$(PROJECT_NAME)
OUTFILE.sm8 = $(OUTPUT_DIR)\$(OUTFILE).sm8
OUTFILE.s19 = $(OUTPUT_DIR)\$(OUTFILE).s19
OUTFILE.map = $(OUTPUT_DIR)\$(OUTFILE).map
TARGET_FILE=$(OUTPUT_DIR)\$(PROJECT_NAME).elf

#*************FLASHER CONFIGURATIONS***************
FLASHER_PATH="C:\Program Files (x86)\STMicroelectronics\st_toolset\stvp\STVP_CmdLine.exe"
DEVICE := STM8S105x6
PORT=USB
PROG_MODE=SWIM
BOARD_NAME=ST-LINK
FLASHER_PARAM = -no_loop

#***************BUILT TARGETS***************
.PHONY: all run build clean
all: build run

%.o: %.c
  $(info ********** Compile $< ***********)
  $(CC) $(CFLAGS) $(LIBS) $<

build: $(OUTPUT_DIR)\$(PROJECT_NAME).elf

$(TARGET_FILE): $(OBJECT_FILES)
  $(info ********** Build the Application ***********)
  clnk -m $(OUTFILE.map) -o $(OUTFILE.sm8) $(LINKFILE)
  cvdwarf $(OUTFILE.sm8) 
  chex -o $(OUTFILE.s19) $(OUTFILE.sm8)

run:
  $(info ********** Flashing the Application ***********)
  $(FLASHER_PATH) -BoardName=$(BOARD_NAME) -Device=$(DEVICE) -Port=$(PORT) -ProgMode=$(PROG_MODE) -FileProg="$(OUTPUT_DIR)\$(OUTFILE).s19" $(FLASHER_PARAM) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM