0

デフォルトのシェルで実行されるバイナリがあります。

バイナリは次のように完全に動作します:

./binary input.dat

ただし、これをメイクファイルに入れると:

 SHELL=/bin/bash

 runos:
      ./binary input.dat

コードがクラッシュし、どうすることもできません。これまでにテストしたものは、Make ファイル内とシェル内のすべてです。

  1. ulimit -a: 同一。
  2. 上記のように、シェルを bash に設定します。
  3. SHELL と Make の環境変数の差分:

    env | sort > vars.1

    インサイドメイク

    env | sort > vars.2

    次に、次のコマンドを使用して、Make で追加の変数を使用してバイナリを実行します。

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

  4. シェルと内部の strace:

    strace -o debug binary input.dat

コードは Make でクラッシュし続け、シェルで実行されます。私はすでに、テスト ケース用に Make をダンプして、シェル スクリプトだけを作成することを考えています。しかし、私は違いが何であるかを知りたいと思っています。

Fortran コード (F77、F90、および F95 の混合) は、gfortran-4.4 および次のオプションでコンパイルされました。

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があります: 関数を含む aを書きました:

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そのため、バイナリが失敗する可能性がある方法で新しいサブシェルをフォークすることを考えています (ただし、RHEL 5.8 では Make は機能しました)。

4

1 に答える 1

0

解決策: ソースから make をコンパイルします ...

詳しくはこちらをご覧ください。

OK、かなり必死になった後、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 で非常に奇妙なバグに遭遇したと思います。

于 2012-12-28T14:57:20.363 に答える