Je suis nouveau sur le qmake et j'expérimente des structures de projet. J'ai maintenant structuré mon projet comme

./src/
   logic/
   ui/
   controller/
   etc...
./inc/
   logic/
   ui/
   controller/
   etc...

Je voulais créer une fonction qui inclut correctement un nouveau fichier *.h et *.cpp en conséquence, alors j'ai fait :

cont = "controller"
logic = "logic"
ui = "ui"

defineReplace(myFunction) {
    path = $$1
    name = $$2
    HEADERS *= ./inc/$${path}/$${name}.h
    SOURCES *= ./src/$${path}/$${name}.cpp
}

myFunction(cont,file1)

Je m'attendais à ce que le résultat soit comme si je venais de mettre :

HEADERS *= ./inc/controller/file1.h
SOURCES *= ./src/controller/file1.cpp

Mais je viens de recevoir un myFunction is not a recognized test function.

Qu'est-ce que je fais mal?

0
LCsa 31 janv. 2020 à 02:07

1 réponse

Meilleure réponse

Qu'est-ce que je fais mal?

Qmake fait une différence entre les fonctions "replace" (c'est-à-dire renvoyer une chaîne, comme la substitution de variable dans make ; généralement utilisée sur les droites de l'affectation) et les fonctions "test" (renvoyant une valeur booléenne adaptée à l'opérateur conditionnel).

myFunction(cont, file) est un appel d'une fonction de test ; $$myFunction(cont, file) est un appel d'une fonction de remplacement.

Notez également que le fichier Qmake se compose essentiellement d'affectations et de conditions. Par conséquent, myFunction(cont, file) est interprété comme

myFunction(cont, file) {
    # nothing
} else {
    # nothing
}

Un autre problème est que les fonctions de Qmake fonctionnent avec leur propre copie privée des variables, vous devez donc utiliser export() pour rendre vos modifications visibles à l'extérieur. Ainsi, nous avons :

# replace function example code
defineReplace(myFunction) {
    HEADERS *= ./inc/$$1/$${2}.h
    SOURCES *= ./src/$$1/$${2}.cpp
    export(HEADERS)
    export(SOURCES)
    # warning: conditional must expand to exactly one word
    #return()
    # warning: conditional must expand to exactly one word
    #return(foo bar)
    # ok: any word will do as we don't care for true/false evaluation
    return(baz)
}

# test function example code
defineTest(myFunction) {
    HEADERS *= ./inc/$$1/$${2}.h
    SOURCES *= ./src/$$1/$${2}.cpp
    export(HEADERS)
    export(SOURCES)
    # warning: unexpected return value
    #return(foo)
    # ok: returns true
    #return(true)
    # ok: also returns true
    #return()
    # ...or simply return true by default
}

# calling replace function
$$myFunction(cont, file)
# calling test function
myFunction(cont, file)
0
Matt 2 févr. 2020 à 08:17