web-dev-qa-db-fra.com

qMake: Comment qmake interprète-t-il exactement la syntaxe "CONFIG (debug, debug | release)"

J'ai lu cependant ICI , mais je ne comprends toujours pas la syntaxe du qmake CONFIG variable. par exemple, si j'ai les paramètres CONFIG suivants dans mon .pro file:

CONFIG(debug, debug|release) {
    message("debug mode")
}else {
    message("release mode")
}

puis, lors de l'exécution de qmake, les éléments suivants seront affichés dans la sortie de compilation dans Qt-Creator:

Project MESSAGE: debug mode
Project MESSAGE: debug mode
Project MESSAGE: release mode

sachant que je construis mon projet dans un "mode de débogage" , alors mes questions sont:

  • pourquoi ne pas afficher uniquement le message "mode débogage" ? et pourquoi ne pas le montrer une seule fois?
  • Puis, comme je construis en "mode débogage", pourquoi le message "Projet MESSAGE: mode release" est affiché ?
  • Exactement, ce que la syntaxe: CONFIG (debug, debug | release) signifie vraiment? signifie-t-il que construire en mode débogage, puis à nouveau mode de débogage et enfin construire dans un mode de sortie? Je sais que ces crochets "{}" signifient un portée mais comment qmake interpréter ce qui est à l'intérieur de ces crochets "()"?
40
hashDefine

Dans l'article auquel vous avez lié, il est dit au tout début que le fichier de projet est traité trois fois. Cela devrait répondre à votre première question; comme il est traité trois fois, votre message () est également exécuté trois fois. Pourquoi est-il traité plusieurs fois? Parce que qmake ne construit pas votre projet! Il ne génère que des instructions de construction qui sont ensuite utilisées pour réellement construire le projet. Afin de générer des instructions de construction pour toutes les configurations possibles, il doit traiter le fichier de projet plusieurs fois, une fois pour chaque configuration.

Pour votre deuxième question: votre projet est construit uniquement en mode débogage si c'est ce que vous avez sélectionné, mais des instructions de construction sont également créées pour le mode release, comme déjà mentionné ci-dessus. Lorsque vous utilisez "make" avec mingw par exemple (plutôt que Visual Studio), vous obtenez deux Makefiles: Makefile.Release Et Makefile.Debug. Lorsqu'il génère le makefile de version, c'est alors que le "mode de version" est imprimé.

Enfin, CONFIG(debug, debug|release) a la valeur true si CONFIG contient "debug" mais pas "release", ou s'il contient à la fois "debug" et "release" mais "release" n'apparaît pas après la dernière occurrence de " déboguer". Par exemple, vous pourriez avoir ceci:

CONFIG += release debug release debug release debug

Puisque le dernier "débogage" vient après la dernière "version", CONFIG(debug, debug|release) est vrai.

Le premier argument de CONFIG () ("debug" dans ce cas) est la valeur qui doit apparaître en dernier. Le deuxième argument ("debug | release") est l'ensemble de valeurs par rapport auquel le premier argument est vérifié.

Traduire cela en anglais donnerait quelque chose comme ceci: évaluez à true si "debug" apparaît au moins une fois et, dans le cas où "release" apparaît également, la dernière apparition de "debug" intervient après la dernière apparition de "release".

58
Nikos C.