From Lazarus wiki
Jump to navigationJump to search


This tool allows to run pascal program as scripts under Linux, BSD, OS X and Windows. For example:


  1. !/usr/bin/env instantfpc


 writeln('Hello fpc user');

end. </Delphi>

Save the file as hello.pas, set the permission to execute and run it:

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


  • The first line is called shebang and is stripped from the source before passing it to the compiler.
  • The line 'program hello;' is optional in FPC. Because instantfpc passes the -o option to the compiler the line is ignored, so you can omit it.

Of course you can pass parameters to your script:


  1. !/usr/bin/env instantfpc


 i: Integer;


 for i:=0 to ParamCount do writeln(ParamStr(i));

end. </Delphi>

Save the file as params.pas, set the permission to execute and run it:

[]$ chmod a+x params.pas
[]$ ./params.pas A B


Instantfpc is part of the fpc 2.5.1 sources under utils/instantfpc and installed by default.

From svn

For fpc 2.5.1 and above: It is in the fpc sources:

svn co instantfpc

For fpc 2.4.4 and 2.4.5:

svn co instantfpc


Note: It is already installed when using fpc 2.5.1 and above.

  1. Compile the instantfpc.lpi with Lazarus or lazbuild. Or compile directly with fpc instantfpc.pas.
  2. Put the executable into PATH, for example /usr/bin:
sudo cp instantfpc /usr/bin/

How it works

It uses a cache directory to compile. Default is $HOME/.cache/instantfpc. If HOME is not set it gives an error. You can override the directory by setting the environment variable INSTANTFPCCACHE. It compares the source with the stored file in cache and if it differs compiles the source, given the parameters in the shebang line (the first line of the script after #!). After successful compile it executes the program. If compilation fails it writes the fpc output to stdout.

Parameters of instantfpc

  • -h: Print help and exit
  • -v: Print current version and exit
  • --get-cache: Print current cache directory and exit
  • --set-cache=<directory>: Set cache directory
  • -B: always compile even if cache is valid.
  • --compiler=<path to compiler> use this compiler. By default fpc is searched in PATH.
  • --skip-run: Do not execute the program. Useful to test if script compiles. Best combined with -B.
  • Environment variable INSTANTFPCCACHE: Set cache directory. The --get-cache can override this.
  • Environment variable INSTANTFPCOPTIONS: Options to pass to the compiler. Passed before the command line parameters.

Passing parameters to the compiler

Compiler parameters can be passed in the shebang line. Note: You can not use the 'env' command.


  1. !/usr/bin/instantfpc -O1 -Ci

begin end. </Delphi>

And/Or you can put compiler options in the environment variable INSTANTFPCOPTIONS:

export INSTANTFPCOPTIONS="-Fu~/lazarus/components/codetools/units/x86_64-linux/"


  1. !/usr/bin/instantfpc

uses FileProcs; // unit FileProcs is in codetools begin end. </Delphi>

Using with Lazarus

Since Lazarus 0.9.31 the IDE ignores the shebang line. You get all the normal code features.

Compile in Lazarus

How to compile a Lazarus project with instantfpc:


  • Lazarus project main source file is the instantfpc program


  • Go to Project Options / Compiler Options / Compilation
  • Disable all Call on checks for Compiler
  • Set in Execute before the Command to:
instantfpc --skip-run -B -gl "-Fu$(ProjUnitPath)" $Name($(ProjFile))
  • Enable checkboxes to scan make and fpc


  • The -gl will tell FPC to compile with debugging information
  • The --skip-run -B compiles without executing
  • See IDE Macros

Debug with Lazarus

How to debug an instantfpc program in Lazarus:


  • The above Compile in Lazarus


  • Go to Run / Run parameters
  • Set Local / Host application to

Using in Apache

This is how to use instantfpc in Apache Webserver. Instantfpc needs the cache directory, which must be writable by the account of Apache. Let's say Apache is running under user www-data, group www-data.

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

Pass an environment variable to cgi scripts by adding the following line to the Apache configs:

SetEnv INSTANTFPCCACHE /var/www/apacheinstantfpc

Apache example showing env

Configure a directory to execute cgi scripts. For example:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
  AllowOverride None
  Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all

Put the following script into /usr/lib/cgi-bin/showenv.pas:


  1. !/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),'
');   for i:=1 to GetEnvironmentVariableCount do     writeln('Env ',GetEnvironmentString(i),'
');   writeln('</BODY></HTML>'); end. </Delphi>

Bugs / ToDos

  • Changes to the compiler or installed units are not checked. If you install a new compiler you should clean the cache (e.g. delete the directory ~/.cache/instantfpc).


The following trick works in the bash. Put the program into a file

<Delphi> // 2>/dev/null; fpc fpc_script.pp &> build.log && exec ./fpc_script "$@" || cat build.log; exit begin


end. </Delphi>