2010-08-31 3 views
13

Nous avons une base de code assez large. La grande majorité du code est compilé en utilisant qmake pour produire les makefiles. Cependant, certains sous-projets sont produits en exécutant des fichiers batch ou en exécutant d'autres programmes. J'aimerais pouvoir tout compiler en utilisant qmake, mais je n'arrive pas à comprendre comment faire pour que qmake exécute simplement un script.Exécution d'un programme/script à partir de QMake

Une chose que j'ai essayé utilise QMAKE_EXTRA_TARGETS dans mon dossier pro, comme ceci:

TEMPLATE = lib 
SOURCES = placeholder.cpp 
CONFIG += no_link staticlib 
batch_runner.target = placeholder.cpp 
batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS = batch_runner 

je puis avoir le fichier batch produits placeholder.cpp comme ceci:

# do the real work here 
# ... 
# create placeholder.cpp so qmake and nmake are happy 
echo // dummy >> placeholder.cpp 

Cela semble fonctionner correctement. Le problème est que c'est un peu hokey. Si je ne spécifie pas batch_runner.target (c'est-à-dire que je le laisse vide) ou ne placez pas placeholder.cpp dans SOURCES, alors le fichier batch ne sera jamais exécuté. C'est parce que qmake ne fait pas de batch_runner.commands l'action pour toute autre dépendance dans le Makefile.

Existe-t-il un meilleur moyen d'obtenir QMake pour construire un Makefile tel qu'un script est exécuté lorsque le Makefile s'exécute?

Répondre

14

Il ressemble QMAKE_POST_LINK fonctionne bien pour ce genre de chose.

Cela semble faire le travail. my_batch_file.bat s'exécute quand nmake s'exécute (plutôt que lorsque qmake s'exécute) et je n'ai pas besoin de faire quelque chose de drôle avec des cibles ou des fichiers réservés.

Il est fort probable que je n'ai pas besoin de tous les éléments listés dans 'CONFIG'.

TEMPLATE = lib 
TARGET = 
CONFIG += no_link target_predeps staticlib 

QMAKE_POST_LINK = my_batch_file.bat 
QMAKE_CLEAN  += batch_output.obj 
6

Essayez le . Par exemple:

system(pwd) 
+1

Intéressant. Cela fonctionne, mais la commande est exécutée lorsque 'qmake' est exécuté plutôt que lorsque 'nmake' est exécuté. Il arrive aussi d'être exécuté trois fois plutôt que la fois où il devrait vraiment être exécuté. –

+1

Vous devrez peut-être ajouter une certaine portée pour vous assurer qu'elle n'est exécutée qu'une seule fois. –

+0

J'ai juste ajouté la portée à l'exemple de sorte que la commande n'est exécutée qu'une seule fois lorsque qmake est exécuté. – pixelgrease

1

Vous pouvez utiliser la configuration de SUBDIRS pour exécuter plusieurs cibles différentes, même de la même makefile. Cela peut fonctionner particulièrement bien avec vos cibles supplémentaires, car une configuration de sous-répertoire peut spécifier une cible spécifique dans le fichier makefile à exécuter (voir undocumented qmake pour plus de détails). Dans ce cas, je mettrais toutes les commandes de construction "régulières" dans un fichier .pro, les commandes de construction externes dans un autre, et un fichier sous-répertoire .pro pour les construire toutes. Je n'ai rien testé de tel, mais ça devrait marcher.

regular.pro:

SOURCES += main.cpp 
TARGET = regular.exe 

external.pro:

batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += batch_runner 

other_runner.commands = other_batch_file.bat 
QMAKE_EXTRA_TARGETS += other_runner 

do_it_all.pro:

TEMPLATE = subdirs 
CONFIG += ordered 

regular.file = regular.pro 
SUBDIRS += regular 

batch.file = external.pro 
batch.target = batch_runner 
SUBDIRS += batch 

other.file = external.pro 
other.target = other_runner 
SUBDIRS += other 
+0

Cela a le même problème que j'ai souligné dans ma question initiale. La cible supplémentaire ne s'exécutera pas à moins que le .target soit spécifié (vous ne pouvez pas simplement spécifier les commandes) et le .target doit être réellement requis par une autre partie du Makefile, sinon il ne fonctionnera pas. –

5

Voici une autre solution:

TEMPLATE = aux 
OBJECTS_DIR = ./ 
DESTDIR = ./ 

first.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += first 
QMAKE_CLEAN += batch_output.obj 

Le modèle aux produit essentiellement un makefile qui ne fait rien lorsqu'il est exécuté sans spécifier une cible.Les variables OBJECTS_DIR et DESTDIR sont définies dans le répertoire en cours pour empêcher que qmake crée les répertoires debug et release (il est important de les définir sur ./ et pas seulement sur ., au moins sur Windows). Ensuite, en utilisant QMAKE_EXTRA_TARGETS, nous redéfinissons la cible first pour exécuter la commande personnalisée lorsque le fichier makefile est appelé sans cible.

C'est un peu hacky mais ça fait l'affaire.

Addition: Si vous voulez éviter la génération de trois makefile (Makefile, Makefile.Debug, Makefile.Release), vous pouvez ajouter

CONFIG -= debug_and_release 

Cependant, si vous utilisez cela et selon la façon dont le makefile est invoqué (toujours appelé manuellement, invoqué par le fichier "subdirs" * .pro du répertoire parent, ...), il peut être nécessaire de créer de fausses cibles debug et release pour éviter les erreurs "pas de règle pour faire des cibles ...". Par exemple:

release.target = release 
release-clean.target = release-clean 
release-install.target = release-install 
[...] 
debug.target = debug 
debug-clean.target = debug-clean 
debug-install.target = debug-install 
[...] 
QMAKE_EXTRA_TARGETS += release release-clean release-install [...] 
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...] 
Questions connexes