Difference between revisions of "FPMake"
(→Basics) |
|||
Line 214: | Line 214: | ||
fpmake --baseinstalldir='c:\program files\my package'; | fpmake --baseinstalldir='c:\program files\my package'; | ||
+ | There are two installer classes implemented: | ||
+ | |||
+ | |||
+ | |||
+ | '''TBasicInstaller''' | ||
+ | |||
+ | Does not set the base output directory, this needs to be set in either the code: | ||
+ | |||
+ | <pascal> | ||
+ | with Installer(TBasicInstaller) do | ||
+ | begin | ||
+ | BaseInstallDir := 'c:\fpmake_test\'; | ||
+ | {$i fpmake.inc} | ||
+ | Run; | ||
+ | end; | ||
+ | </pascal> | ||
+ | |||
+ | Or with the commandline option -B or --baseinstalldir. Either way the use of TBasicInstaller needs to be initiated with the Installer(TBasicInstaller) function. | ||
+ | |||
+ | |||
+ | '''TFPCInstaller''' | ||
+ | |||
+ | Sets the output directory in code. This is done in several consecutive steps. | ||
+ | |||
+ | #Value of FPCDIR environment variable | ||
+ | #Hardcoded value | ||
+ | |||
+ | Just like TBasicInstaller its possible to use commandline options to control the base install directory. | ||
=== Archive === | === Archive === |
Revision as of 22:06, 14 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).
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.Add('corelib/gdi'); wsX : T.UnitPath.Add('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.Add('corelib/gdi'); T.Dependencies.Add('gfx_gdi'); end; Linux : begin T.UnitPath.Add('corelib/x11'); T.Dependencies.Add('gfx_x11'); end; // etc. end;
</pascal>
Commands
The fpmake executable takes several commands that determine the behavior. The most basic usage of fpmake is:
./fpmake
This will build your project when required.
Build
To force a build of your project regardless whether it is nescesary or not a build command should be issued.
./fpmake build
When executing a build command (either forced or non-forced) the units are placed in the directory:
./units/CPU-OS
The executable of library is placed under:
./bin/CPU-OS
If either of these directories does not exist, they are created.
The CPU and OS can be changed by using the following options:
./fpmake --CPU=PPC --OS=Darwin
where the CPU switch takes one from:
- Arm
- I386
- PPC
- SPARC
- X86_64
- M68K
- PPC64
and OS takes one from:
- Amiga
- Atari
- Darwin
- FreeBSD
- Go32v2
- Linux
- MacOS
- MorphOS
- NetBSD
- Netware
- NetwLibc
- OpenBSD
- OS2
- PalmOS
- Solaris
- Win32
- Win64
- WinCE
- Emx
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';
There are two installer classes implemented:
TBasicInstaller
Does not set the base output directory, this needs to be set in either the code:
<pascal>
with Installer(TBasicInstaller) do begin BaseInstallDir := 'c:\fpmake_test\'; {$i fpmake.inc} Run; end;
</pascal>
Or with the commandline option -B or --baseinstalldir. Either way the use of TBasicInstaller needs to be initiated with the Installer(TBasicInstaller) function.
TFPCInstaller
Sets the output directory in code. This is done in several consecutive steps.
- Value of FPCDIR environment variable
- Hardcoded value
Just like TBasicInstaller its possible to use commandline options to control the base install directory.
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.