Building avec XCODE en utilisant CmakeList.txt configuration

yodoyodo Membre
Salut,
Je suis a récent utilisateur de Xcode (et de la langue française) et je me suis rencontré avec une problème que après plusieurs heures de recherche sur internet je n'ai pas réussi a réparer.
J'utilise Xcode to développe quelques outils sur un framework que normalement on build en utilisant cmake and make. J'ai travaillé les derniers 5 mois avec la version precedant de ce framework en mettant toutes les fichiers en XCODE et en faisant "build" sans utiliser cmake. Ce n'est pas la manière la plus efficient mais c'est simple et jusqu'au moment cela a bien marché.
Dans la dernière version du framework ils ont introduit quelque variables dans le CmakeList.txt qui sont utilisés dans le C++ code. Particulièrement, dans le CmakeList.txt fichier:

set(MASH_CORE_DUMP_TEMPLATE "/cores/core.$PID" CACHE STRING "Template of the name of the core dump files")

Quand je fais "build" en XCODE, j'obtiens plusieurs erreurs comme celui-ci:

MASH_CORE_DUMP_TEMPLATE was not declared in this scope

J'ai essayé de suivre trois différentes stratégies:

1. J'ai cherché une façon d'appeler Cmake depuis XCODE pour faire le "build" du framework. Mais Je n'ai pas réussi.
2. J'ai cherché un champ dans la configuration de XCODE pour ajouter le valeur de la variable MASH_CORE_DUMP_TEMPLATE pendant le procès de "build". Mais Je n'ai pas trouvé aucun champ.
3.J'ai aussi essayé de créer un projet XCODE a partir de Cmake en utilisant "Cmake -G Xcode". Mais le project qui est generé ne marche pas avec XCODE en montrant l'erreur: "Cannot be opened because the project file cannot be parsed". J'ai cherché cet erreur mais aucun solutions ne marchent.

Est-ce qu'il y a une manière de inclure la configuration du fichier CmakeList dans le procès de "build" de XCODE?

Merci beaucoup et excusez mon niveau de française.

Réponses

  • devulderdevulder Membre
    23:46 modifié #2
    Bonjour,

    Tu as la commande xcodebuild pour lancer la compilation d'un projet via le terminal.

    voir ici

    A+
  • yodoyodo Membre
    23:46 modifié #3
    Merci pour répondre tellement vite.

    Ce que je comprends de xcodebuild fait plus or moins la même chose que l'option "build" du GUI. Mais j'ai encore le problème de introduire le valeur du variable MASH_CORE_DUMP_TEMPLATE dans la compilation du framework.

    Vous avez une idée pour le faire avec xcodebuild?
  • AliGatorAliGator Membre, Modérateur
    23:46 modifié #4
    Bonjour et bienvenue !

    Je ne connais pas trop Cmake (et l'usage et la syntaxe de Cmakelist.txt) mais s'il s'agit de définir des symboles supplémentaires à  la compilation, Xcode te permet de rajouter des "additional flags" dans les paramètres de build. pour cela, affiche les options de build (Command-I sur le projet ou sur le target dans la colonne Groups&Files, puis onglet "Build") et tout en bas tu dois avoir une case (ou sinon utilise le champ de recherche de cet onglet Build pour la retrouver) du genre "Other Compile Flags" (et il y a aussi "Other Linker Flags" pour le linker). Ici si tu veux définir des macros en plus tu peux alors mettre "-DMACRO=VALEUR" (au même titre que tu mettrais ce flag dans GCC en ligne de commande avec la même syntaxe) pour définir la macro MACRO avec la valeur VALEUR.

    Maintenant je ne sais pas si c'est vraiment ce que fait la commande "set(..." que tu évoques dans ton Cmakelist.txt, elle ne correspond peut-être pas du tout à  cela (ne connaissant pas Cmakelist.txt je n'ai fait que supposer).

    Sinon quand tu choisis "Build" dans le menu de Xcode dans la GUI, ça exécute effectivement la ligne de commande xcodebuild, donc l'un ou l'autre sont équivalents.
    Si tu veux exécuter Cmake il y a sans doute moyen, en particulier dans les autres onglets de l'inspecteur de projet (à  côté de General et Build tu as un onglet qui te permet d'affecter un outil donné pour chaque extension de fichier donné il me semble, il y a peut-être moyen de faire invoquer cmake au lieu de xcodebuild à  ce stade pour ton framework ?)
  • yodoyodo Membre
    23:46 modifié #5
    Salut,
    Merci pour les suggestions mais J'ai essayé tous le champs pour ajouter Other Flags et ça ne marche pas. Je crois ce n'est pas un Flag, c'est plutôt une variable a ajouter en temps de compilation...
    Merci aussi pour l'idée de ajouter une Rule, mais il me semble que c'est plutôt pour choisir un compilateur pour diffèrent extensions. Dans mon cas c'est le fichier de configuration de cmake, il ne faut pas le compiler. Mais je te remercie beaucoup sincèrement tes idées!!
  • AliGatorAliGator Membre, Modérateur
    23:46 modifié #6
    Rebonjour,

    Après une petite recherche, il semble en fait que Xcode peut effectuer la compilation de tes sources avec un makefile (plutôt qu'avec son système interne classique et xcodebuild & co). Pour cela, il faut que tu crées un nouveau "Target" mais de type "External Target"

    Dans la documentation de Xcode il est ainsi expliqué les différents types de Targets en particulier le type "External Target" te permettant d'utiliser des makefiles
    J'ai aussi trouvé ce PDF expliquant comment utiliser des makefiles avec Xcode

    Avec ça il y a sans doute moyen de demander à  Xcode de compiler ton framework (celui nécessitant cmake) avec cmake justement au lieu d'utiliser xcodebuild. Et du coup dans ce cas il utilisera cmake donc le CMakeList.txt et tout ce qui s'en suit.

    Sinon il y a aussi les targets de type "Script Build Phase" qui permettent d'exécuter un script shell quelconque comme phase de compilation. Tu peux du coup écrire un script tout bête qui se contente d'invoquer cmake pour compiler ton framework et mettre le produit généré au bon endroit, et du coup si besoin ne faire dépendre le reste de ton projet qu'avec le framework compilé (comme tu le ferais pour faire dépendre ton projet d'une librairie statique ou dynamique déjà  compilée pour laquelle tu n'aurais pas le code source)
  • yodoyodo Membre
    23:46 modifié #7
    ça a belle allure!! Au moins la définition de Externe Target c'est exactement ce dont j'ai besoin. Je vais rechercher dans la direction que tu m'as recommandé tout de suite.
    Merci beaucoup!!!
  • yodoyodo Membre
    23:46 modifié #8
    Salut (j'espère par dernier fois...),

    Merci beaucoup, l'idée de ajouter un "External Tarjet" a très bien marché. J'ai réussi a compiler en utilisant "make" pour profiter tous les makefiles.

    Maintenant le problème c'est que je n'arrive pas a exécuter ou debugger en utilisant Xcode. Le résultat de ma compilation sont une application exécutable (que j'ai ajouté dans la section d'Exécutables de Groups&Files) et plusieurs librairies dynamiques qui sont appelés par la application en temps d'exécution. D'abord Xcode ne trouvait pas les librairies dynamiques (mes makefiles laissent les librairies dans PROJECT_PATH/build/bin).  Pour les trouver j'ai mis manuellement les librairies dynamiques lib*.dylib dans le path PROJECT_PATH/build/Debug. Mais après ça j'obtiens toujours le message:


    Program loaded.
    run
    [Switching to process 63469]
    Running...
    terminate called after throwing an instance of 'std::out_of_range'
      what():  basic_string::at
    Program received signal:  “SIGABRT”.
    (gdb)

    Cependant Je peut exécuter la application génère par Xcode placée en PROJECT_PATH/build/bin depuis la ligne de commands et tout marche bien, mais si j'exécute/débugge la application en XCODE j'obtiens l'erreur ci-desus.

    J'ai ajouté quelque directives de compilation (GCC_GENERATE_DEBUGGING_SYMBOLS) dans l'onglet "Build Settings" du "External Target" pour la génération de symboles pour débugger mais je ne suis pas sur parce que le même erreur arrive pendant l'exécution.

    Merci beaucoup, je suis absolument reconnaissant par l'aide que vous m'avez prêté.
  • yodoyodo Membre
    23:46 modifié #9
    Salut,
    L'erreur que j'avais reporté n'avait rien a avoir avec Xcode, j'ai déjà  résolu. Et par rapport aux breakpoints, c'est réparé avec le paramètre "Load symbols lacy". J'ai une autre questions par rapport aux breakpoints mais je vais ouvrir une nouvelle thread.

    Merci beaucoup.
Connectez-vous ou Inscrivez-vous pour répondre.