FPMake
Introduction
This page summarizes all available knowledge on FPMake. FPMake is a pascal based build system developed for and distributed with FPC. It is possible to use FPMake with non FPC development related projects as a replacement for Make or other build systems (like cons, scons, etc).
See also fppkg.
Basics
The upcoming 2.2 will contain the basics for a package system. Look at all directories in the fpc source dirs. You'll find there a fpmake.pp or fpmake.inc.
The idea is that you do a
fppkg <packagename>
this will look in a database for the package, extract it, and the compile fpmake.pp and run it. The fpmake contains all configuration to make and zip the package.
You could download a package manually, compile fpmake.pp and run
./fpmake --build
or
./fpmake --install
which would install the file.
The fpmake.pp file is very simple, just look at the examples, they are scattered all over the place.
The idea is that the release after 2.2 will use this system.
Commandline arguments
C:\FPC\packages\fpmkunit>fpmake --help
Usage: C:\FPC\packages\fpmkunit\fpmake.exe command [options] Where command is one of the following: compile Compile all units in the package(s). build Build all units in the package(s). install Install all units in the package(s). clean Clean (remove) all units in the package(s). archive Create archive (zip) with all units in the package(s). manifest Create a manifest suitable for import in repository. Where options is one or more of the following: -h --help This message. -l --list-commands list commands instead of actually executing them. -n --nodefaults Do not use defaults when compiling. -v --verbose Be verbose when working. -C --CPU=Value Compile for indicated CPU. -O --OS=Value Compile for indicated OS -t --target=Value Compile for indicated target -P --prefix=Value Use indicated prefix directory for all commands. -B --baseinstalldir=Value Use indicated directory as base install dir. -r --compiler=Value Use indicated binary as compiler -f --config=Value Use indicated config file when compiling.
Simple example fpmake.pp
<pascal>
program fpmake;
uses fpmkunit;
Var T : TTarget;
begin With Installer do begin StartPackage('MyNiceProgram'); // Actually optional. Targets.DefaultOS:=[win32,openbsd,netbsd,freebsd,darwin,linux]; T:=Targets.AddUnit('myunit'); T.ResourceStrings:=True; T:=Targets.AddUnit('myprogram'); T.Dependencies.Add('myunit'); EndPackage; // Actually optional. Run; end; end.
</pascal>
Compile with
fpc fpmake.pp
or
fppkg build
which will build (if needed) fpmake and run fpmake in the current directory.
More complex example fpmake.pp
<pascal>
program fpmake;
Type TWidgetSet = (wsGDI,wsX,wCarbon);
Var WidgetSet : TWidgetSet;
procedure DetermineWidgetSet; Var I : Integer; begin Case Installer.OS of Windows : WidgetSet:=wsGDI; Linux : Widgetset:=wsX; MacOS : WidgetSet:=wsCarbon end; // Check paramstr() to see if the widgetset was overriden on the commandline; For I:=1 to ParamCount do If ParamStr(i)='--widgetset=X' then WidgetSet:=wsX; end; begin DetermineWidgetSet; With Installer do /// .... Case WidgetSet of wsGDI : T.UnitPath:='corelib/gdi'; wsX : T.UnitPath:='corelib/x11'; // etc. end; ... Run; end; end.
</pascal>
Adding directories
You can add directories with the unit path:
<pascal>
Case OS of Windows : begin T.UnitPath:='corelib/gdi'; T.Dependencies.Add('gfx_gdi'); end; Linux : begin T.UnitPath:='corelib/x11'; T.Dependencies.Add('gfx_x11'); end; // etc. end;
</pascal>
Commands
Build
./fpmake --build
This will build your project.
Install
./fpmake --install
Will install the project to the default location given in fpmake.pp. You can alter the install location with the following command:
fpmake --baseinstalldir='c:\program files\my package';
Archive
./fpmake --archive
will create a zip.
Innosetup
The plan is to also add
./fpmake --innosetup
Which will generate a file that can be included in an inno setup file.