2017-05-26 16 views
4

私はインストールを自動化するbashスクリプトを書こうとしています(私は知っていますが、私はmakeを使用しています)、異なるコンパイラとビルドフラグをサポートしています。bashスクリプトで変数名を使ってコンパイルする

これらのエラーを返す
FORTRAN_COMPILER=gfortran 
LINKERFLAGS="-O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o" 
BUILDFLAGS="-O -Dlinx64 -fcray-pointer -fdefault-integer-8 -fno-sign-zero -o" 
BUILDLIBS="lagrit_main.o lagrit_fdate.o lagrit_ulin64_o_gcc.a $LAGRIT_UTIL_DIR/util_ulin64_o_gcc.a" 
BUILDSUFFIX="-L$ACCESS -lexodus -lexoIIv2for -lnetcdf -lm -lstdc++" 
MAKEFLAG="MOPT=64" 

として設定された変数と

$FORTRAN_COMPILER $LINKERFLAGS lagrit_main.o lagrit_main.f 
$FORTRAN_COMPILER $LINKERFLAGS lagrit_fdate.o lagrit_fdate.f 
make $MAKEFLAG lib 
$FORTRAN_COMPILER $BUILDFLAGS $LAGRIT_NAME $BUILDLIBS $BUILDSUFFIX 

gfortran: error: lagrit_main.o: No such file or directory 
gfortran: error: lagrit_fdate.o: No such file or directory 

gfortran: error: lagrit: No such file or directory 
gfortran: error: lagrit_main.o lagrit_fdate.o lagrit_ulin64_o_gcc.a /scratch/sft/livingston/build/shared/LaGriT/lg_util/src/util_ulin64_o_gcc.a: No such file or directory 

しかし、私は同じことを実行

例えば、私はこれらの行を持っています長い形式のコマンド(つまり、gfortran -O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o lagrit_main.o lagrit_main.f)が問題なく構築されます。

私はここで何が欠けていますか?私は可変ラインの異なる順列を試しました。

gfortran $LINKERFLAGS lagrit_main.o lagrit_main.f 
"$FORTRAN_COMPILER" "$LINKER_FLAGS" lagrit_main.o lagrit_main.f 
${FORTRAN_COMPILER} ${LINKER_FLAGS} lagrit_main.o lagrit_main.f 

これらはすべて同じエラーになります。

EDIT:明確にするために、このコマンドを実行すると、これはUbuntuの16.04

+0

は、すべての変数が同じbashスクリプトで宣言されています:

ソリューションは、この配列の要素は、それぞれの引数を指定して、代わりに配列としてリンカのフラグを定義することですか?もしそうでなければ、あなたは '輸出VAR'を見逃しているかもしれません... –

+0

彼らはそうです;実際、私は 'echo $ FORTRAN_COMPILER $ BUILDFLAGS $ LAGRIT_NAME $ BUILDLIBS $ BUILDSUFFIX"を(他の2行とともに)実行しました。出力は、ハードコードされた 'gfortran'コマンドが正確に一致しています。 –

+1

-oを変数から最終コールラインに移動すると、問題は解決されますか? –

答えて

1

である:

$FORTRAN_COMPILER $LINKERFLAGS lagrit_main.o lagrit_main.f 

それは、このような端末で解析されます。

gfortran '-O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o' lagrit_main.o lagrit_main.f 

ますリンカーフラグが文字列として解釈され、gfortranに文字列として渡されることがわかります。これがエラーの根本です。

LINKERFLAGS=(-O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o) 
$FORTRAN_COMPILER ${LINKERFLAGS[*]} lagrit_main.o lagrit_main.f || exit 1 
+0

私はすべての遭遇したすべてのシェルで、単語分割が発生し、$ FORTRAN_COMPILER $ LINKERFLAGSは$ LINKERFLAGSのコンポーネントを個々の引数として$ FORTRAN_COMPILERに渡します。これが実際のソリューションであれば、どのバージョンのシェルが使用されていますか? –

+0

私は通常同じことに遭遇します。しかし、このスクリプトは、何らかの理由で、このように動作しません。私はbash 4.3.46(Ubuntu 16.04)とzsh 5.2 w/bash 3.2.57(macOS Sierra)で実行しました。異なる環境でこのスクリプトを使用している他の人も同じことを報告しています。 –

+0

完全なスクリプトは[ここ](https://github.com/lanl/LaGriT/blob/master/install.sh)で見ることができます。 –

関連する問題