与fortran的automake:文件的顺序

时间:2013-07-25 17:26:16

标签: 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 = 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 

问题是src /(*。f90),除了main.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_SOURCES。即 来源为:

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将检查依赖关系 本身?或者我必须保持严格的订单?

1 个答案:

答案 0 :(得分:0)

(评论中的答案。见Question with no answers, but issue solved in the comments (or extended in chat)

@Stefan写道:

  

您可以直接在Makefile.am输入相关性。因此,只需将您手写的Makefile规则(帖子中的第三个代码部分)放在Makefile.am中。据我所知,自动依赖性跟踪不可能。这可能会随着子模块的添加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现。

OP写道:

  

根据@ Stefan的评论,我在make文件中添加了依赖项,这解决了问题。我已经测试过源代码的顺序不再重要了。因为,互联网上没有太多东西可供使用,我在这里提供完整的程序:

     
      
  1. 创建一个依赖列表(makedepf90是一个不错的选择)
  2.   
$ 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
  
      
  1. 只需在scasr_SOURCES:
  2. 之后复制粘贴步骤1的输出   

scasr_SOURCES = src/main.f90\ src/constants.f90 src/environment.f90 rc/util.f90 src/init.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

  

注意:如果你把它放在makefile中的其他地方,我还没有测试它是否会起作用。但这很有效。