Sign in Join
Wiki copytemporary

Macros and Conditionals/fr

English · Français · Русский

Généralité

Des macros peuvent être utilisées dans les chemins de recherche et les noms de fichier pour laisser l'EDI les adapter à la plate-forme cible. Les macros de construction sont des macros spécifiques au projet/paquet. Elles ne sont pas passées au compilateur. Un exemple important est la LCLWidgetType, laquelle est définie dans le paquet LCL et permet de choisir le jeu de widgets (carbon, gtk, qt, win32, wince, ...).

Les conditionnelles sont des règles permettant de mettre des macros dépendantes de la palte-forme cible et/ou d'autres macros. Par exemple, vous pouvez les utiliser pour définir des options spéciales de l'éditeur de lien pour Mac OS X. Elle utilisent un langage de script comme Pascal pour définir des règles complexes.

Vous pouvez définir les macros de construction via Project / Project Options / Compiler Options / Additions and Overrides (en)

Vous pouvez faire des conditionnelles via Projet / Options du projet / Options du compilateur / Options personnalisées.

Les macros de construction et les conditionnelles existent depuis Lazarus 0.9.29.

Conditionnelles

Les expressions conditionnelles utilisent un langage de scripting simple.

Changement des options du compilateur avec les expressions conditionnelles

Le script de conditionnelles peut définir certaines variables dont les valeurs sont utilisées par l'EDI pour les options du compilateur :

Pour les paquets, il y a plus de variables pour les options d'usage. Ces chemins sont hérités, cela signifie qu'ils sont ajoutés à tous les paquets/projets utilisant ce paquet, directement ou non :

Syntaxe des expressions conditionnelles

Constructions de syntaxe supportées

Variables

Les variables sont définies simplement en assignant une valeur. Il y a des variables prédéfinies. Voir ci-dessous pour une liste.

Les variables peuvent être définies ou indéfinies :

pascal
if defined(Name) then ...
if undefined(Name) then ...
undefine(Name);

Si une variables est définie, elle peut avoir l'un de ces trois types :

Une variable est false si elle prend la valeur numérique 0 ou chaîne '0'. Sinon, elle vaut true. Cela signifie qu'une variable sans valeur est vraie tout comme une variable indéfinie.

Vous pouvez changer le type d'une variable avec :

pascal
a:='1'; // string
a:=integer(a); // convertit vers un nombre en utilisant StrToInt(), en cas d'échec, la variable demeure une chaîne
a:=int64(a); // convertit vers un nombre en utilisant StrToInt64(), en cas d'échec, la variable demeure une chaîne
a:=string(a); // convertit vers une chaîne

Constantes

pascal
a:=1234; // decimal
a:=$A1B; // hexadecimal
a:=&127; // octal
a:=%101; // binary
a:='10'; // string
a:=#123; // character

Opérateurs

Niveaux de précédence:

Variables prédéfinies

Avant que le script d'expressions conditionnelles ne soit exécuté, l'EDI initialise quelques variables :

Fonction prédéfinies

Ordre de calcul des macros

  1. Les valeurs du projet courant sont reprises.
  2. si le projet ne définit pas les valeurs pour TargetOS, TargetCPU, l'EDI prend les valeurs par défaut.
  3. SrcOS et SrcOS2 sont calculées à partir de TargetOS.
  4. Les expressions des paquets utilisés sont calculées. Si un paquet A utilise un paquet B, alors les conditionnelles du paquet B sont calculées avant les conditionnelles de A.
  5. Chaque script de conditionnelles démarre avec les valeurs du projets.
    • Si le projet ne définit pas une valeur pour une macro de paquet, le résultat du paquet utilise est utilisé.
    • Un script peut modifier toute macro quand il s'exécute , mais seules les macros de construction et les macros prédéfinies sont utilisées. Par exemple, vous pouvez définir TargetOS à une autre valeur mais cela n'a pas d'effet sur un autre script, ni sur aucun chemin de recherche utilisant $(TargetOS), ni même sur les chemins de recherche du paquet lui-même.
    • Si deux paquets définissent la même macro de construction alors les deux peuvent modifier la valeur (à moins que le projet définisse une valeur). L'effet exact dépend de l'ordre des dépendances.
  6. les macros par défaut de l'EDI sont définies en dernier.

Exemples

Ajout d'un drapeau de compilateur pour la cible Unix

pascal
if TargetOS = 'linux' then 
  CustomOptions := '-dUseCThreads';

Notes :

Ajout de quelques options de l'éditeur de liens pour la cible Mac OS X

Le compilateur utilise pour Mac OS X la valeur darwin pour TargetOS.

pascal
if TargetOS = 'darwin' then begin
  LinkerOptions += ' -framework Cocoa';
  if TargetCPU = 'i386' then 
    LinkerOptions += ' -framework OpenGL';
end;

Notes:

Ajout de quelques options de l'éditeur de liens pour Mac OS X pour tous les projets utilisant un paquet

Les paquets ont deux jeux différents d'options. Le jeu utilisé pour la compilation du paquet lui-même et les options ajoutées à tous les projets/paquets utilisant le paquet. Vous devez changer les options d*'usage* du paquet :

pascal
if TargetOS = 'darwin' then begin
  UsageLinkerOptions += ' -framework Cocoa';
  if TargetCPU = 'i386' then 
    UsageLinkerOptions += ' -framework OpenGL';
end;

Ajout d'une option à un paquet

Si votre paquet fournit des parties optionnelles, par exemple la capacité d'utiliser OpenGL vous pouvez définir une macro de construction. Ce qui suit explique comment définir ceci pas à pas :

Disons que votre paquet est appelé Pkg1 et permet de basculer sur le support d'OpenGL en le compilant avec le drapeau -dEnableOpenGL. Le paquet devrait fournir une option booléenne Pkg1_UseOpenGL avec la valeur 'True' and 'False'.

Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur Options du compilateur et sélectionnez la page Macros de l'EDI.

Cliquez sur bouton + de gauche pour ajouter une nouvelle macro. Elle sera appelée 'Pkg1_Macro1'. Cliquez sur le noeud de l'arbre pour le renommer 'Pkg1_UseOpenGL'.

Cliquez sur le bouton + du milieu pour ajouter une nouvelle valeur de macro. Elle sera appelée 'Value1'. Cliquez sur le noeud de l'arbre pour le renommer en 'True'. Recommencez ceci pour ajouter 'False'.

Ajoutez le code suivant dans la boîte de texte des conditionnelles (Options du compilateur / Options personnalisées)

pascal
if Pkg1_UseOpenGL='True' then 
  CustomOptions := '-dEnableOpenGL';

Notes:

Ajouter un mode release/debug

Un mode release/debug pour votre projet et tous vos paquets

Note: Ceci nécessite Lazarus Lazarus 0.9.31 ou supérieur.

Dans les options du compilateur (Projet / Options du projet / Options du compilateur / Modes de construction) ajoutez un mode Release. Ajouter ce mode de construction l'activera automatiquement, ainsi tous les changements des options du compilateur porteront maintenant uniquement sur ce mode.

Dans "Définir les valeurs de macro", cliquez sur la colonne de gauche sur la dernière ligne "(none)". Mettez-la à "MyPackageOptions". Note : elle n'est pas listée dans la combo box.

Mettez comme valeur les options, par exemple "-O3".

Cette macro est utilisable dans les options du compilateur du projet et tous les paquets.

Pour chaque paquet, faites : ouvrir les options du compilateur du paquet, aller à la page Autres. Ajoutez aux Options personnalisée le texte $(MyPackageOptions).

Un mode release/debug spécial pour un paquet

Admettons que le mode normal est le mode Debug et que vous voulez un autre mode pour les releases.

Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur Options du compilateur", sélectionnez la pageMacros de contruction''.

Sous Macros de construction cliquez sur le bouton + de gauche pour ajouter une nouvelle macro. Elle sera appelée 'Pkg1_Macro1'. Cliquez sur le noeud de l'arbre pour le renommer en 'Pkg1_Release'.

Cliquer sur le bouton '+' du milieu pour ajouter une nouvelle valeur de macro. Elle sera appelée 'Value1'. Cliquez sur le noeud de l'arbre pour le renommer en 'True'. Répéter la dernière opération pour la valeur 'False'.

Ajoutez le code suivant dans la boîte de texte des expressions conditionnelles :

pascal
if Pkg1_Release='True' then 
  // release mode
  CustomOptions := '-O3'
else
  // debug mode
  CustomOptions := '-Sa Ctroi';

Notes:

Ajout d'une macro pour les chemins de recherche pour gérer plusieurs plates-formes

Disons que votre paquet est appelé Pkg1 et qu'il utilise le GDI dans MS Windows et X11 dans Linux et BSD. Les unités indépendantes de la plate-forme sont dans le dossier principal du paquet et vous avez créé deux sous-dossiers 'gdi' et 'x11' contenant les unités dépendantes de la plate-forme :

pascal
/path/of/your/package/pkg1/
  pkg1.lpk
  pkg1.pas
  generalunit.pas
  gdi/
    backend.pas
  x11/
    backend.pas

L'unité backend dans gdi devrait être utiliser dans Win32, Win64 et WinCE, alors que sous Linux et FreeBSD l'unité backend devrait être utilisée dans le x11. Ceci signifie que le chemin de recherche Autres fichiers d'unité (-Fu) doit être adapté selon le système cible. Ce qui suit décrit comment régler ceci pas à pas :

Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur les options de compilateur, sélectionnez la page Macros de construction.

Cliquez sur le bouton + de gauche pour ajouter une nouvelle macro. Elle sera appelée 'Pkg1_Macro1'. Cliquez sur le nœud de l'arbre pour le renommer en 'Pkg1_Backend'.

Cliquez sur le bouton + du milieu pour ajouter une nouvelle valeur de macro. Elle sera appelée 'Value1'. Cliquez sur le nœud de l'arbre pour le renommer en 'gdi'. Répéter l'opération pour la valeur 'x11'.

Ajoutez le code suivant dans la boîte de texte des conditionnelles :

pascal
// choisissez le valeur de Pkg1_Backend selon le système cible
if undefined(Pkg1_Backend) then begin
  if SrcOS='win' then
    Pkg1_Backend:='gdi'
  else
    Pkg1_Backend:='x11';
end;

La macro $(Pkg1_Backend) deviendra utilisable une fois que vous aurez cliquer sur 'Ok' pour fermer les options du compilateur et l'avoir réouvert pour l'utiliser dans les chemins de recherche Autres fichiers d'unité (-Fu).

Notes:


From the Free Pascal wiki, page "Macros and Conditionals/fr", as it stood on 2020-02-19 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.