Question
Je compris ma question précédente était un peu confus au sujet des règles et des dépendances. Le fichier .pro suivant génère un Makefile qui fonctionne correctement si les fichiers source dans le répertoire « généré » existent dans les courses qmake de temps.
idl.target = generated/qmtest.h
idl.commands = code_generator
idl.config = no_link
idl.depends = $$SOURCES $$HEADERS $$FORMS
TEMPLATE = app
INCLUDEPATH += generated
SOURCES += generated/*.cpp
PRE_TARGETDEPS += generated/qmtest.h
QMAKE_EXTRA_UNIX_TARGETS += idl
Mais quand qmake court, sa génération seulement makefile et PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS ne me aide pas. Comment puis-je obtenir qmake pour générer un Makefile qui ajoutera le contenu du produit / aux sources?
La solution
Vous devrez peut-être de le faire en deux passes.
Dans votre fichier qmake, ajoutez la ligne suivante:
include( generated/generated.pri )
Ensuite, à la fin de votre script code_generator, ajoutez les sources au fichier generated.pri (en utilisant bash pour l'exemple, mais l'idée est la même pour presque toutes les langues):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
La première fois que vous exécutez le fichier qmake, généré / generated.pri sera vraisemblablement vide. Lorsque vous exécutez make, il alimente le fichier generated.pri. La deuxième fois, il va recréer le fichier makefile (comme un fichier .pri source a changé), puis compiler à nouveau. Vous pourriez être en mesure de bricoler avec d'autres commandes qui feraient la deuxième étape pour vous.
Autres conseils
J'ai eu la même question tout à l'heure, mais pour une usecase plus simple d'un seul fichier généré. Pour cela, j'ai trouvé un moyen beaucoup plus simple pour y parvenir en utilisant GENERATED_SOURCES au lieu de SOURCES:
dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += dummyfile GENERATED_SOURCES += $$dummyfile.target
Probablement on pourrait pousser que dans une boucle de qmake et générer les cibles appropriées pour plusieurs fichiers ainsi.
Je suis venu avec une solution que je crois être robuste et générale, qui repose sur qmake
générer un Makefile GNU.
Disons que nous avons toutes les affectations de SOURCES
et HEADERS
supplémentaires dans un fichier nommé Makefile.pri
, qui obtient généré en exécutant le generate_Makefile.pri.sh
script qui génère aussi les sources et / ou en-têtes mentionnés dans Makefile.pri
.
Nous voulons que ce fichier automatiquement et de manière fiable généré par le système de construction lui-même, de façon à inclure dans le fichier .pro
, de sorte que qmake
peut prendre en compte le contenu et générer le Makefile avec les dépendances appropriées.
est alors ce que nous devons mettre dans notre fichier .pro
.
Makefile_pri.target = Makefile.pri
Makefile_pri.commands = generate_Makefile.pri.sh
Makefile_pri.depends = FORCE
Makefile.target = $$MAKEFILE
Makefile.depends = Makefile_pri
include($$Makefile_pri.target)
QMAKE_EXTRA_TARGETS = Makefile Makefile_pri
De cette façon:
- s'il n'y a pas
Makefile.pri
, il est créé; - Si
Makefile.pri
est créé ou mis à jour, puisqmake
exécute à nouveau et prend en considération son contenu, la régénération duMakefile
Comme dit, ce fait dépendent de qmake
générer un Makefile GNU, mais la même approche que je pense qu'elle pourrait être adapté pour fonctionner avec d'autres systèmes de construction cible.