在尝试使用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将检查依赖关系 本身?或者我必须保持严格的订单?
答案 0 :(得分:0)
(评论中的答案。见Question with no answers, but issue solved in the comments (or extended in chat))
@Stefan写道:
OP写道:您可以直接在
Makefile.am
输入相关性。因此,只需将您手写的Makefile规则(帖子中的第三个代码部分)放在Makefile.am
中。据我所知,自动依赖性跟踪不可能。这可能会随着子模块的添加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现。
根据@ Stefan的评论,我在make文件中添加了依赖项,这解决了问题。我已经测试过源代码的顺序不再重要了。因为,互联网上没有太多东西可供使用,我在这里提供完整的程序:
- 创建一个依赖列表(
醇>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
- 只需在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中的其他地方,我还没有测试它是否会起作用。但这很有效。