bash - скрипты - shell script для чайников



Компиляция с использованием имен переменных в сценарии bash (1)

Я пытаюсь написать сценарий bash, который автоматизирует установку (я знаю, я знаю, я должен использовать make ), и он должен быть общим: поддержка разных компиляторов и флагов сборки.

Например, у меня есть следующие строки:

$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

которые все приводят к той же ошибке.

EDIT : для уточнения, это на Ubuntu 16.04


Когда эта команда запущена:

$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




gfortran