2017-08-25 6 views
0

Je dois essayer de compiler une pile Qt à partir d'un terminal Linux. Quand je lance qmake, il applique le mkspecs qmake.conf dans mon contexte de telle sorte que la variable CROSS_COMPILE doit être définie. Par exemple, il y a une ligne critique de qui ressemble conf ceci:Comment faire passer une variable QMAKE à partir de la ligne de commande?

QMAKE_CXX    = $${CROSS_COMPILE}g++ 

Qmake renvoie une erreur qui indique clairement que $$ {CROSS_COMPILE} n'est pas résolu. Il utilise simplement "g ++" au lieu de la valeur entière qui devrait être là.

J'ai essayé d'invoquer qmake et définir la variable d'un script bash comme ceci:

qmake qt.pro "CROSS_COMPILE=${CROSS_COMPILE}" 

Et comme ceci:

qmake qt.pro -- "CROSS_COMPILE=${CROSS_COMPILE}" 

Et quelques autres tels coups de couteau à elle. J'ai également essayé de coder en dur la valeur de cette commande au cas où cela aurait quelque chose à voir avec ça. J'ai essayé de définir cela comme une variable d'environnement aussi (juste au cas où) ...

Rien ne fonctionne. Pourtant, j'ai vu des tas d'exemples où cette syntaxe semble être valide. Qu'est-ce qui ne va pas? Pourrait-il y avoir une complication d'échappement de personnage?

+0

Est la partie variable du fichier '.qmake.conf'? les paramètres sont uniquement appliqués au fichier pro, et non au fichier qmake config. Il est possible que vous deviez passer la bonne spécification de qmake via le paramètre '--spec'. Vérifiez le répertoire 'mkspecs' pour trouver le bon, ou créez le vôtre. Cela pourrait fonctionner. – Felix

+0

Merci, Félix. Je vais jeter un coup d'oeil au paramètre --spec. – BuvinJ

Répondre

0

Ce n'est pas la meilleure réponse, mais je « résolu » le problème en ajoutant à mon qmake.conf:

CROSS_COMPILE=$$(CROSS_COMPILE) 

qui ont défini la variable dans qmake en l'obtenant une variable d'environnement, je les réglerai mon script bash d'appel.

0

Votre problème est que le shell a déjà interprété le $ {} dans votre chaîne comme une forme de substitution de variable. Puisque vous n'avez pas défini la variable CROSS_COMPILE dans le shell, elle n'a aucune valeur et ce que qmake a obtenu est en fait les 2 arguments entre guillemets "qt.pro" et "CROSS_COMPILE =", ce qui signifie que vous avez réellement défini un CROSS_COMPILE valeur vide. Ce que vous devriez essayer est:

qmake qt.pro "CROSS_COMPILE=\${CROSS_COMPILE}" 

Notez la barre oblique inverse avant le signe dollar, ce qui échappe à l'empêcher d'avoir une signification particulière à la coquille et lui permet de se passer littéralement sur qmake.

Cette question a déjà été posée sur Stackoverflow:

Define a string in qmake command line

En savoir plus sur la substitution variable de Bash:

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

EDIT:

Exemple: I juste essayé moi-même avec un nouveau fichier de projet avec le suivant Contenu:

SOME_OTHER_VAR = $$ {} some_var _something
message ($$ {SOME_OTHER_VAR})

et de faire

SOME_VAR=value 
qmake qmake_variables.pro "SOME_VAR=${SOME_VAR}" 

fonctionne pour moi, l'impression:

Project MESSAGE: value_something 
+0

Merci. J'avais cependant défini/exporté la variable CROSS_COMPILE dans le shell. J'ai juste omis ce détail de mon message. – BuvinJ

+0

Je viens d'éditer le post. Je voulais d'abord le mettre dans un commentaire, mais le formatage pour les commentaires est terrible. EDIT: Avez-vous vérifié que la valeur de CROSS_COMPILE est bien ce que vous vouliez qu'il soit immédiatement avant d'exécuter qmake dans le script? Ou peut-être que le fichier de projet est tel qu'un fichier make remplacera la valeur définie par l'utilisateur de CROSS_COMPILE quelque part? – Larry

+0

Hmm. Eh bien, au moins cela fonctionne comme si c'était supposé être le cas. Mon problème doit avoir été contextuel d'une certaine façon. Tout cela était déclenché par l'imbrication multiple des scripts. Ces couches pourraient avoir fait partie du problème. Heureusement, j'ai abandonné le processus que j'essayais de lancer, et tout a fonctionné lorsqu'il a été exécuté à un niveau inférieur. – BuvinJ