如何使用带有 gprof 的生成文件来重新编译依赖项?



我有一个makefile,它编译并链接在一起对象以创建一个可执行文件。为了进行分析,我需要在编译之前使用额外的标志-pg。这是我当前的制作文件:

# objects required
OBJS = obj1.o obj2.o
# flags
FC = gfortran
FLAGS = -O3
PROFILEFLAG = -pg
# executable
EXE = program.exe
PROFEXE = program_prof.exe
# suffixes
.SUFFIXES: .o .f90
# rules
%.o: %.f90
$(FC) $(FLAGS) -c $<
default: $(OBJS)
$(FC) $(FLAGS) $(OBJS) -o $(EXE)
profile: $(OBJS) 
$(FC) $(FLAGS) $(OBJS) -o $(PROFEXE) $(PROFILEFLAG)
clean: 
rm *.o *.mod

运行make profile运行与配置文件关联的规则,该规则创建可分析的可执行program_prof.exe。但是,由于各个依赖项obj1obj2不是使用-pg标志编译的,因此我无法分析这些文件运行的代码。

有没有办法添加一条规则,以便在我需要分析时也使用-pg标志重新编译各个对象?

目前,我正在手动编辑各个对象依赖项以:

%.o: %.f90
$(FC) $(FLAGS) -c $< -pg

按预期工作,但很耗时(我的实际 makefile 在子文件夹中有多个依赖项,所有这些都需要编辑(。理想情况下,我正在寻找一个应该使用"-pg"标志重新编译单个对象的规则。

您可以使用特定于目标的变量执行所需的操作:

PROFILE :=
%.o : %.f90
$(FC) $(FLAGS) $(PROFILE) -c -o $@ $<
default: $(OBJS)
....
profile: PROFILE := -pg
profile: $(OBJS)
....

但是,这通常不是首选方法。 除非您非常勤奋地在配置文件和非配置文件构建之间来回切换时始终进行完全清理,否则很容易混淆并且使用分析编译某些对象而使用分析编译其他对象而不编译。

如评论中所述,最好将它们构建到单独的目录中:

$(PDIR)/%.o : %.f90
@mkdir -p $(@D)
$(FC) $(FLAGS) -pg -c -o $@ $<
$(ODIR)/%.o : %.f90
@mkdir -p $(@D)
$(FC) $(FLAGS) -c -o $@ $<
default: $(addprefix $(ODIR)/,$(OBJS))
$(FC) $(FLAGS) $^ -o $@
profile: $(addprefix $(PDIR)/,$(OBJS))
$(FC) $(FLAGS) -pg $^ -o $@

最新更新