2

尝试使用自动工具构建代码时,我遇到了一个小问题。我的文件结构是:

$ 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 自己检查依赖关系?还是我必须遵守严格的秩序?

4

1 回答 1

0

(评论中的答案。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展)

@Stefan 写道:

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

OP写道:

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

  1. 创建一个依赖列表(makedepf90是一个不错的选择)
$ 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 之后复制粘贴步骤 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 的其他地方它是否会工作。但这是有效的。

于 2015-01-25T17:18:40.993 回答