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?

Était-ce utile?

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:

  1. s'il n'y a pas Makefile.pri, il est créé;
  2. Si Makefile.pri est créé ou mis à jour, puis qmake exécute à nouveau et prend en considération son contenu, la régénération du Makefile

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top