IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut Comment retrouver pour n'importe quelle configuration l'emplacement d'une application générée par make ?
    Bonsoir,

    Pour mon IDE en cours de développement, j'ai eu à m'occuper d'une partie concernant la compilation avec des QProcess pour appeler qmake et mingw32-make (ou make pour Mac et Linux).
    Je me suis toutefois heurté à un problème qui était de retrouver l'emplacement de l'exécutable après la compilation pour pouvoir le lancer.
    Jusqu'alors, je passais par le Makefile en utilisant une QRegExp comme le montre le code qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    void FenPrincipale::runProj()
    {
    	#if defined(Q_WS_WIN)
    	QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile." + projet.compilMode);
    	#elif defined(Q_WS_X11)
    	QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile");
    	#else
    	QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile");
    	#endif
     
    	if(!f.exists() || !f.open(QIODevice::ReadOnly | QIODevice::Text))
    	return;
     
    	QStringList tmp = QString(f.readAll()).split("\n");
    	f.close();
     
    	#if defined(Q_WS_WIN)
    	QRegExp regexp("DESTDIR_TARGET = \"[^\n](.*)\"");
    	#elif defined(Q_WS_X11)
    	QRegExp regexp("TARGET(\\s*)= (\"?)[^\n](.*)(\"?)");
    	#else
    	QRegExp regexp("TARGET(\\s*)= (\"?)[^\n](.*)(\"?)");
    	#endif
     
    	if(tmp.indexOf(regexp) == -1)
    	{
    		QMessageBox::critical(this, "Erreur", "Impossible de lancer l'application.");
    		return;
    	}
     
    	QString line = tmp[tmp.indexOf(regexp)];
    	QStringList prepath = line.split(QRegExp(" = (\"?)"));
    	QString path = QFileInfo(projet.pathToProjFile).dir().path() + "/" + prepath[1];
     
    	if(path.right(1) == "\"")
    	path.chop(1);
    	path.replace("/", "\\");
     
    	QProcess *p = new QProcess(this);
    	p->setWorkingDirectory(pathQt);
    	p->startDetached(path, QProcess::systemEnvironment(), "");
    }
    Toutefois, une opération telle que voici n'est pas très optimisée et je pense qu'il existe une alternative.
    Bref, je m'en remets à vous pour optimiser ce code ou bien pour m'aider à trouver une autre solution qui puisse, comme le titre l'indique, retrouver l'application générée.

    Merci d'avance,
    Amnell.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    bonne question....
    Si tu ne te base pas sur le .pro, faudrait plutôt demander dans un de ces forums à mon avis. http://www.developpez.net/forums/f65...pilateurs-etc/

    Pour info,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QProcess *p = new QProcess(this);
    	p->setWorkingDirectory(pathQt);
    	p->startDetached(path, QProcess::systemEnvironment(), "");
    fait la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QProcess ::startDetached(path, QProcess::systemEnvironment(), "");
    car c'est une fonction statique.

  3. #3
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    En fait, il faudrait regarder ce que fait QtCreator pour avoir la réponse, mais j'ai passé toute ma soirée (hier soir donc) à chercher, sans succès.
    Je pense que gérer le .pro serait en fait une meilleure idée :

    Si le .pro comporte DESTDIR
    On va se mettre dedans pour trouver l'application.
    Sinon
    On prend les paramètres par défaut.
    Qu'en pensez-vous ?
    Je corrige ça pour le QProcess.
    Pour ce qui est du choix du forum, je pense que la partie Qt est plus adaptée puisqu'on parle de fonctions et de matériel spécifique à ce framework.

Discussions similaires

  1. Comment surcharger (hook) n'importe quelle API windows ?
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 05/07/2020, 19h41
  2. Réponses: 2
    Dernier message: 14/11/2009, 20h40
  3. type date pour n'importe quelle BDD
    Par tortuegenie dans le forum ASP.NET
    Réponses: 13
    Dernier message: 04/03/2008, 16h47
  4. Projet PacMan pour n'importe quelle machine Unix : C ou Java ?
    Par v4np13 dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 21/03/2007, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo