Difference between revisions of "InstantFPC/fr"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; deleted category included in page template)
 
(One intermediate revision by one other user not shown)
Line 6: Line 6:
 
Cet outil vous permet d'exécuter un programme Pascal comme un script sous Linux, BSD, OS X et Windows. P.ex. :
 
Cet outil vous permet d'exécuter un programme Pascal comme un script sous Linux, BSD, OS X et Windows. P.ex. :
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/env instantfpc
 
#!/usr/bin/env instantfpc
 
begin
 
begin
Line 25: Line 25:
 
Bien sûr vous pouvez passer des paramètres à votre script:
 
Bien sûr vous pouvez passer des paramètres à votre script:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/env instantfpc
 
#!/usr/bin/env instantfpc
 
var
 
var
Line 85: Line 85:
 
Les paramètres du compilateur peuvent être passés dans la ligne shebang. Remarque: vous ne pouvez pas utiliser la commande 'env'.
 
Les paramètres du compilateur peuvent être passés dans la ligne shebang. Remarque: vous ne pouvez pas utiliser la commande 'env'.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/instantfpc -O1 -Ci
 
#!/usr/bin/instantfpc -O1 -Ci
 
begin
 
begin
Line 95: Line 95:
 
<syntaxhighlight lang="bash">export INSTANTFPCOPTIONS="-Fu~/lazarus/components/codetools/units/x86_64-linux/"</syntaxhighlight>
 
<syntaxhighlight lang="bash">export INSTANTFPCOPTIONS="-Fu~/lazarus/components/codetools/units/x86_64-linux/"</syntaxhighlight>
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/instantfpc
 
#!/usr/bin/instantfpc
 
uses FileProcs; // unit FileProcs is in codetools
 
uses FileProcs; // unit FileProcs is in codetools
Line 106: Line 106:
 
L'exemple de script suivant délivre le "numéronyme" d'une chaîne (p.ex. i18n pour internationalization) qui peut être fourni soit par un paramètre ou, si manquant, saisi par l'utilisateur:
 
L'exemple de script suivant délivre le "numéronyme" d'une chaîne (p.ex. i18n pour internationalization) qui peut être fourni soit par un paramètre ou, si manquant, saisi par l'utilisateur:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/env instantfpc
 
#!/usr/bin/env instantfpc
 
uses
 
uses
Line 205: Line 205:
 
Placez le script suivant dans /usr/lib/cgi-bin/showenv.pas:
 
Placez le script suivant dans /usr/lib/cgi-bin/showenv.pas:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
#!/usr/bin/instantfpc
 
#!/usr/bin/instantfpc
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
Line 233: Line 233:
 
L'astuce suivante marche en utilisant le shell ''bash''. Placez le programme dans le fichier ''fpc_script.sh'':
 
L'astuce suivante marche en utilisant le shell ''bash''. Placez le programme dans le fichier ''fpc_script.sh'':
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
// 2>/dev/null; fpc fpc_script.pp &> build.log && exec ./fpc_script "$@" || cat build.log; exit
 
// 2>/dev/null; fpc fpc_script.pp &> build.log && exec ./fpc_script "$@" || cat build.log; exit
 
begin
 
begin
Line 239: Line 239:
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
 
[[Category:FPC]]
 
[[Category:PascalScript]]
 
[[Category:Lazarus-CCR]]
 

Latest revision as of 14:46, 17 February 2020

Deutsch (de) English (en) français (fr)


Overview

Cet outil vous permet d'exécuter un programme Pascal comme un script sous Linux, BSD, OS X et Windows. P.ex. :

#!/usr/bin/env instantfpc
begin
  writeln('Hello fpc user');
end.

Enregistrez le fichier en hello.pas, définissez la permission en exécution (pour Linux et consort) et exécutez-le:

[]$ chmod a+x hello.pas
[]$ ./hello.pas
Hello fpc user

Notes:

  • La première ligne est appelée shebang et est débarrassée du source avant de le passer au compilateur.
  • La ligne 'program hello;' est optionnelle dans FPC. Comme instantfpc passe l'option -o au compilateur, la ligne est ignorée, donc vous pouvez l'omettre.

Bien sûr vous pouvez passer des paramètres à votre script:

#!/usr/bin/env instantfpc
var
  i: Integer;
begin
  for i:=0 to ParamCount do writeln(ParamStr(i));
end.

Enregistrez le fichier comme params.pas, définissez la permission en exécution et exécutez-le:

[]$ chmod a+x params.pas
[]$ ./params.pas A B
/home/mattias/.cache/instantfpc/params.pas
A
B

Télécharger

Pas besoin de télécharger: instantfpc fait partie des sources de FPC 2.6+ dans utils/instantfpc et est installé par défaut.

Anciennes versions

Pour fpc 2.5.1 et suivantes: c'est dans les sources de fpc:

svn co http://svn.freepascal.org/svn/fpc/trunk/utils/instantfpc instantfpc

Pour fpc 2.4.4 et 2.4.5:

svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/applications/instantfpc instantfpc

Installation

Note: C'est déjà installé avec fpc 2.5.1 et suivantes. Les utilisateurs sous Windows doivent placer instantfpc.exe dans un dossier de leur PATH.

  1. Compilez le projet instantfpc.lpi avec Lazarus ou Lazbuild. Ou compilez-le directement avec fpc instantfpc.pas.
  2. Placez l'exécutable dans un répertoire de votre PATH, par exemple /usr/bin:
sudo cp instantfpc /usr/bin/

Comment ça marche

Il utilise un répertoire cache pour compiler. Par défaut c'est $HOME/.cache/instantfpc. Si la variable $HOME n'est pas définie, cela déclenche une erreur. Vous pouvez surcharger le dossier en définissant la variable d'environnement INSTANTFPCCACHE. Il compare le source avec celui enregistré dans le cache et s'il diffère, le source est compilé en tenant compte des paramètres passés dans la ligne shebang (la première ligne dans le script après #!). Après la compilation réussie, il exécute le programme. Si la compilation échoue, il écrit la sortie de fpc sur la sortie standard.

Paramètres de instantfpc

  • -h: Affiche l'aide et se termine
  • -v: Affiche la version courante et se termine.>
  • --get-cache: Affiche le répertoire cache courant et se termine.
  • --set-cache=<directory>: Définit le cache courant.
  • -B: force la compilation même si le programme en cache est valide.
  • --compiler=<path to compiler> utilise ce compilateur. Par défaut, fpc est recherché dans le PATH.
  • --skip-run: N'exécute pas le programme. Utile pour tester si le script compile. Meilleur si combiné avec -B.
  • Variable d'environnement INSTANTFPCCACHE: Définit le répertoire du cache. L'option --get-cache peut surcharger ceci.
  • Variable d'environnement INSTANTFPCOPTIONS: Les options à passer au compilateur, passées avant les paramètres de la ligne de commande.

Passage de paramètres au compilateur

Les paramètres du compilateur peuvent être passés dans la ligne shebang. Remarque: vous ne pouvez pas utiliser la commande 'env'.

#!/usr/bin/instantfpc -O1 -Ci
begin
end.

Et/Ou vous pouvez placer les options du compilateur dans la variable d'environnement INSTANTFPCOPTIONS:

export INSTANTFPCOPTIONS="-Fu~/lazarus/components/codetools/units/x86_64-linux/"
#!/usr/bin/instantfpc
uses FileProcs; // unit FileProcs is in codetools
begin
end.

Exemple

L'exemple de script suivant délivre le "numéronyme" d'une chaîne (p.ex. i18n pour internationalization) qui peut être fourni soit par un paramètre ou, si manquant, saisi par l'utilisateur:

#!/usr/bin/env instantfpc
uses
  SysUtils;
var
  theWord: String;
begin  
  if ParamStr(1) = '' then
  begin
    write('SVP, entrez le mot à "numéronymiser": ');
    readln(theWord);
  end
  else
    theWord := ParamStr(1);
  if length(theWord) > 2 then
    writeln(theWord[1] + IntToStr(length(theWord)-2) + theWord[length(theWord)])
  else
    writeln('N/A');
end.

Usage avec Lazarus

Depuis Lazarus 0.9.31, l'EDI ignore la ligne shebang. Vous obtenez toutes les caractéristiques normal du code.

Installez le paquet EDI instantfpclaz, qui est fourni avec Lazarus. Ceci ajoutera un nouveau modèle de projet pour créer des programmes instantfpc, par exemple, sous Fichier / Nouveau / Projet / InstantFPC program.

Compiler dans Lazarus

Comment convertir un projet Lazarus pour le compiler avec instantfpc:

Requiert:

  • Le source principal du projet Lazarus est le programme instantfpc.

Réglage:

  • Aller vers Projet / Options du projet / Compiler commands / Compilation
  • Désactivez tout les cases à cocher Appel sur pour Compiler
  • Définissez dans Exécuter avant la Commande en:
instantfpc --skip-run -B -gl "-Fu$(ProjUnitPath)" $Name($(ProjFile))
  • Activez les cases à cocher des scan make et fpc

Remarques:

  • L'option -gl demande à FPC de compiler avec les informations de débogage
  • L'option --skip-run -B compile sans exécuter après.
  • Voir IDE Macros

Débogage avec Lazarus

Comment convertir un projet Lazarus pour déboguer un programme instantfpc:

Requiert:

  • Ci dessus Compiler dans Lazarus

Réglages:

  • Aller vers Exécuter / Paramètres d'exécution
  • Définissez Local / Application hôte vers $(InstantFPCCache)/$NameOnly($(ProjFile))
  • Definissez Répertoire de travail vers $(ProjPath)

Usage dans Apache

Ceci montre comment utiliser instantfpc dans un serveur Web Apache. Instantfpc nécessite un répertorie cache qui doit être accessible en écriture par un compte Apache. Disons qu'Apache tourne avec le compte utilisateur www-data et le groupe www-data (Redhat, Fedora: apache.apache, voir la config. pour l'utilisateur et le groupe).

mkdir /var/apacheinstantfpc
chown www-data.www-data /var/apacheinstantfpc

Passez une variable d'environnement pour les script CGI en ajoutant la ligne suivante dans les configs Apache:

SetEnv INSTANTFPCCACHE /var/apacheinstantfpc

Conseil de sécurité: Bien que l'utilisateur apache doit avoir un accès complet au répertoire de cache, assurez-vous que le répertoire n'est pas disponible à partir de l'extérieur (par exemple, ne pas mettre sous /var/www). Il peut contenir des anciens scripts. Et comme tout autre type de script: Vérifiez toutes les entrées pour les attaques.

Remarque sur l'optimisation: Le cache de instantfpc utilise un fichier par nom de script. Ne pas utiliser le même nom de script deux fois, sinon il sera compilé de nombreuses fois. Vous pouvez créer plusieurs répertoires de cache. Chaque section <Directory> et <VirtualHost> peut définir leurs propres variables d'environnement, et donc vous pouvez configurer un répertoire de cache pour chacun.

Exemple Apache montrant env

Configurer un répertoire pour exécuter les scripts cgi. P.ex.:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
  AllowOverride None
  Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all
  SetEnv INSTANTFPCCACHE /var/apacheinstantfpc
  # You can put fpc options into /etdc/fpc.cfg or here:
  #SetEnv INSTANTFPCOPTIONS -Fu/path/to/somevar/ppufiles

  # If this is root directory, you might have to set:
  #Require all granted
</Directory>

Si votre Apache n'a pas encore activé le module cgi:

a2enmod cgi

Placez le script suivant dans /usr/lib/cgi-bin/showenv.pas:

#!/usr/bin/instantfpc
{$mode objfpc}{$H+}
uses  SysUtils;
var  i: Integer;
begin
  writeln('Content-type: text/html');
  writeln;
  writeln('<HTML><BODY>');
  for i:=0 to Paramcount do
    writeln('Param ',i,' ',ParamStr(i),'<br>');
  for i:=1 to GetEnvironmentVariableCount do
    writeln('Env ',GetEnvironmentString(i),'<br>');
  writeln('</BODY></HTML>');
end.

Bugs / A faire / Limitations

  • Les changements dans le compilateur ou les unités en sont pas vérifiés. Si vous installez un nouveau compilateur, vous devez nettoyer le cache (i.e. supprimer le répertoire ~/.cache/instantfpc).
  • Sous Windows, seul le premier paramètre est passé au script.
  • Avec les versions de instantfpc antérieures à 1.3, vous ne pouvez pas compiler en parallèle. Le compilateur crée des fichiers cachés comme 'link.res' pendant la compilation. Depuis la version 1.3, instantfpc utilise des répertoires temporaires pour la compilation.
  • Le cache utilise le nom de fichier sans le chemin d'accès. Donc vous ne pouvez pas exécuter deux scripts en parallèle avec le même nom et le script sera compilé à chaque fois.

Alternatives

L'astuce suivante marche en utilisant le shell bash. Placez le programme dans le fichier fpc_script.sh:

// 2>/dev/null; fpc fpc_script.pp &> build.log && exec ./fpc_script "$@" || cat build.log; exit
begin
  writeln('');
end.