Difference between revisions of "FPMake/ru"
Line 15: | Line 15: | ||
FPMake работает с Pascal-приложениями, называемыми fpmake, каждое из которых может скомпилировать и установить один или несколько FPMake-пакетов. Все настройки, расположение исходников и инструкции определены внутри исходного кода этого исполняемого файла fpmake. Этот исходный файл обычно сохраняется с именем fpmake.pp. Файл fpmake.pp компилируется в исполняемый файл fpmake, и этот исполняемый файл может создавать и устанавливать конечные пакеты. | FPMake работает с Pascal-приложениями, называемыми fpmake, каждое из которых может скомпилировать и установить один или несколько FPMake-пакетов. Все настройки, расположение исходников и инструкции определены внутри исходного кода этого исполняемого файла fpmake. Этот исходный файл обычно сохраняется с именем fpmake.pp. Файл fpmake.pp компилируется в исполняемый файл fpmake, и этот исполняемый файл может создавать и устанавливать конечные пакеты. | ||
− | == | + | == Сборка пакетов FPMake == |
− | + | Самое простое - использовать [[fppkg/ru|fppkg]] для сборки пакета FPMake. Но это также можно сделать вручную. Найдите исходники пакета, который вы хотите установить, и файл fpmake.pp. Теперь скомпилируйте файл fpmake.pp: | |
− | + | <syntaxhighlight lang="bash">fpc fpmake.pp</syntaxhighlight> | |
− | |||
− | |||
+ | Типичный вывод выглядит так: | ||
+ | <syntaxhighlight> | ||
Free Pascal Compiler version 2.7.1 [2014/11/26] for i386 | Free Pascal Compiler version 2.7.1 [2014/11/26] for i386 | ||
Copyright (c) 1993-2014 by Florian Klaempfl and others | Copyright (c) 1993-2014 by Florian Klaempfl and others | ||
Line 28: | Line 28: | ||
Assembling (pipe) fpmake.s | Assembling (pipe) fpmake.s | ||
Linking fpmake | Linking fpmake | ||
− | 203 lines compiled, 3.6 sec | + | 203 lines compiled, 3.6 sec</syntaxhighlight> |
− | + | Теперь запустите новый исполняемый файл fpmake(.exe), чтобы собрать пакеты. Этот пример содержит только один пакет. | |
− | + | На nix'ах или аналогичных ОСях: | |
− | + | <syntaxhighlight lang="bash">./fpmake build --globalunitdir=/usr/local/lib/fpc/2.7.1</syntaxhighlight> | |
− | + | На Windows или аналогичных ОСях: | |
− | + | <syntaxhighlight>fpmake.exe build --globalunitdir=c:\pp</syntaxhighlight> | |
− | + | Типичный вывод выглядит так: | |
+ | <syntaxhighlight> | ||
Start compiling package fcl-base for target i386-darwin. | Start compiling package fcl-base for target i386-darwin. | ||
Compiling src/ascii85.pp | Compiling src/ascii85.pp | ||
Line 44: | Line 45: | ||
Compiling src/base64.pp | Compiling src/base64.pp | ||
Compiling src/fpmimetypes.pp | Compiling src/fpmimetypes.pp | ||
− | [100%] Compiled package fcl-base | + | [100%] Compiled package fcl-base</syntaxhighlight> |
− | + | Параметр <tt>--globalunitdir</tt> указывает местоположение уже установленных глобальных пакетов. Таким образом, FPMake может найти пакеты, от которых зависит этот пакет. Когда есть второе место, где установлены пакеты, кроме того, можно использовать параметр <tt>--localunitdir</tt>. | |
− | + | Если вы хотите узнать, какой путь вы должны использовать для параметра <tt>--global(local)unitdir</tt>, то [поищите] каталог, который содержит папку с именем 'fpmkinst'. | |
− | + | Чтобы удалить все файлы, сгенерированные во время сборки, и сделать «чистую» сборку, выполните очистку. | |
− | + | На nix'ах или аналогичных ОСях: | |
− | + | <syntaxhighlight lang="bash">./fpmake clean</syntaxhighlight> | |
− | + | На Windows или аналогичных ОСях: | |
− | + | <syntaxhighlight>fpmake.exe clean</syntaxhighlight> | |
− | + | Используйте параметр <tt>-h</tt>, чтобы получить обзор всех других доступных команд и опций. | |
== Installing FPMake packages == | == Installing FPMake packages == |
Revision as of 15:33, 16 January 2019
│ English (en) │ русский (ru) │
FPMake - это система сборки, специализированная для кода на Паскале. Его можно сравнить с другими системами сборки, такими как Make, cons, scons и т.д.
С помощью FPMake код разбивается на пакеты. Пакет FPMake может содержать модули, двоичные файлы, примеры и документацию. Каждый пакет может зависеть от других пакетов, и в этом случае пакет может использовать модули своих зависимостей. FPMake использует два разных местоположения для поиска пакетов: общесистемное (глобальное) и локальное местоположение. По умолчанию глобальное расположение указывает на местоположение установленного fpc, а локальное расположение зависит от пользовательских настроек.
Некоторые части самого fpc скомпилированы с использованием FPMake. (Пакеты fastcgi и fcl-web в fpc 2.6 и все пакеты, утилиты и ide в fpc 2.7 и выше).
Менеджер пакетов fppkg может использоваться для управления пакетами FPMake и их установки из удаленного репозитория.
Как это работает
FPMake работает с Pascal-приложениями, называемыми fpmake, каждое из которых может скомпилировать и установить один или несколько FPMake-пакетов. Все настройки, расположение исходников и инструкции определены внутри исходного кода этого исполняемого файла fpmake. Этот исходный файл обычно сохраняется с именем fpmake.pp. Файл fpmake.pp компилируется в исполняемый файл fpmake, и этот исполняемый файл может создавать и устанавливать конечные пакеты.
Сборка пакетов FPMake
Самое простое - использовать fppkg для сборки пакета FPMake. Но это также можно сделать вручную. Найдите исходники пакета, который вы хотите установить, и файл fpmake.pp. Теперь скомпилируйте файл fpmake.pp:
fpc fpmake.pp
Типичный вывод выглядит так:
Free Pascal Compiler version 2.7.1 [2014/11/26] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Darwin for i386
Compiling fpmake.pp
Assembling (pipe) fpmake.s
Linking fpmake
203 lines compiled, 3.6 sec
Теперь запустите новый исполняемый файл fpmake(.exe), чтобы собрать пакеты. Этот пример содержит только один пакет.
На nix'ах или аналогичных ОСях:
./fpmake build --globalunitdir=/usr/local/lib/fpc/2.7.1
На Windows или аналогичных ОСях:
fpmake.exe build --globalunitdir=c:\pp
Типичный вывод выглядит так:
Start compiling package fcl-base for target i386-darwin.
Compiling src/ascii85.pp
Compiling src/avl_tree.pp
Compiling src/base64.pp
Compiling src/fpmimetypes.pp
[100%] Compiled package fcl-base
Параметр --globalunitdir указывает местоположение уже установленных глобальных пакетов. Таким образом, FPMake может найти пакеты, от которых зависит этот пакет. Когда есть второе место, где установлены пакеты, кроме того, можно использовать параметр --localunitdir.
Если вы хотите узнать, какой путь вы должны использовать для параметра --global(local)unitdir, то [поищите] каталог, который содержит папку с именем 'fpmkinst'.
Чтобы удалить все файлы, сгенерированные во время сборки, и сделать «чистую» сборку, выполните очистку.
На nix'ах или аналогичных ОСях:
./fpmake clean
На Windows или аналогичных ОСях:
fpmake.exe clean
Используйте параметр -h, чтобы получить обзор всех других доступных команд и опций.
Installing FPMake packages
Just like building packages, using fppkg to install FPMake packages is the easiest. But it canbe done manually. First compile the package and then call the fpmake executable to install the package.
On unices or alike:
./fpmake install --globalunitdir=/usr/local/lib/fpc/2.7.1 --prefix=/usr/local --baseinstalldir=/usr/local/lib/fpc/2.7.1
On Windows or alike:
fpmake.exe install --globalunitdir=c:\pp --prefix=c:\pp --baseinstalldir=c:\pp
Typical output looks like:
Installing package fcl-base Installation package fcl-base for target i386-darwin succeeded
The globalunitdir contains the location where to look for packages that the FPMake package can depend on, just like when building the package. The baseinstalldir is the location where the package should be installed to. In general this is the same path as is used for the global- or local-unitdir. Some packages also installs files outside of the baseinstalldir. like configuration files. These packages most often also need a prefix, so providing one is advisable.
How to create FPMake-packages
Simple example fpmake.pp
program fpmake;
uses fpmkunit;
Var
P: TPackage;
T: TTarget;
begin
With Installer do
begin
P := AddPackage('my-nice-program');
P.OSes := [win32,openbsd,netbsd,freebsd,darwin,linux];
T := P.Targets.AddUnit('myunit');
T.ResourceStrings := True;
T := P.Targets.AddUnit('myprogram');
T.Dependencies.Add('myunit');
Run;
end;
end.
More complex example fpmake.pp
program fpmake;
uses fpmkunit;
type TWidgetSet = (wsGDI, wsX, wsCarbon);
var WidgetSet : TWidgetSet;
P : TPackage;
procedure DetermineWidgetSet;
Var
I : Integer;
begin
if Defaults.OS in AllWindowsOSes then
WidgetSet := wsGDI else
if Defaults.OS = MacOS then
WidgetSet := wsCarbon else
if Defaults.OS in AllUnixOSes then
Widgetset := wsX;
// 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
begin
// ...
Case WidgetSet of
wsGDI : P.UnitPath.Add('corelib/gdi');
wsX : P.UnitPath.Add('corelib/x11');
// etc.
end;
// ...
Run;
end;
end.
Changing Working Directory
If working with units in a subfolder relative to ./fpmake, then "Directory" can be changed.
With Installer do
begin
...
Directory:='some/subdir';
T:= Targets.AddUnit('unitinfolder');
...
end;
Adding directories
You can add directories with the unit path:
Case Defaults.OS of
Win32, Win64:
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;
end;
Often, it's more comfortable to use set constants like AllWindowsOSes, AllUnixOSes instead of specific OS names.
Appending Compiler Options
Additional custom compiler options (i.e. compiler command line parameters) can be appended by using TTarget.Options, TPackage.Options, or Defaults.Options.
var T : TTarget;
...
T.Options.Append('-dSOMEDEFINE');
T.Options.Append('-xyzAnythingYouNeed');
Or
var P : TPackage;
...
P.Options.Append('-dSOMEDEFINE');
Or
Defaults.Options.Append('-dSOMEDEFINE');
Note: Before FPC 2.4.0, Options property was a simple string, and it seems it supported passing only one parameter to the compiler. Since FPC 2.4.0 (more precisely, since svn revision 13223) Options is a TStrings instance, so it's much more flexible. This also means that you should use $ifdefs if you want to use Options and want your fpmake.pp be compatible with both FPC < 2.4.0 and >= 2.4.0.
Common error messages
A few common error messages are explained here
Unknown target for unit "[unitname]" in dependencies for [targetname] in package [packagename]
This indicates a problem in the fpmake.pp file. There is a dependency on a unit, added using Target.Dependencies.AddUnit('unitname'). But there is no corresponding target added to the package with the same unitname.
In other words: for every dependency on a unit, there must be a corresponding target within the same package. When there is a dependency on a unit in another package, add a dependency on that package. A dependency on a single file within a different package will not work.
Also note that the unit name has to be without the extension of the corresponding file. (Target.Dependencies.AddUnit('unitnams.pas') will not work, while Targets.Addunit requires the extension to be present)
Could not find unit directory for dependency package "rtl"
In general the fpmake system scans the places typically used for fpc installations. In the case that fpmake doesn't find the FPC directory, you'll get the above mentioned error. In such case, set the FPCDIR environment variable to the base dir of the FPC installation, e.g.:
export FPCDIR=~/src/lib/fpc/2.6.4
or
set FPCDIR=C:\lazarus\fpc\2.6.4\
This can also be useful if you have to disambiguate over multiple FPC installations.