2017-05-25 1 views
0

J'essaie d'ajuster un script de test bash qui construit automatiquement un paquet. La partie pertinente du script est:Option non valide transmise à GNU make though Bash array

# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/i686/build.log 
# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/x86_64/build.log 
if [[ ("$IS_X86" -ne "0") ]]; then 
    MARCH_OPT=(-m32 -march=i686) 
else 
    MARCH_OPT=(-m64 -mtune=generic) 
fi 

FEDORA_FLAGS=(-DHAVE_CONFIG_H -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 
    -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 
    -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 "${MARCH_OPT[@]}" -fasynchronous-unwind-tables) 

"$MAKE" distclean > /dev/null 2>&1 

CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS="${FEDORA_FLAGS[@]}" cryptest.exe 2>&1 

Sa production une erreur:

Testing: Fedora standard build 

make: invalid option -- 'g' 
make: unrecognized option '--param=ssp-buffer-size=4' 
make: invalid option -- 'c' 
make: invalid option -- '=' 
make: invalid option -- '/' 
make: invalid option -- 'u' 
make: invalid option -- '/' 
make: invalid option -- '6' 
make: invalid option -- '4' 
make: invalid option -- 'u' 
make: invalid option -- '=' 
make: invalid option -- 'g' 
make: invalid option -- 'c' 
Usage: make [options] [target] ... 
Options: 
    -b, -m      Ignored for compatibility. 
    -B, --always-make   Unconditionally make all targets. 
    -C DIRECTORY, --directory=DIRECTORY 
           Change to DIRECTORY before doing anything. 
    -d       Print lots of debugging information. 
    --debug[=FLAGS]    Print various types of debugging information. 
    -e, --environment-overrides 
           Environment variables override makefiles. 
... 

Je pense que le problème a quelque chose à voir avec le tableau Bash. Mais je suis assez sûr que les choses sont correctes à ce sujet. Les éléments sont entourés de parenthèses; et ses éléments sont référencés avec ${VAR[@]}. J'ai également essayé de citer chaque valeur dans le tableau FEDORA_FLAGS, mais il a produit la même erreur.

Qu'est-ce qui produit l'erreur et comment la réparer?

Répondre

1

CXXFLAGS="${FEDORA_FLAGS[@]}" doit être CXXFLAGS="${FEDORA_FLAGS[*]}"; le comportement d'un tableau @ -indexed lorsqu'il est cité signifie que seul le premier élément du tableau est traité comme faisant partie du mot commençant par CXXFLAGS; le reste des éléments sont traités comme des arguments à $MAKE lui-même. Vous obtenez

CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS=-DHAVE_CONFIG_H -I. -O2 -g ... 

au lieu de

CXX="g++" "$MAKE" "${MAKEARGS[@]}" "CXXFLAGS=-DHAVE_CONFIG_H -I. -O2 -g ..." 
+0

Merci Chepner. Le '' $ {FEDORA_FLAGS [*]} "' l'a corrigé. C'est le genre de chose qui prend le plaisir des scripts Bash. S'ils nous disent de faire quelque chose (comme utiliser la syntaxe '' $ {VAR [@]} "'), alors cela devrait fonctionner partout sans avoir besoin de se souvenir de règles spéciales. Dans mon cas, je ne connaissais même pas la règle ... – jww

+0

Le problème est que le paramètre 'CXXFLAGS' est exactement le genre de chose qui ne fonctionne pas pour les paramètres arbitraires. L'utilisation d'un tableau ici ne vous aide en fait pas, car vous finissez par aplatir le tableau en une seule chaîne à transmettre en tant que valeur d'une variable régulière; vous ne passez pas les éléments du tableau en tant que mots séparés. Vous obtiendrez les * mêmes * résultats avec 'FEDORA_FLAGS =" - DHAVE_CONFIG_H -I. ... "' et 'CXXFLAGS =" $ FEDORA_FLAGS "'. – chepner

+0

En d'autres termes: passer des arguments au compilateur en utilisant une seule variable 'CXXFLAGS' signifie que vous ne pouvez pas passer d'arguments contenant des espaces. – chepner