2017-05-26 14 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)。 –