QMake - comment copier un fichier sur la sortie
Comment puis-je copier un fichier à partir de mon projet dans le répertoire de sortie avec qmake?
Je suis compiler sur Linux, mais dans l'avenir je vais compiler sur Mac et Windows.
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de l'un de nos projets. Il montre comment copier des fichiers vers le
DESTDIR
pour Windows et Linux.$${DESTDIR}
étend à la chaîne vide. Le chemin d'accès à${FILE}
est relatif au répertoire de construction, pas pour le répertoire source.CONFIG += file_copies
et est vraiment très propre.Vous pouvez utiliser un qmake fonction de réutilisabilité:
de l'utiliser ensuite comme suit:
$$OUT_PWD
au lieu de$$DESTDIR
pour le faire fonctionner. Pour référence$$OUT_PWD
est le dossier que le programme est construit pour, et$$PWD
est le dossier que le programme est construit à partir d'-en d'autres termes, il est où le .pro fichier.defineTest
au lieu dedefineReplace
? Je ne pouvais pas obtenir qmake pour construire ce avecdefineReplace
mais je ne comprends pas pourquoi. Le docs dire que "Ce type de fonction doit être utilisée dans les expressions conditionnelles seulement", ce qui n'est pas vrai dans ce cas.QMAKE_POST_LINK
ligneQMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($$DDIR)$$escape_expand(\\n\\t\\n\\t)
Les multiples retours à la ligne ont été nécessaires en raison d'un chemin d'accès windows peut mettre fin au `\`, mais qui échappe à la ligne et fait de continuer à la prochaine.$$quote
avec$$shell_quote
et$$DESTDIR
avec$$OUT_PWD
.Si vous utilisez make install, vous pouvez utiliser le INSTALLE variable de qmake. Voici un exemple:
puis exécuter
make install
.Qt 5.6 ajouté cela comme une fonctionnalité non documentée:
Inventer un nom pour décrire les fichiers que vous souhaitez copier:
Liste les fichiers que vous souhaitez copier, dans son
.files
membre:Spécifier le chemin d'accès de destination dans le
.path
membre:Éventuellement spécifier un chemin d'accès de base à être coupé à partir de la source chemins:
Il fonctionne en fait en faisant les mêmes choses que de nombreuses autres réponses ici. Voir file_copies.prf pour les détails sanglants.
L'interface est très similaire à celle pour
INSTALLE
.$(COPY_DIR)
est assez douloureuse pour l'injection sans cette.J'ai trouvé, j'ai dû modifier la réponse donnée par sje397. pour Qt5 Beta1 avec QtCreator 2.5.2. J'utilise ce script pour copier les fichiers qml dans le répertoire de destination comme une outre, l'étape après la construction est terminée.
Mon .fichier pro a le code suivant
}
Noter que j'utilise utiliser $$PWD_WIN de fournir le chemin complet vers le fichier source de la commande de copie.
Créer un fichier
copy_files.prf
dans un des chemins qui utilise qmake pour config caractéristiques. Le fichier devrait ressembler à ceci:Comment il fonctionne
La première partie définit un extra compilateur qui va lire l'entrée des noms de fichier de la
COPY_FILES
variable. La partie suivante définit la fonction qui sera utilisé pour synthétiser un nom de fichier de sortie correspondant à chaque entrée. Ensuite, nous définissons les commandes utilisées pour invoquer cette "compilateur", selon le type de shell, nous sommes dans.Ensuite, nous définissons un extra makefile cible
copy_files.cookie
, qui dépend de la ciblecompiler_copy_files_make_all
. Ce dernier est le nom de la cible qui qmake génère pour le compilateur que nous avons défini dans la première étape. Cela signifie que lorsque lecopy_files.cookie
cible est construit, il invoquera l'extra compilateur pour copier les fichiers.Nous spécifier une commande à exécuter par cette cible, qui
touch
les fichierscopy_files.cookie
etcompiler_copy_files_make_all
. En touchant ces fichiers, nous nous assurons quemake
ne va pas essayer de copier les fichiers à nouveau à moins que les horodatages sont plus récents que le touché de fichiers. Enfin, nous ajoutonscopy_files.cookie
à la liste des dépendances de lamake all
cible.Comment l'utiliser
Dans votre
.pro
fichier, ajoutercopy_files
à laCONFIG
variable:Puis ajoutez les fichiers à la
COPY_FILES
variable:Que plus de Jake répondre et @Phlucious commentaire on peut utiliser qmake
defineReplace
fonction des suites de mieux pour ce cas d'utilisation. Après l'aide de l'exemple, j'ai rencontré un problème, où qmake raté le dernier post le lien de l'action ai-je ajouté. Qui peut être un problème avec l'exportation de la variable si le contenu avait l'air assez bien tout le temps. Longue histoire courte, ici ist le code modifiéCette copie générale de la fonction peut être utilisée par certaines fonctions de confort comme celui-ci
Le second ne prendre qu'un seul argument (un ou plusieurs fichiers) et fournit un chemin fixe. À peu près la même que dans les références réponse.
Mais maintenant, remarque l'invocation différence
Comme vous pouvez le voir, vous pouvez joindre le retour de la commande à QMAKE_PRE_LINK pour encore plus de flexibilité.
Tout d'abord, définissons ci-dessous (qui est de
XD
cadre) quelque part, comme à l'intérieur defunctions.prf
fichier:et à utiliser dans votre projet comme:
Noter que tous les fichiers sont copiés avant l'opération du lien qui est fait (ce qui peut être utile).
xd_functions.prf
script completMais lorsque vous besoin de quelque chose comme
copyFileLater(source, destination)
, de copier seulement les fichiers une fois le build est fait alors envisager l'utilisation de code ci-dessous (qui est deXD
cadreApache 2.0
licence):Tout d'abord, de définir les deux fonction pour soutenir à la fois Windows/Unix.
Ensuite, vous pouvez utiliser le code suivant pour appeler le funcitons que défini avant de copier les fichiers dans le dossier spécifique, et également de la création du répertoire si nécessaire. Ceci est testé sous Win32, Linux tests sont les bienvenus.