用fortran自动生成:文件顺序
在尝试使用autotools构建代码时,我遇到了一个小问题。 我的文件结构是:用fortran自动生成:文件顺序,fortran,automake,Fortran,Automake,在尝试使用autotools构建代码时,我遇到了一个小问题。 我的文件结构是: $ tree . |-- configure.ac |-- Makefile.am `-- src |-- constants.f90 |-- environment.f90 |-- init.f90 |-- main.f90 `-- util.f90 (删除了可能不必要的行) 我的Makefile.am是: #SUBDIRS= help bin_PROGRAMS = sc
$ tree
.
|-- configure.ac
|-- Makefile.am
`-- src
|-- constants.f90
|-- environment.f90
|-- init.f90
|-- main.f90
`-- util.f90
(删除了可能不必要的行)
我的Makefile.am是:
#SUBDIRS= help
bin_PROGRAMS = scasr
scasr_SOURCES = \
src/constants.f90 src/environment.f90 src/util.f90 \
src/init.f90 src/main.f90
scasr_LDADD =
EXTRA_DIST= autogen.sh
CLEANFILES =*.mod
除了main.f90是模块外,问题是src/(*.f90)的。因此,如果我
必须手动编写makefile,我将:
constants.o : constants.f90
environment.o : environment.f90
init.o : init.f90 util.o constants.o
main.o : main.f90 init.o constants.o environment.o
util.o : util.f90 constants.o
因此,对于Makefile.am,我必须在
scasr_来源。即
资料来源如下:
scasr_SOURCES = \
src/constants.f90 src/environment.f90 src/util.f90 \
src/init.f90 src/main.f90
它编译得很好。
但如果我有:
scasr_SOURCES = src/main.f90 \
src/constants.f90 src/environment.f90 src/util.f90 \
src/init.f90
我得到一个错误:
make all-am
make[1]: Entering directory `/home/rudra/Programs/ScASR/trunk'
gfortran -g -O2 -c -o src/main.o src/main.f90
src/main.f90:7.4:
use mget_env
1
Fatal Error: Can't open module file 'mget_env.mod' for reading at (1):
No such file or directory
make[1]: *** [src/main.o] Error 1
有没有办法让make/configure通过
它本身或者我必须遵守严格的秩序(见评论中的答案)
@斯特凡写道:
您可以直接将依赖项输入到
Makefile.am
。因此,只需将手写的Makefile规则(文章中的第三部分代码)放入Makefile.am
。据我所知,自动依赖跟踪是不可能的。这可能会随着子模块的增加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现
OP写道:
根据@Stefan的评论,我在make文件中添加了依赖项,这解决了问题。我已经测试过,源代码的顺序不再重要了。由于互联网上的资料不多,我将完整的程序放在这里:
makedepf90
是一个不错的选择)scasr\u SOURCES=src/main.f90\src/constants.f90 src/environment.f90 rc/util.f90 src/init.f90 src/constants.o:src/constants.f90 src/environment.f90 src/init.o:src/init.f90 src/util.o src/main.o:src/main.f90 src/init.o src/constants.o src/environment.o src/util.o:src/utilsrc/constants.o
注意:我还没有测试如果你把它放在makefile的其他地方,它是否会工作。但这是可行的
严格的订单有什么问题?项目仍在生产中。因此,只需添加文件名和在适当位置添加文件名就大不相同了。您可以直接将依赖项输入到
Makefile.am
。因此,只需将手写的Makefile规则(文章中的第三部分代码)放入Makefile.am
。据我所知,自动依赖跟踪是不可能的。这可能会随着子模块的增加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现。有人知道当前版本的Automake中是否提供Fortran依赖项跟踪吗?@MaliRemarker:Shor答案是否定的。我已经做了一个替代方案(在linux系统中):depend dependen.mk:makedepf90$(kkr_源代码)>dependen.mk@am_uinclude@@am__quote@depend.mk@am_uuquote@
这里的“kkr”是bin_程序。Linebreak并没有正确地进行,但希望你们能理解。makedepf90在大多数linux发行版中都可用。希望这有帮助
$ makedepf90 src/*.f90 src/constants.o : src/constants.f90 src/environment.o : src/environment.f90 src/init.o : src/init.f90 src/util.o src/constants.o src/main.o : src/main.f90 src/init.o src/constants.o src/environment.o src/util.o : src/util.f90 src/constants.o