如何使用带有 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 ,可以对其进行配置。但是,由于单独的依赖项 obj1obj2 未使用 -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 $@