Difference between revisions of "FPMake"

From Lazarus wiki
Jump to navigationJump to search
Line 69: Line 69:
 
       T.ResourceStrings:=True;  
 
       T.ResourceStrings:=True;  
 
       T:=Targets.AddUnit('myprogram');
 
       T:=Targets.AddUnit('myprogram');
       T.AddDependency('myunit');
+
       T.Dependencies.Add('myunit');
 
       EndPackage; // Actually optional.
 
       EndPackage; // Actually optional.
 
       Run;
 
       Run;

Revision as of 09:51, 11 August 2007

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).

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

 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.

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

 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.

Adding directories

You can add directories with the unit path:

 Case OS of
   Windows : begin
               T.UnitPath:='corelib/gdi';
               T.AddDependency('gfx_gdi');
             end;
   Linux   : begin
               T.UnitPath:='corelib/x11';
               T.AddDependency('gfx_x11');
             end;
   // etc.
 end;

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 tha can be included in an inno setup file.