如何使用带有 gprof 的 makefile 来重新编译依赖项?
How to use a makefile with gprof to recompile dependencies?
我有一个生成文件,它编译对象并将它们链接在一起以创建可执行文件。为了分析,我需要在编译前使用一个额外的标志 -pg
。这是我当前的 makefile:
# 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
,可以对其进行配置。但是,由于单独的依赖项 obj1
和 obj2
未使用 -pg
标志编译,因此我无法分析这些文件中的代码 运行。
有没有一种方法可以添加规则,以便在我需要分析时也使用 -pg
标志重新编译单个对象?
目前我正在手动编辑各个对象依赖项以:
%.o: %.f90
$(FC) $(FLAGS) -c $< -pg
按预期工作,但很耗时(我的实际 makefile 在子文件夹中有多个依赖项,所有这些都需要编辑)。理想情况下,我正在寻找一个规则,该规则应该使用 `-pg' 标志重新编译单个对象。
你可以做你想做的,target-specific variables:
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 $@
我有一个生成文件,它编译对象并将它们链接在一起以创建可执行文件。为了分析,我需要在编译前使用一个额外的标志 -pg
。这是我当前的 makefile:
# 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
,可以对其进行配置。但是,由于单独的依赖项 obj1
和 obj2
未使用 -pg
标志编译,因此我无法分析这些文件中的代码 运行。
有没有一种方法可以添加规则,以便在我需要分析时也使用 -pg
标志重新编译单个对象?
目前我正在手动编辑各个对象依赖项以:
%.o: %.f90
$(FC) $(FLAGS) -c $< -pg
按预期工作,但很耗时(我的实际 makefile 在子文件夹中有多个依赖项,所有这些都需要编辑)。理想情况下,我正在寻找一个规则,该规则应该使用 `-pg' 标志重新编译单个对象。
你可以做你想做的,target-specific variables:
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 $@