二进制fortran文件在Make下崩溃

时间:2012-12-28 10:37:08

标签: makefile fortran

我有一个在我的默认shell下运行的二进制文件。

二进制文件完美运行o.k.用:

./binary input.dat

但是,如果我把它放在一个make文件中:

 SHELL=/bin/bash

 runos:
      ./binary input.dat

代码崩溃,让我很无奈。 这是我到目前为止测试的内容,Make文件和shell中的所有内容:

  1. ulimit -a:相同。
  2. 如上所示将shell设置为bash。
  3. SHELL中环境变量的差异和Make with:

    env | sort > vars.1

    内部制作

    env | sort > vars.2

    然后使用以下命令在Make中运行带有额外变量的二进制文件:

    env SHLVL=2 MAKELEVEL=1 MAKEFLAGS= ./binary input.dat

  4. 在shell和里面做strace:

    strace -o debug binary input.dat

  5. 代码在Make中继续崩溃,并在shell中运行。我已经在考虑为我的测试用例转储Make并编写shell脚本。但我很想知道有什么区别。

    使用gfortran-4.4和以下选项编译Fortran代码(F77,F90和F95的混合代码):

    FFLAGS= -g -fbacktrace
    

    所以,具体的问题是,我该怎样做才能让这个二进制文件在Debian中运行make?!

    更新

    我刚刚在CentOS机器(v5.8)中测试过,Makefile中的代码没有崩溃(GNU Make 3.81版)。 我还在我的Debian Wheezy和openSUSE 11.4上进行了测试,两者都使用GNU Make 3.82版 - 它崩溃了! 我使用GNU Make版本3.81在Debian Squeeze上测试,它确实崩溃了。所以,我认为它不依赖于GNU Make版本。

    崩溃时出现

    错误:

     enter timeloop
     ------------------------------------------------------------------------
     timestep:     1  time: 2.500E-02 days         delt: 2.500E-02 days        
     -------------------------------------------
        terminated in routine react_snia      
        maximum number of iterations exceeded   
        bye now ...                             
     -------------------------------------------
    failure in timeloop
    no further time step reduction possible
    try reducing min. time step, bye now ...
    

    尝试使用'waf'

    解决'GNU Make'问题

    我想测试waf已经有一段时间了,所以这是另一个有趣的观察: 我写了一个wscript,其中包含一个函数:

    import os
    
    def run(ctx):
        os.system('./binary input.dat')
    

    waf run正在运行!

    如果我将run方法更改为:

    import subprocess as sp
    def run(ctx):
        sp.call('./binary input.dat', shell=True)
    

    二进制文件按预期工作

    所以,现在我想GNU Make以一种导致二进制失败的方式分叉一个新的子shell(虽然在RHEL 5.8 Make下工作)。

1 个答案:

答案 0 :(得分:0)

解决方案:从源代码编译make ...

阅读以了解更多信息。

好的,所以在非常绝望之后,我做了我应该做的事情,然后责怪make我所有的麻烦。
我认为问题是Debian特有的。但我猜测CentOS-5.8中的版本是修补版本,虽然它说的是v.3.81。 所以,对于那些不知道我的解决方案的人是:

wget http://ftp.gnu.org/gnu/make/make-3.82.tar.gz
tar xvzf make-3.82.tar.gz
cd make-3.82
./configure
./build.sh
 # copy make to the directory with the binary and input and run the local make version
./make
# everything works as expected !!!

我以为让它缩小范围 -

wget http://ftp.gnu.org/gnu/make/make-3.80.tar.gz
tar xvzf make-3.80.tar.gz
cd make-3.80
./configure
./build.sh
 # copy make to the directory with the binary and input and run the local make version
./make
# everything works as expected !!!

是版本3.81吗?

wget http://ftp.gnu.org/gnu/make/make-3.81.tar.gz
tar xvzf make-3.81.tar.gz
cd make-3.81
./configure
./build.sh
 # copy make to the directory with the binary and input and run the local make version
./make
# FAIL! Like with the make version in Debian.

因此,我想我在GNU Make v.3.81中碰到了一些非常奇怪的错误。