[英]Makefile change suffix rule based on target
目前,我的 Makefile 中有兩組標志。如果我想優化我的程序或者如果我想要更多調試信息(見下文),我會注釋掉一組。
FC = gfortran
# I switch between having one of the following two lines commented
# FFLAGS = -Og -Wall -Wextra -fcheck=all -fbacktrace -fbounds-check
FFLAGS = -O3
MOD='Modules/'
SRC = Modules/pyplot_module.f90
SRC += Modules/logs.f90
SRC += program.f90
OBJ = ${SRC:.f90=.o}
%.o: %.f90
$(FC) -c -J${MOD} $< $(FFLAGS) -o $@
program: $(OBJ)
$(FC) -J${MOD} $(FFLAGS) -o $@ $(OBJ)
remake: remove program
clean:
rm -f **/*.o **/*.mod
remove: clean
rm -f program
有沒有一種方法可以有兩種不同的后綴規則,並根據我調用的目標使用特定的后綴規則。 我想要像下面顯示的那樣的東西。 我懷疑這是一個 XY 問題,但我不知道如何解決這個問題。
FC = gfortran
# Notice changes here
DEBUGFFLAGS = -Og -Wall -Wextra -fcheck=all -fbacktrace -fbounds-check
FFLAGS = -O3
MOD='Modules/'
SRC = Modules/pyplot_module.f90
SRC += Modules/logs.f90
SRC += program.f90
OBJ = ${SRC:.f90=.o}
%.o: %.f90
$(FC) -c -J${MOD} $< $(FFLAGS) -o $@
%.o: %.f90 # I want this suffix rule to be used only when program-debug target is made
$(FC) -c -J${MOD} $< $(DEBUGFFLAGS) -o $@
program-optimized: $(OBJ)
$(FC) -J${MOD} $(FFLAGS) -o $@ $(OBJ)
program-debug: $(OBJ)
# But I also want the SRC files to be compiled with these flags aswell
$(FC) -J${MOD} $(DEBUGFFLAGS) -o $@ $(OBJ)
remake: remove program
clean:
rm -f **/*.o **/*.mod
remove: clean
rm -f program
您可以使用特定於目標的變量來執行此操作,如下所示:
DEBUGFFLAGS = -Og -Wall -Wextra -fcheck=all -fbacktrace -fbounds-check
FFLAGS = -O3
EXTRAFLAGS =
%.o: %.f90
$(FC) -c -J${MOD} $< $(FFLAGS) $(EXTRAFLAGS) -o $@
program-optimized program-debug: $(OBJ)
$(FC) -J${MOD} $(FFLAGS) $(EXTRAFLAGS) -o $@ $(OBJ)
program-debug: EXTRAFLAGS = $(DEBUGFLAGS) # this is the magic
然而,這是一個壞主意。
問題是 make 不會在您更改標志時重建您的 object 文件,它只會在文件被編輯時重建。 因此,無論何時運行make
,您都可能混合使用優化選項和調試選項編譯的 object 個文件,除非您在構建之間完全清除所有 object 個文件,否則您永遠不會知道哪些是哪個。
更好的方法是創建一個單獨的子目錄來保存為調試和優化構建的 object 文件,這樣它們就不會相互沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.