Bonjour,
Le sujet est un peu large et je m'en excuse. J'aurais peut-être dû créer un sujet par problème, mais les sujets sont liés et répéter le contexte à chaque fois n'était pas terrible non plus...
Alors voilà le contexte : j'ai créé il y a longtemps un jeu de composants visuels et non visuels en VCL (Delphi 6 à l'époque, et cela comportait essentiellement un package runtime et un package designtime...).
Depuis j'ai porté tout ça sous Delphi XE10.2, et j'ai réorganisé mes packages pour rendre les compos non visuels indépendants du Framework VCL ou FMX (je prévois d'ailleurs d'ajouter des compos visuels FMX plus tard).
Le tout est multi-plateforme Win32, Win64, Android (et un jour probablement iOS).
La structure actuelle de mes packages est la suivante :
- packageCore : contient les compos non visuels, tous indépendants du framework et multi-plateforme
- packageVCL : contient les compos visuels développés en VCL, dispos en Win32 et Win64. Requiert packageCore
- packageDT : contient bien sûr le recensement des compos, mais aussi des éditeurs de composants. Requiert packageCore et packageVCL
1ère interrogation : pour que l'EDI indique "plateformes supportées : Win32, Win64" sur mes compos, j'ai été obligé d'ajouter Win64 aux plate-formes cibles du packageDT (je ne sais plus si la compilation a été nécessaire). Je ne trouve pas ça logique, dans la mesure où ce package ne contient que du code destiné à s'exécuter dans l'EDI qui est 32 bits...
Pire : pour voir apparaître Android dans la liste des plateformes supportées, faut-il que j'ajoute Android au packageDT ? Si je fais ça Delphi m'indique que ça peut provoquer des résultats inattendus, car le framework VCL est utilisé dans ce package... Je n'ai pas essayé de confirmer. Mais de toute façon j'image la suite des problèmes : le paquet requis packageVCL n'est pas compilé en Android (aucune raison de le faire, la plate-forme n'est même pas ajoutée), il va falloir mettre des $IfDef partout pour espérer compiler packageDT en Android (et pour quoi faire ?), et enfin comment indiquer que les composants du paquet packageVCL ne sont alors pas dispos en Android ?
J'imagine qu'il doit y avoir un autre moyen de déclarer les plateformes compatibles pour un composant ?
2ème interrogation : IMPLICITBUILD et la compilation des 3 packages...
Je constate un comportement bizarre : admettons que je compile packageCore et packageVCL en Win32. D'abord le packageCore en Debug puis en Release (-> les dcu vont dans les sous-dossiers Win32\debug et Win32\Release du projet), puis le packageVCL (-> mêmes dossiers pour les dcu). La compilation de packageVCL provoque l'écrasement/recompilation des unités de packageCore. Cela est dû à l'option IMPLICITBUILD, ça OK, mais il me semble que tant qu'il n'y a pas de changement dans les sources de packageCore, il ne devrait pas recompiler. Ce point n'est pas encore très gênant (et c'est peut-être parce que je fais "construire" plutôt que "compiler"). Ce qui est beaucoup plus gênant, c'est qu'en compilant packageVCL en configuration Debug, il écrase les unités debug du packageCore par des versions qui semblent être des release ! Oui oui, je dis bien qu'il met des fichiers dcu en configuration release dans le dossier debug, et il s'agit de toutes les unités recompilées du packageCore requis à cause de la directive IMPLICITBUILD !
Les symptômes qui me font arriver à cette conclusion sont que je ne peux pas déboguer packageCore dans une application test si j'ai compilé packageVCL en dernier : les points d'arrêt sont désactivés. Et la taille des dcu de packageCore dans Win32\debug n'est pas normale : elle est presque identique à celle des dcu de Win32\release. Si je recompile packageCore en débug à nouveau, le problème est réglé (et les dcu de débogage sont alors plus gros).
Pourtant je n'ai pas ce souci avec un autre packageUtilitaires requis par packageCore et packageVCL... La seule différence que j'ai trouvé : packageUtilitaires a son propre dossier de projet, alors que les sources de mes 3 paquets packageCore, packageVCL et packageDT sont dans le même dossier. Et ça m'arrangerait de les conserver ainsi, pour ne pas avoir à mettre 50 dossiers dans les chemins de bibliothèque de Delphi. Avez-vous déjà constaté ce genre de problème ?
Cela m'a amené a regarder la directive {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}, mais justement celle-ci contient {$DEFINE DEBUG} dans mes projets (ce qui n'est pas forcément logique, mais qui va plutôt à l'opposé du phénomène constaté). J'imaginais de toute façon que les directives du packageVCL étaient transmises au compilateur pour la compilation implicite du packageCore, car il me semble avoir été obligé d'ajouter aux options du packageVCL, des définitions de noms qui concernaient packageCore.
J'ai alors essayé de tout mettre dans un groupe de projets, mais ça n'a pas l'air de changer grand-chose.
Je précise aussi que j'utilise les commandes "construire" ou "tout construire" plutôt que "compiler" ou "tout compiler". Avec "tout compiler" la reconstruction implicite n'aurait peut-être pas lieu, mais je trouve ça tellement plus prudent de tout reconstruire quand on modifie une unité dans un package... J'en suis donc réduit à tout reconstruire dans l'ordre des dépendances pour avoir tous les bpl des packages correctement liés, puis je reconstruis dans l'ordre inverse pour obtenir mes dcu de débogage ! Pas pratique du tout, surtout quand je fais évoluer le package régulièrement et le teste à chaque petite modif !
Merci d'avance pour votre aide.
Partager