Fortran Coder

查看: 9268|回复: 9
打印 上一主题 下一主题

[IDE] Makefile 项目管理(升级版)

[复制链接]

68

帖子

23

主题

0

精华

熟手

F 币
244 元
贡献
132 点
楼主
发表于 2023-8-4 20:56:44 | 显示全部楼层
Jackdaw 发表于 2019-1-29 13:59
也有,以前写的,很简单的一个帖子
使用cmake管理Fortran项目(demo)

这个模板非常好,我正在好好学习。有个问题不明白,想请教楼主,第9行为何=号前面有:号呢?这表示什么呢?我在makefile的书写规则里查不到这个,希望楼主指点一下,非常感谢!

68

帖子

23

主题

0

精华

熟手

F 币
244 元
贡献
132 点
沙发
发表于 2023-8-4 22:37:33 | 显示全部楼层
本帖最后由 静待花开 于 2023-8-5 11:13 编辑
kyra 发表于 2023-8-4 21:22
首先你需要理解,makefile文件并不是像编程语言一样按行执行的,make会一次性的把makefile读取完,并根据 ...

非常感谢版主回得这么快、这么详细。经过您的讲解,我理解了楼主这样处理 似乎就是为了 编译含有module这样的程序。这种处理 module的巧妙,令人佩服。因为我按照常规方法准备Makefile,make后总是提示找不到.mod文件,所以才找到了这个经典的贴子。
把楼主的文件down下来操作一遍,总是有问题,不能make成功。才发现makedepf90也是一个需要预先安装的程序,sudo apt install makedepf90。然后顺利编译成功。谢谢楼主提供这么好的一个Makefile模板。
打算在这个基础上再修改一下,不需要自己输入第8行、第9行的文件名,不知道可不可行。

68

帖子

23

主题

0

精华

熟手

F 币
244 元
贡献
132 点
板凳
发表于 2023-8-6 10:35:39 | 显示全部楼层
kyra 发表于 2023-8-4 21:22
首先你需要理解,makefile文件并不是像编程语言一样按行执行的,make会一次性的把makefile读取完,并根据 ...

查了好多,没有见到解释 25行/28行 中的 -J 是表示什么,可否请版主指点下?非常感谢

68

帖子

23

主题

0

精华

熟手

F 币
244 元
贡献
132 点
地板
发表于 2023-8-6 21:37:58 | 显示全部楼层
kyra 发表于 2023-8-6 10:55
-J 不是 make 的语法哟,是 gfortran 的命令行参数。
表示指定 .mod 文件所在的路径。

嗯嗯,明白了,非常非常感谢,我还得继续学习gfortran,也是刚接触 。

68

帖子

23

主题

0

精华

熟手

F 币
244 元
贡献
132 点
5#
发表于 2023-8-7 21:32:24 | 显示全部楼层
本帖最后由 静待花开 于 2023-8-8 15:56 编辑
kyra 发表于 2023-8-6 10:55
-J 不是 make 的语法哟,是 gfortran 的命令行参数。
表示指定 .mod 文件所在的路径。

这是我在楼主基础上修改后的。就是想做得更通用一点,不需要用户在makefile里面输入源代码文件名(如原makefile第8、第9行)。思路是:把module文件的后缀都改为.module,一个module写在一个.module文件中,并且文件名与module名称完全一样。但make之后,生成的*.mod文件除了输出到mod文件夹内,还输出在了makefile所在的目录(即与makefile放在一起),能编译成功,但多了这些.mod文件,还需要在删除。试了好多办法,实在想不到更好办法,想请版主看看是什么问题。楼主看到的话,也请指点一下。
下面是我改后makefile文件。
#!/bin/bash
# 设置文件路径
SRCDIR  = src
OBJDIR  = obj
MODDIR  = mod
BINDIR  = bin

# 文件
SRC      = $(wildcard $(SRCDIR)/*.f90)
OBJ      = $(addprefix $(OBJDIR)/, $(patsubst %.f90,%.o,$(notdir $(SRC))))

MODSRC   = $(wildcard $(SRCDIR)/*.module)
MODOBJ   = $(addprefix $(OBJDIR)/, $(patsubst %.module,%.o,$(notdir $(MODSRC))))

MOD      = $(addprefix $(MODDIR)/, $(patsubst %.module,%.mod,$(notdir $(MODSRC))))


# 编译器相关设置
FC     = gfortran
FF     = -cpp -O0 -g -fbacktrace
DF     = -DDOUBLE_PRECISION
EXE    = myPro

# 所有目标
all: $(OBJDIR)/depend binary

# 依赖关系
include $(OBJDIR)/depend


# 链接
binary: $(OBJ) $(MODOBJ)
    $(FC) $(FF) $(DF) -J$(MODDIR) $(OBJ) $(MODOBJ) -o $(BINDIR)/$(EXE)

# 编译
$(OBJ): $(SRC) $(MOD)
    $(FC) $(FF) $(DF) -J$(MODDIR) -c $< -o $@

$(OBJDIR)/%.o: $(SRCDIR)/%.module
    $(FC) -c -cpp -x f95 $< -o $@

$(MODDIR)/%.mod: $(SRCDIR)/%.module
    $(FC) -c -cpp -x f95 $< -o $@

# 检查路径,并生成依赖关系
.PONHY: $(OBJDIR)/depend
$(OBJDIR)/depend:   
    @if test -d $(SRCDIR); then echo "# directory "$(SRCDIR) "exists"; else mkdir $(SRCDIR); fi  
    @if test -d $(OBJDIR); then echo "# directory "$(OBJDIR) "exists"; else mkdir $(OBJDIR); fi
    @if test -d $(MODDIR); then echo "# directory "$(MODDIR) "exists"; else mkdir $(MODDIR); fi
    @if test -d $(BINDIR); then echo "# directory "$(BINDIR) "exists"; else mkdir $(BINDIR); fi
    makedepf90 -b $(OBJDIR) $(SRCS) > $(OBJDIR)/depend        

clean-all:        
    rm -rf $(OBJDIR)/depend *.o *.mod $(MOD) $(MODOBJ) $(OBJ) $(BINDIR)/$(EXE)     


MakefileFortProject_2.rar (2.25 KB, 下载次数: 3)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-5 12:54

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表