InstantFPC/fr

From Free Pascal wiki

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.