デフォルトのシェルで実行されるバイナリがあります。
バイナリは次のように完全に動作します:
./binary input.dat
ただし、これをメイクファイルに入れると:
SHELL=/bin/bash
runos:
./binary input.dat
コードがクラッシュし、どうすることもできません。これまでにテストしたものは、Make ファイル内とシェル内のすべてです。
ulimit -a
: 同一。- 上記のように、シェルを bash に設定します。
SHELL と Make の環境変数の差分:
env | sort > vars.1
インサイドメイク
env | sort > vars.2
次に、次のコマンドを使用して、Make で追加の変数を使用してバイナリを実行します。
env SHLVL=2 MAKELEVEL=1 MAKEFLAGS= ./binary input.dat
シェルと内部の 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 は機能しました)。