script programas pasar parametros operaciones manejo funciones entorno ejemplos con comando cadenas aritmeticas bash shell ubuntu fortran gfortran

bash - programas - script linux ejemplos



Compilar usando nombres de variables en script bash (1)

Estoy tratando de escribir un script bash que automatice una instalación (lo sé, lo sé, debería usar make ), y está destinado a ser genérico: admite diferentes compiladores y marcadores de compilación.

Por ejemplo, tengo estas líneas:

$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

con las variables establecidas como

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"

Que devuelve estos errores:

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

Pero cuando ejecuto los mismos comandos en forma larga (es decir, gfortran -O -fcray-pointer -fdefault-integer-8 -m64 -Dlinx64 -c -o lagrit_main.o lagrit_main.f ) se genera sin problemas.

¿Que me estoy perdiendo aqui? He intentado diferentes permutaciones de las líneas variables, que incluyen:

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

que todos resultan en el mismo error.

EDITAR : para aclarar, esto está en Ubuntu 16.04


Cuando se ejecuta este comando:

$FORTRAN_COMPILER $LINKERFLAGS lagrit_main.o lagrit_main.f

El terminal lo analiza así:

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

Puede ver que los indicadores del enlazador se interpretan como una cadena y se pasan a gfortran como una cadena. Esta es la raíz del error.

La solución es, en cambio, definir los indicadores del vinculador como una matriz, con cada argumento como un elemento en esta matriz:

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