Comment gerez-vous vos lib perso ?

yoannyoann Membre
mai 2010 modifié dans Objective-C, Swift, C, C++ #1
Salut tout le monde,

Je suis en train de mettre au propre tous les bouts de code que j'utilise souvent pour en faire une lib modulaire.

Je suis parti sur l'utilisation de static lib pour avoir le même fonctionnement sur Mac et sur iPhone.

Je pense créer un projet Xcode par fonctionnalité puis faire appel à  ces projets en fonction dans mes différentes applications. Xcode supporte l'inclusion de projet dans des projets cependant j'ai du mal à  comprendre comment il gère la compilation des targets etc.

Pour le moment je suis parti pour avoir un dossier /XcodeLib avec un sous dossier MacOSX, iPhone et iPhoneSim avec dedans les différentes versions de mes lib selon la target. Ensuite je règle mes projets pour aller chercher header et lib à  cet endroit, cependant j'ai du oublier un truc puisque les symboles ne sont pas trouvés durant la compilation...

Donc avant de continuer dans l'une ou l'autre des solutions (projet inclus ou dossier de lib) je voudrais savoir si vous avez des retours d'expérience sur ce sujet.

Réponses

  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #2
    Je fonctionne aussi en projets inclus.
    Prend exemple sur la lib Three20, qui a été remaniée justement pour être modulaire (séparée en sous-libs Network, UI, ... du coup tu peux intégrer toute la lib ou n'intégrer que ce que tu veux) et qui utilise ce principe de projets inclus.
    Ils ont utilisé quelques scripts post-build pour copier les headers et les libs dans des dossiers propres (hors du dossier "build/", dans des endroits fixes réutilisables) et pour protéger les headers en écriture pour éviter les modifications involontaires.

    Tu peux aussi (j'avais commencé à  faire ça pour une de mes libs, mais je n'ai plus la procédure pas à  pas en tête) utiliser lipo pour fusionner en une seule lib (multi-architectures) ta lib compilée iPhoneOS (ARM) et celle compilée iPhoneSimulator (i386), des choses comme ça.

    En tout cas intéressante question à  soulever que de savoir comment organiser le tout, selon les targets simu/iphoneos/osx, de pouvoir facilement inclure les headers dans tes projets (là  où c'est simple avec un framework car tout est encapsulé, c'est plus chiant avec une lib statique car en plus faut compléter le "Header Search Path").
    Ce qui serait idéal ce serait de pouvoir avec des sortes de "frameworks statiques", aussi faciles à  intégrer/inclure dans tes projets que les frameworks (contenant directement les headers et les libs dans un seul bundle) mais avec libs statiques pour rester compatible iPhoneOS.
    D'ailleurs j'avais vu quelques exemples de libs iPhone (FaceBook, TT) où ils rassemblent les ressources (genre toutes les images) dans des ".bundle" comme ça tu n'as qu'un truc à  glisser dans ton projet Xcode et ça reste propre... A se demander si on peut pas faire la même chose pour les headers, ça serait pratique, j'ai pas testé (gaffe au chemin relatif à  utiliser pour le #import dans ce cas)
  • wiskywisky Membre
    07:46 modifié #3
    Bonjour,

    Je ne savais pas que l'on pouvait inclure un projet xcode dans son projet.
    Pour ma part, je ne fait pas de dev iphone. Sur Mac je me contente de Frameworks. Dans le cas ou il sont privé, j'ajoute un script pour supprimer les headers après la compilation ;)
    Il faut dire que je développe plus trop en ce moment même sur Mac. A mon grand regret !
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #4
    A savoir que quand on sélectionne la phase "Copy Headers", on peut, via l'onglet "Details", choisir quels sont les headers qu'on considère "public" et quels sont ceux qu'on considère "private".

    En fonction de ça, et selon le réglage des Build Settings "Private Headers Install Path" et "Headers Install Path" (de mémoire, si c'est pas ça ça doit ressembler), il va dispatcher les headers privés dans un dossier et les publics dans un autre. Théoriquement c'est comme ça qu'il faut procéder quand tu fais un framework d'ailleurs.
    Pour une lib statique ça peut peut-être servir aussi, faut creuser, tiens.
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #5
    Voir Cette doc Xcode sur la gestion des targets et en particulier tout en bas, Setting the Role of Header Files pour plus d'infos.
  • wiskywisky Membre
    07:46 modifié #6
    C'est bien ce que tu dit pour les headers. Tu peuxdire que tel ou tel header est privé ou public. Mais dans mon cas, je ne souhaite pas que quelqu'un reprennent mon fameworks dans mon app pour l'utiliser dans la sienne. Donc je complique un peux la tâche en retirant tout les headers lors de la compilation du logiciel final ;)
    C'est pratique lorsque tu souhaite utiliser une même base pour plusieurs projets !
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #7
    Oui et pour ça tu as les headers de type "project", un peu comme les headers "private" mais encore plus restrictifs.
    Comme ça au final dans ton dossier qui contient tout ce que tu vas distribuer, tu n'as que la lib et les headers publics, tout le reste qui te sert en interne et que l'utilisateur de ta lib n'a pas à  voir (headers privés, code d'implémentation des méthodes, ...) est totalement masqué.
  • wiskywisky Membre
    07:46 modifié #8
    Mais il me semble que tu ne peux pas protéger la totalité des headers ?
  • yoannyoann Membre
    07:46 modifié #9
    A tout hasard, est-ce que quelqu'un connait une variable pour la configuration de build Xcode qui serait capable de sortir un truc genre 3.0-iphoneos ou 10.5-Mac ?

    10.5 je l'ai, -iphoneos aussi mais je n'ai pas le reste...

    Si en plus ça peut être les même variable pour le mac et l'iPhone c'est le pied !
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #10
    Quand tu crées une phase "Run Script" dans ta target, tu peux demander à  ce qu'il t'affiche toutes les variables d'environnement au début avant d'exécuter le script (case à  cocher dans la fenêtre du "Run Script" où tu tapes ton script).
    Je m'en sers des fois pour qu'il liste toutes les variables disponible et pour ainsi voir s'il y en a une qui correspond à  ce que je rechercher (genre SOURCE_ROOT, PLATEFORM_NAME, etc)
  • yoannyoann Membre
    07:46 modifié #11
    dans 1274883291:

    Quand tu crées une phase "Run Script" dans ta target, tu peux demander à  ce qu'il t'affiche toutes les variables d'environnement au début avant d'exécuter le script (case à  cocher dans la fenêtre du "Run Script" où tu tapes ton script).
    Je m'en sers des fois pour qu'il liste toutes les variables disponible et pour ainsi voir s'il y en a une qui correspond à  ce que je rechercher (genre SOURCE_ROOT, PLATEFORM_NAME, etc)


    Merci pour l'info, j'ai coché cette case mais j'ai rien dans mon log... Je vois bien le echo que j'ai placé dans le script mais rien de plus... C'est censé s'afficher où ?
  • AliGatorAliGator Membre, Modérateur
    mai 2010 modifié #12
    Dans l'onglet Build Results (là  où tu as tes Warnings, Errors, etc).
    Vérifie que tu affiches dans cet onglet tous les messages et pas que les "Issues Only" du coup, et il faut dérouler la ligne correspondant à  l'étape d'exécution du script pour en voir le détail :
  • yoannyoann Membre
    07:46 modifié #13
    Super, pour info voici ma config pour la config Release de mes lib mais malheureusement ça ne marche pas :/

    CONFIGURATION_BUILD_DIR = /XcodeLib/products/$(SDK_NAME)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME)
    INSTALL_PATH = $(CONFIGURATION_BUILD_DIR)
    PRIVATE_HEADERS_FOLDER_PATH = ../../headers/private-include/$(PRODUCT_NAME)
    PUBLIC_HEADERS_FOLDER_PATH = ../../headers/include/$(PRODUCT_NAME)

    Et pour l'utilisation :

    HEADER_SEARCH_PATHS = /XcodeLib/headers/include/**
    LIBRARY_SEARCH_PATHS = /XcodeLib/products/**

    J'arrive a build correctement une première lib, puis une lib qui dépend de la première. Ensuite viens le tour d'une application qui elle n'arrive pas à  trouver les headers de la seconde lib qui sont pourtant au bon endroit

    Le pire c'est quand je regarde le détail de la compilation :

    /Developer/usr/bin/gcc-4.2 -x objective-c -arch x86_64 -fmessage-length=0 -pipe -std=gnu99 -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -isysroot /Developer/SDKs/MacOSX10.5.sdk -mfix-and-continue -mmacosx-version-min=10.5 -gdwarf-2 -iquote /XcodeBuild/NatConfig.build/Debug/NatConfig.build/NatConfig-generated-files.hmap -I/XcodeBuild/NatConfig.build/Debug/NatConfig.build/NatConfig-own-target-headers.hmap -I/XcodeBuild/NatConfig.build/Debug/NatConfig.build/NatConfig-all-target-headers.hmap -iquote /XcodeBuild/NatConfig.build/Debug/NatConfig.build/NatConfig-project-headers.hmap -F/XcodeBuild/Debug -I/XcodeBuild/Debug/include -I/XcodeLib/headers/include -I/XcodeLib/headers/include/YGCommon -I/XcodeBuild/NatConfig.build/Debug/NatConfig.build/DerivedSources/x86_64 -I/XcodeBuild/NatConfig.build/Debug/NatConfig.build/DerivedSources -include /var/folders/Ys/YsWra5DeHcKivbFC1XobE++++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/NatConfig_Prefix-azkdtptofoowuigruwurqqbdkfuz/NatConfig_Prefix.pch -c &quot;/Volumes/Data HD/SVN/Perso/NatConfig/trunk/MyDocument.m&quot; -o /XcodeBuild/NatConfig.build/Debug/NatConfig.build/Objects-normal/x86_64/MyDocument.o<br />
    


    J'ai bien YGCommon qui est inclus pour les headers, qui est la première lib, mais je n'y vois pas PlistPRC qui est la seconde, celle qui pose problème, qui est pourtant au même endroit !

    Si quelqu'un à  une idée...
  • yoannyoann Membre
    07:46 modifié #14
    Ok donc problème résolu, j'utilise la config ci dessus, j'avais simplement oublié le -ObjC dans les Other Link Flags de mes static lib... ça fonctionne donc sans avoir à  inclure les autres projets Xcode à  l'intérieur.

    Il va falloir maintenant que je regarde de plus près l'inclusion de projet pour voir comment gérer la compilation automatique des dépendances !
  • yoannyoann Membre
    07:46 modifié #15
    Une question cependant, je suis quand même obligé de rajouter mes .a dans la target (logique en soit). Mais est-ce que LIBRARY_SEARCH_PATHS n'est pas justement la pour lui dire "Cherche les symboles que tu ne connait pas la dedans" ?
  • zoczoc Membre
    07:46 modifié #16
    Non, le LIBRARY_SEARCH_PATHS est là  pour donner le chemin de dossiers où chercher des librairies dont il connait le nom. Le linker ne va jamais s'amuser à  inspecter toutes les libs disponibles dans ce(s) dossier(s) au cas où il y en aurait une qui exporte le symbole recherché.

  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #17
    Oui exact en fait c'est quand tu rajoutes -lmachin comme flag à  ton linker, qu'il va donc vouloir linker avec la lib "machin.a", et pour la trouver il va chercher dans les répertoires mentionnés dans ce LIBRARY_SEARCH_PATHS.

    Sinon je ne t'explique pas le boxon si dans un même répertoire tu as plusieurs versions d'une même lib, qui exporte quasiment les mêmes symboles chacunes (aux quelques différences près apportées par l'évolution de la version)... :P
  • yoannyoann Membre
    07:46 modifié #18
    Oui avec l'explication c'était con comme idée... A tout hasard, personne ne saurait comment voir apparaà®tre de nouvelles lib dans le fenêtre d'ajout de framework ? C'est un peut lourd d'aller chercher à  la main son .a...
  • MetablueMetablue Membre
    07:46 modifié #19
    Perso me suis offert ce petit cadeau ^_^

    http://www.snippetsapp.com/
  • yoannyoann Membre
    07:46 modifié #20
    dans 1275406017:

    Perso me suis offert ce petit cadeau ^_^

    http://www.snippetsapp.com/


    C'est pratique pour certain truc vite fait mais pas pour faire une lib...

    Pour info je vais tacher de passer aux labs à  la WWDC pour demander conseils sur la gestion d'une lib multi target + dépendance
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #21
    Je suis preneur du retour (bah oui je ne pourrais pas m'offrir le luxe d'aller à  la WWDC, MOI :D)
  • yoannyoann Membre
    07:46 modifié #22
    Bon je n'ai même pas posé la question, la réponse est dans une des bonnes nouveautés de l'avenir plus ou moins lointain :-)
  • Paisible.frPaisible.fr Membre
    07:46 modifié #23
    dans 1276036332:

    Bon je n'ai même pas posé la question, la réponse est dans une des bonnes nouveautés de l'avenir plus ou moins lointain :-)

    Yoann decidement j'aime tes reponses en ce moment 
Connectez-vous ou Inscrivez-vous pour répondre.