Sign in Join
Wiki copytemporary

Macros and Conditionals/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Généralité
22
33Des 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, ...).
44
55Les **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.
66
77Vous pouvez définir les macros de construction via [[IDE Window: Compiler Options|Project / Project Options / Compiler Options / Additions and Overrides (en)]]
88
99Vous pouvez faire des conditionnelles via Projet / Options du projet / Options du compilateur / Options personnalisées.
1010
1111Les macros de construction et les conditionnelles existent depuis Lazarus 0.9.29.
1212
13-<figure>
14-<img src="CompilerAdditionsAndOverrides1.png" title="CompilerAdditionsAndOverrides1.png" />
15-<figcaption>CompilerAdditionsAndOverrides1.png</figcaption>
16-</figure>
13+![](/wiki-images/c/cd/CompilerAdditionsAndOverrides1.png)
1714
1815# Conditionnelles
1916
2017Les expressions conditionnelles utilisent un langage de scripting simple.
2118
2219## Changement des options du compilateur avec les expressions conditionnelles
2320
2421Le script de conditionnelles peut définir certaines variables dont les valeurs sont utilisées par l'EDI pour les options du compilateur :
2522
2623- **UnitPath**: ajouté en fin de *Autres fichiers sources (-Fu)*. Les caractères / et \\ sont automatiquement convertis vers le séparateur de chemin courant. Après avoir ajouté le(s) chemin(s) de recherche) avec un point-virgule, les macros sont remplacées et les chemins relatifs sont expansés par le chemin d'accès du projet/paquet.
2724- **IncPath**: ajouté en fin de *Fichiers d'inclusion (-Fi)*.
2825- **LibraryPath**: ajouté en fin de *Bibliothèques (-Fl)*.
2926- **SrcPath**: ajouté en fin de *Autres sources (non utilisé par le compilateur, uniquement par l'EDI)*.
3027- **DebugPath**: ajouté en fin de *Ajout de chemin du débogueur (non utilisé par le compilateur ni par les outils de code, seulement par le débogueur)*
3128- **LinkerOptions**: ajouté en fin des options de l'éditeur de liens (-k). Les délimiteurs de chemin ne sont pas changés. Les chemins relatifs ne sont pas expansés. Les macros sont remplacées.
3229- **CustomOptions**: ajouté en fin des paramètres du compilateur. Les délimiteurs de chemin ne sont pas changés. Les chemins relatifs ne sont pas expansés. Les macros sont remplacées.
3330- **OutputDir**: si défini, il remplacera le dossier de sortie courant. Les délimiteurs de chemin sont changés. Les chemins relatifs sont expansés. Les macros sont remplacées.
3431
3532Pour 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 :
3633
3734- **UsageUnitPath** : ajouté en fin du chemin d'usage *Unité (-Fu)*. Les caractères / et \\ sont automatiquement convertis dans le séparateur de chemin actuel. Après avoir ajouté le(s) chemin(s) de recherche) avec un point-virgule, les macros sont remplacées et les chemins relatifs sont expansés par le chemin d'accès du projet/paquet.
3835- **UsageIncPath** : ajouté en fin du chemin d'usage *Inclusion (-Fi)*.
3936- **UsageLibraryPath** : ajouté en fin du chemin d'usage *Bibliothèque (-Fl)*.
4037- **UsageSrcPath** : ajouté en fin du chemin d'usage *Source (pas utilisé par le compilateur, seulement l'EDI)*.
4138- **UsageDebugPath** : ajouté en fin du chemin d'usage *Débogueur (pas utilisé par le compilateur, ni par les outils de code, utilisé seulement par le débogueur)*.
4239- **UsageLinkerOptions** : ajouté en fin des options de l'éditeur de liens (-k). Les délimiteurs de chemin ne sont pas changés. Les chemins relatifs ne sont pas expansés. Les macros sont remplacées.
4340- **UsageCustomOptions** : ajouté en fin des paramètres d'usage du compilateur. Les délimiteurs de chemin ne sont pas changés. Les chemins relatifs ne sont pas expansés.
4441
4542## Syntaxe des expressions conditionnelles
4643
4744### Constructions de syntaxe supportées
4845
4946- If expression then instruction;
5047- If expression then instruction else instruction;
5148- begin instruction; ... instruction; end;
5249- Variable:=expression;
5350- Variable+=expression;
5451- Commentaires //, { }, (* *)
5552- Espaces, tabulations et saut de ligne sont les mêmes. Comme en Pascal, ils ne sont requis que pour séparer deux identificateurs/mots-clés.
5653
5754### Variables
5855
5956Les variables sont définies simplement en assignant une valeur. Il y a des variables prédéfinies. Voir ci-dessous pour une liste.
6057
6158Les variables peuvent être définies ou indéfinies :
6259
6360``` pascal
6461if defined(Name) then ...
6562if undefined(Name) then ...
6663undefine(Name);
6764```
6865
6966Si une variables est définie, elle peut avoir l'un de ces trois types :
7067
7168- aucun
7269- chaîne de caractères
7370- numérique (int64)
7471
7572Une 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.
7673
7774Vous pouvez changer le type d'une variable avec :
7875
7976``` pascal
8077a:='1'; // string
8178a:=integer(a); // convertit vers un nombre en utilisant StrToInt(), en cas d'échec, la variable demeure une chaîne
8279a:=int64(a); // convertit vers un nombre en utilisant StrToInt64(), en cas d'échec, la variable demeure une chaîne
8380a:=string(a); // convertit vers une chaîne
8481```
8582
8683### Constantes
8784
8885``` pascal
8986a:=1234; // decimal
9087a:=$A1B; // hexadecimal
9188a:=&127; // octal
9289a:=%101; // binary
9390a:='10'; // string
9491a:=#123; // character
9592```
9693
9794### Opérateurs
9895
9996- **+** : Deux nombres sont ajoutés, sinon ils sont traités comme une chaîne et concaténés.
10097- **\<**, **\>**, **\<=**, **\>=**, **=**, **\<\>** : Deux nombres sont comparés mathématiquement, sinon ils sont traités comme des chaînes et comparés lexicographiquement (sensible à la casse).
10198- **not** : opérateur booléen unaire.
10299- **and**, **or**, **xor** : Opérateurs booléens.
103100- **(**,**)** : operations de groupe.
104101- **:=** : Affectation. Pas permis dans les expressions (désolé, c'est pas du langage C).
105102- **+=** : Ajout et affectation. Pas permis dans les expressions.
106103
107104Niveaux de précédence:
108105
109106- 1 Not et - (moins unaire)
110107- 1 And
111108- 2 Or
112109- 2 XOr
113110- 2 +
114111- 4 =
115112- 4 \<\>
116113- 4 \<
117114- 4 \<=
118115- 4 \>
119116- 4 \>=
120117
121118## Variables prédéfinies
122119
123120Avant que le script d'expressions conditionnelles ne soit exécuté, l'EDI initialise quelques variables :
124121
125122- **TargetOS** : le système d'exploitation cible comme défini par fpc p.ex. 'linux', 'win32', 'darwin', 'freebsd', 'wince'.
126123- **TargetCPU**: le processeur cible du projet comme défini par fpc p.exe. 'i386', 'x86_64', 'arm'.
127124- **SrcOS**: la valeur 'win' pour toute plate-forme MS Windows et 'unix' pour toutes les plate-formes unixiennes. La valeur dépend de TargetOS.
128125- **SrcOS2**: la valeur 'bsd' pour toutes les plates-formes BSD-iennes. La valeur dépend de TargetOS.
129126- **True** : valeur 1
130127- **False** : valeur 0
131128- toutes les macros de construction définies par le projet en cours.
132129- Toutes les macros de construction définies par les paquets utilisés. Cela signifie que si le projet n'a pas défini une valeur pour une macro du paquet, la valeur de la conditionnelle du paquet utilisé sera utilisée.
133130
134131## Fonction prédéfinies
135132
136133- **Defined(Variable)** : retourne 1 (vrai) si la variable est définie et 0 (faux) sinon. Exemple if Defined(Macro1) then ;
137134- **Undefine(Variable)** : annule la définition de la variable. Exemple: Undefine(A);
138135- **Int64(expression)** : Retourne la valeur Int64 de l'expression. Exemple: i:=int64('3');
139136- **Integer(expression)** : Retourne la valeur entière d'une expression. Exemple: i:=integer('3');
140137- **String(expression)** : Retourne la valeur chaîne d'une expression. Exemple: s:=string(3);
141138- **GetIDEValue(string)** : Voir [[IDE Macros in paths and filenames|Macros EDI (en)]].
142139 - GetIDEValue('OS') : Retourne le système d'exploitation dans lequel l'EDI a été compilé. Depuis la version 1.0.
143140 - GetIDEValue('CPU') : Retourne le processeur avec lequel l'EDI a été compilé. Depuis la version 1.0.
144141 - GetIDEValue('SrcOS') : SrcOS de l'EDI. Depuis la version 1.0.
145142 - GetIDEValue('SrcOS2') : SrcOS2 de l'EDI. Depuis la version 1.0.
146143 - GetIDEValue('LCLWidgeType') : Plate-forme LCL de l'EDI, qui peut être différente du projet. lazbuild retourne win32, carbon ou gtk2 selon son système d'exploitation. Depuis la version 1.0.
147144- **GetEnv(string)** : Retourne la valeur de la variable d'environnement. Par exemple, GetEnv('HOME') retourne sous Linux le répertoire d'acceuil de l'utilisateur. Depuis la version 1.0.
148145- **GetProjValue(string)** : Retourne une valeur de projet.
149146 - GetProjValue('FPC_FULLVERSION'): Retourne la FPC_FULLVERSION rapportée du compilateur. La version est un entier p.ex. 20701. Depuis la version 1.3.
150147
151148# Ordre de calcul des macros
152149
1531501. Les valeurs du projet courant sont reprises.
1541512. si le projet ne définit pas les valeurs pour TargetOS, TargetCPU, l'EDI prend les valeurs par défaut.
1551523. SrcOS et SrcOS2 sont calculées à partir de TargetOS.
1561534. 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.
1571545. Chaque script de conditionnelles démarre avec les valeurs du projets.
158155 - Si le projet ne définit pas une valeur pour une macro de paquet, le résultat du paquet utilise est utilisé.
159156 - 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.
160157 - 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.
1611586. les macros par défaut de l'EDI sont définies en dernier.
162159
163160# Exemples
164161
165162## Ajout d'un drapeau de compilateur pour la cible Unix
166163
167164``` pascal
168165if TargetOS = 'linux' then
169166 CustomOptions := '-dUseCThreads';
170167```
171168
172169Notes :
173170
174171- TargetOS est une macro prédéfinie par l'EDI.
175172- CustomOptions est une variable de resultat utilisée par l'EDI.
176173- Les identificateurs sont sensibles à la casse, mais l'opérateur **=** ne l'est pas. La macro TargetOS utilise la même que le compilateur, qui est actuellement la bas-de-casse (minuscules)
177174- L'EDI ajoute le premier espace automatiquement lors de l'ajout d'options personnalisées.
178175- Lorsqu'il est utilisé dans un paquet, ce qui précède sera uniquement appliqué aux options utilisées pour la compilation du paquet et non au projet utilisant le paquet.
179176
180177## Ajout de quelques options de l'éditeur de liens pour la cible Mac OS X
181178
182179Le compilateur utilise pour *Mac OS X* la valeur *darwin* pour *TargetOS*.
183180
184181``` pascal
185182if TargetOS = 'darwin' then begin
186183 LinkerOptions += ' -framework Cocoa';
187184 if TargetCPU = 'i386' then
188185 LinkerOptions += ' -framework OpenGL';
189186end;
190187```
191188
192189Notes:
193190
194191- TargetOS et TargetCPU sont des macros prédéfinies par l'EDI.
195192- L'opérateur **+=** ajoute une chaîne ou ajoute un nombre.
196193- En ajoutant plusieurs options, vous devez ajouter une espace entre les options.
197194- L'EDI ajoute la première espace automatiquement lors de l'ajout des options de l'éditeur de liens.
198195- Vous pouvez imbriquer **begin**..**end** comme en Pascal.
199196- Si les deux conditions sont vérifiées ensemble, **LinkerOptions** contiendra la valeur ' -framework Cocoa -framework OpenGL'.
200197- L'EDI fait précéder l'option -k quand sont passées au compilateur des options de l'éditeur de liens.
201198- Ce qu'il y a en haut ne marche que pour les conditionnelles de projet.
202199
203200## Ajout de quelques options de l'éditeur de liens pour Mac OS X pour tous les projets utilisant un paquet
204201
205202Les 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 :
206203
207204``` pascal
208205if TargetOS = 'darwin' then begin
209206 UsageLinkerOptions += ' -framework Cocoa';
210207 if TargetCPU = 'i386' then
211208 UsageLinkerOptions += ' -framework OpenGL';
212209end;
213210```
214211
215212## Ajout d'une option à un paquet
216213
217214Si 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 :
218215
219216Disons 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'.
220217
221218Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur *Options du compilateur* et sélectionnez la page *Macros de l'EDI*.
222219
223220Cliquez 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'.
224221
225222Cliquez 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'.
226223
227224Ajoutez le code suivant dans la boîte de texte des conditionnelles (Options du compilateur / Options personnalisées)
228225
229226``` pascal
230227if Pkg1_UseOpenGL='True' then
231228 CustomOptions := '-dEnableOpenGL';
232229```
233230
234-<figure>
235-<img src="Compileroptions_buildmacro_example1.png" title="Compileroptions_buildmacro_example1.png" />
236-<figcaption>Compileroptions_buildmacro_example1.png</figcaption>
237-</figure>
231+![](/wiki-images/c/c2/Compileroptions_buildmacro_example1.png)
238232
239233Notes:
240234
241235- La valeur 'True' est sensible à la casse. Comme la valeur est en général choisie à partir d'une combobox, il y a peu de chance d'erreur typographique.
242236- Si l'utilisateur n'a pas défini de valeur pour la macro, la variable 'Pkg1_UseOpenGL' est indéfinie et l'expression est évaluée en 'False'.
243237
244238## Ajouter un mode release/debug
245239
246240### Un mode release/debug pour votre projet et tous vos paquets
247241
248242Note: Ceci nécessite Lazarus Lazarus 0.9.31 ou supérieur.
249243
250244Dans 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.
251245
252246Dans "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.
253247
254248Mettez comme valeur les options, par exemple "-O3".
255249
256-<figure>
257-<img src="Build_mode_release_macro1.png" title="Build_mode_release_macro1.png" />
258-<figcaption>Build_mode_release_macro1.png</figcaption>
259-</figure>
250+![](/wiki-images/1/1f/Build_mode_release_macro1.png)
260251
261252Cette macro est utilisable dans les options du compilateur du projet et tous les paquets.
262253
263254Pour chaque paquet, faites : ouvrir les options du compilateur du paquet, aller à la page *Autres*. Ajoutez aux *Options personnalisée* le texte \$(MyPackageOptions).
264255
265256### Un mode release/debug spécial pour un paquet
266257
267258Admettons que le mode normal est le mode Debug et que vous voulez un autre mode pour les releases.
268259
269260Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur *Options du compilateur", sélectionnez la page*Macros de contruction''.
270261
271262Sous *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'.
272263
273264Cliquer 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'.
274265
275266Ajoutez le code suivant dans la boîte de texte des expressions conditionnelles :
276267
277268``` pascal
278269if Pkg1_Release='True' then
279270 // release mode
280271 CustomOptions := '-O3'
281272else
282273 // debug mode
283274 CustomOptions := '-Sa Ctroi';
284275```
285276
286277Notes:
287278
288279- La valeur 'True' est sensible à la casse. Parce que la valeur est en général sélectionnée depuis une combo box, il y a peu de chance d'erreur de saisie.
289280- Si l'utilisateur n'a pas défini de valeur de la macro, la variable 'Pkg1_Release' est indéfinie et le résultat de l'expression est 'False'.
290281
291282## Ajout d'une macro pour les chemins de recherche pour gérer plusieurs plates-formes
292283
293284Disons 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 :
294285
295286 /path/of/your/package/pkg1/
296287 pkg1.lpk
297288 pkg1.pas
298289 generalunit.pas
299290 gdi/
300291 backend.pas
301292 x11/
302293 backend.pas
303294
304295L'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 :
305296
306297Ouvrez l'éditeur de paquet de votre paquet 'pkg1', cliquez sur les options de compilateur, sélectionnez la page *Macros de construction*.
307298
308299Cliquez 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'.
309300
310301Cliquez 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'.
311302
312303Ajoutez le code suivant dans la boîte de texte des conditionnelles :
313304
314305``` pascal
315306// choisissez le valeur de Pkg1_Backend selon le système cible
316307if undefined(Pkg1_Backend) then begin
317308 if SrcOS='win' then
318309 Pkg1_Backend:='gdi'
319310 else
320311 Pkg1_Backend:='x11';
321312end;
322313```
323314
324315La 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)*.
325316
326-<figure>
327-<img src="Compileroptions_buildmacro_example2.png" title="Compileroptions_buildmacro_example2.png" />
328-<figcaption>Compileroptions_buildmacro_example2.png</figcaption>
329-</figure>
317+![](/wiki-images/7/70/Compileroptions_buildmacro_example2.png)
330318
331319Notes:
332320
333321- L'utilisateur peut surcharger la valeur de Pkg1_Backend. C'est donc une bonne pratique d'entourer les réglages (*settings*) dans un bloc *if undefined(Pkg1_Backend)*.
334322- A la place de la macro SrcOS, vous pourriez utiliser *if (TargetOS='win32') or (TargetOS='win64') or (TargetOS='wince') then*.
335323
336324---
337325*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](/wiki-contact).*

Back to history