2017-05-26 56 views
4

我想寫一個bash腳本來自動安裝(我知道,我知道,我應該使用make),它的目的是通用的:支持不同的編譯器和編譯標誌。在bash腳本中使用變量名編譯

舉例來說,我有這些行:

$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 

設置爲

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" 

的變量,將返回這些錯誤:

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 

這些都導致相同的錯誤。

編輯:爲了澄清,這是在Ubuntu 16.04

+0

在同一個bash腳本聲明的所有變量?如果沒有,你可能會錯過'export VAR' ... –

+0

他們是;實際上,我已經完成了一個'echo'$ FORTRAN_COMPILER $ BUILDFLAGS $ LAGRIT_NAME $ BUILDLIBS $ BUILDSUFFIX「(以及其他兩行),輸出與硬編碼的'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

在每個遇到的每個shell中,都會發生分詞,$ FORTRAN_COMPILER $ LINKERFLAGS將$ LINKERFLAGS的組件作爲單獨參數傳遞給$ FORTRAN_COMPILER。如果這是實際的解決方案,哪個版本的shell正在被使用? –

+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)。 –