Sign in Join
Wiki copytemporary

FPMake/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: FPMake/ru

OldNewLine
1+**FPMake** \- это система сборки, специализированная для кода на Паскале. Его можно сравнить с другими системами сборки, такими как Make, cons, scons и т.д.
2+
3+С помощью FPMake код разбивается на пакеты. Пакет FPMake может содержать модули, двоичные файлы, примеры и документацию. Каждый пакет может зависеть от других пакетов, и в этом случае пакет может использовать модули своих зависимостей. FPMake использует два разных местоположения для поиска пакетов: общесистемное (глобальное) и локальное местоположение. По умолчанию глобальное расположение указывает на местоположение установленного fpc, а локальное расположение зависит от пользовательских настроек.
4+
5+Некоторые части самого fpc скомпилированы с использованием FPMake. (Пакеты fastcgi и fcl-web в fpc 2.6 и все пакеты, утилиты и ide в fpc 2.7 и выше).
6+
7+Менеджер пакетов [[fppkg/ru|fppkg]] может использоваться для управления пакетами FPMake и их установки из удаленного репозитория.
8+
9+
10+
11+## Contents
12+
13+ * 1 Как это работает
14+ * 2 Сборка пакетов FPMake
15+ * 3 Установка пакетов FPMake
16+ * 4 Как создать FPMake-пакеты
17+ * 4.1 Простой пример fpmake.pp
18+ * 4.2 Более сложный пример fpmake.pp
19+ * 4.3 Изменение рабочего каталога
20+ * 4.4 Добавление каталогов
21+ * 4.5 Добавление параметров компилятора
22+ * 5 Распространенные сообщения об ошибках
23+ * 5.1 Unknown target for unit "[unitname]" in dependencies for [targetname] in package [packagename]
24+ * 5.2 Could not find unit directory for dependency package "rtl"
25+
26+## Как это работает
27+
28+FPMake работает с Pascal-приложениями, называемыми fpmake, каждое из которых может скомпилировать и установить один или несколько FPMake-пакетов. Все настройки, расположение исходников и инструкции определены внутри исходного кода этого исполняемого файла fpmake. Этот исходный файл обычно сохраняется с именем fpmake.pp. Файл fpmake.pp компилируется в исполняемый файл fpmake, и этот исполняемый файл может создавать и устанавливать конечные пакеты.
29+
30+## Сборка пакетов FPMake
31+
32+Самое простое - использовать [[fppkg/ru|fppkg]] для сборки пакета FPMake. Но это также можно сделать вручную. Найдите исходники пакета, который вы хотите установить, и файл fpmake.pp. Теперь скомпилируйте файл fpmake.pp:
33+```
34+fpc fpmake.pp
35+```
36+
37+Типичный вывод выглядит так:
38+```
39+Free Pascal Compiler version 2.7.1 [2014/11/26] for i386
40+ Copyright (c) 1993-2014 by Florian Klaempfl and others
41+ Target OS: Darwin for i386
42+ Compiling fpmake.pp
43+ Assembling (pipe) fpmake.s
44+ Linking fpmake
45+ 203 lines compiled, 3.6 sec
46+```
47+
48+Теперь запустите новый исполняемый файл fpmake(.exe), чтобы собрать пакеты. Этот пример содержит только один пакет.
49+
50+На nix'ах или аналогичных ОСях:
51+```
52+./fpmake build --globalunitdir=/usr/local/lib/fpc/2.7.1
53+```
54+
55+На Windows или аналогичных ОСях:
56+```
57+fpmake.exe build --globalunitdir=c:\pp
58+```
59+
60+Типичный вывод выглядит так:
61+```
62+Start compiling package fcl-base for target i386-darwin.
63+ Compiling src/ascii85.pp
64+ Compiling src/avl_tree.pp
65+ Compiling src/base64.pp
66+ Compiling src/fpmimetypes.pp
67+ [100%] Compiled package fcl-base
68+```
69+
70+Параметр `--globalunitdir` указывает местоположение уже установленных глобальных пакетов. Таким образом, FPMake может найти пакеты, от которых зависит этот пакет. Когда есть второе место, где установлены пакеты, кроме того, можно использовать параметр `--localunitdir`.
71+
72+Если вы хотите узнать, какой путь вы должны использовать для параметра `--global(local)unitdir`, то [поищите] каталог, который содержит папку с именем 'fpmkinst'.
73+
74+Чтобы удалить все файлы, сгенерированные во время сборки, и сделать «чистую» сборку, выполните очистку.
75+
76+На nix'ах или аналогичных ОСях:
77+```
78+./fpmake clean
79+```
80+
81+На Windows или аналогичных ОСях:
82+```
83+fpmake.exe clean
84+```
85+
86+Используйте параметр `-h`, чтобы получить обзор всех других доступных команд и опций.
87+
88+## Установка пакетов FPMake
89+
90+Как и при сборке пакетов, использование [[fppkg/ru|fppkg]] для установки пакетов FPMake является самым простым. Но это можно сделать вручную. Сначала скомпилируйте пакет, а затем вызовите исполняемый файл fpmake для установки пакета.
91+
92+На никсах и аналогичных ОСях:
93+```
94+./fpmake install --globalunitdir=/usr/local/lib/fpc/2.7.1 --prefix=/usr/local --baseinstalldir=/usr/local/lib/fpc/2.7.1
95+```
96+
97+На Windows и аналогичных ОСях:
98+```
99+fpmake.exe install --globalunitdir=c:\pp --prefix=c:\pp --baseinstalldir=c:\pp
100+```
101+
102+Типичный вывод выглядит так:
103+```
104+Installing package fcl-base
105+ Installation package fcl-base for target i386-darwin succeeded
106+```
107+
108+Globalunitdir содержит местоположение, в котором нужно искать пакеты, от которых может зависеть пакет FPMake, как при сборке пакета. Baseinstalldir - это место, куда должен быть установлен пакет. В общем, это тот же путь, который используется для global- или local-unitdir. Некоторые пакеты также устанавливают файлы за пределами baseinstalldir. как файлы конфигурации. Эти пакеты чаще всего также нуждаются в префиксе, поэтому рекомендуется его указывать.
109+
110+## Как создать FPMake-пакеты
111+
112+### Простой пример fpmake.pp
113+```
114+program fpmake;
115+
116+ uses fpmkunit;
117+
118+ Var
119+ P: TPackage;
120+ T: TTarget;
121+
122+ begin
123+ With Installer do
124+ begin
125+ P := AddPackage('my-nice-program');
126+ P.OSes := [win32,openbsd,netbsd,freebsd,darwin,linux];
127+ T := P.Targets.AddUnit('myunit');
128+ T.ResourceStrings := True;
129+ T := P.Targets.AddUnit('myprogram');
130+ T.Dependencies.Add('myunit');
131+ Run;
132+ end;
133+ end.
134+```
135+
136+### Более сложный пример fpmake.pp
137+```
138+program fpmake;
139+
140+ uses fpmkunit;
141+
142+ type TWidgetSet = (wsGDI, wsX, wsCarbon);
143+
144+ var WidgetSet : TWidgetSet;
145+ P : TPackage;
146+
147+ procedure DetermineWidgetSet;
148+ Var
149+ I : Integer;
150+ begin
151+ if Defaults.OS in AllWindowsOSes then
152+ WidgetSet := wsGDI else
153+ if Defaults.OS = MacOS then
154+ WidgetSet := wsCarbon else
155+ if Defaults.OS in AllUnixOSes then
156+ Widgetset := wsX;
157+
158+ // Проверьте paramstr(), чтобы увидеть, был ли переопределен набор виджетов в командной строке;
159+ For I := 1 to ParamCount do
160+ If ParamStr(i) = '--widgetset=X' then
161+ WidgetSet := wsX;
162+ end;
163+
164+ begin
165+ DetermineWidgetSet;
166+ With Installer do
167+ begin
168+ // ...
169+ Case WidgetSet of
170+ wsGDI : P.UnitPath.Add('corelib/gdi');
171+ wsX : P.UnitPath.Add('corelib/x11');
172+ // и т.д.
173+ end;
174+ // ...
175+ Run;
176+ end;
177+ end.
178+```
179+
180+### Изменение рабочего каталога
181+
182+Если вы работаете с модулями в подкаталоге относительно ./fpmake, то "Каталог" можно изменить.
183+```
184+With Installer do
185+ begin
186+ ...
187+ Directory:='some/subdir';
188+ T:= Targets.AddUnit('unitinfolder');
189+ ...
190+ end;
191+```
192+
193+### Добавление каталогов
194+
195+Вы можете добавить каталоги с помощью пути к модулю:
196+```
197+Case Defaults.OS of
198+ Win32, Win64:
199+ begin
200+ T.UnitPath.Add('corelib/gdi');
201+ T.Dependencies.Add('gfx_gdi');
202+ end;
203+ Linux:
204+ begin
205+ T.UnitPath.Add('corelib/x11');
206+ T.Dependencies.Add('gfx_x11');
207+ end;
208+ end;
209+```
210+
211+Часто удобнее использовать заданные константы, такие как AllWindowsOS, AllUnixOS, а не конкретные имена ОС.
212+
213+### Добавление параметров компилятора
214+
215+Дополнительные пользовательские параметры компилятора (т.е. параметры командной строки компилятора) могут быть добавлены с помощью TTarget.Options, TPackage.Options или Defaults.Options.
216+```
217+var T : TTarget;
218+ ...
219+ T.Options.Append('-dSOMEDEFINE');
220+ T.Options.Append('-xyzAnythingYouNeed');
221+```
222+
223+Или
224+```
225+var P : TPackage;
226+ ...
227+ P.Options.Append('-dSOMEDEFINE');
228+```
229+
230+Или
231+```
232+Defaults.Options.Append('-dSOMEDEFINE');
233+```
234+
235+**Примечание** : До FPC 2.4.0 свойство Options представляло собой простую строку и, похоже, поддерживало передачу только одного параметра компилятору. Начиная с FPC 2.4.0 (точнее, начиная с svn revision 13223), Options - это экземпляр TStrings, поэтому он гораздо более гибкий. Это также означает, что вы должны использовать $ifdefs, если вы хотите использовать Options и хотите, чтобы ваш fpmake.pp был совместим с FPC < 2.4.0 и >= 2.4.0.
236+
237+## Распространенные сообщения об ошибках
238+
239+Несколько общих сообщений об ошибках объяснены здесь
240+
241+### Unknown target for unit "[unitname]" in dependencies for [targetname] in package [packagename]
242+
243+Неизвестная цель для модуля "[unitname]" в зависимостях для [targetname] в пакете [packagename]
244+
245+\- Это указывает на проблему в файле fpmake.pp. Существует зависимость от модуля, добавляемая с помощью Target.Dependencies.AddUnit('unitname'). Но нет соответствующей цели, добавленной в пакет с таким же именем модуля.
246+
247+Другими словами: для каждой зависимости от модуля должна быть соответствующая цель в том же пакете. Если существует зависимость от модуля в другом пакете, добавьте зависимость для этого пакета. Зависимость от одного файла в другом пакете не будет работать.
248+
249+Также обратите внимание, что имя модуля должно быть без расширения соответствующего файла. (Target.Dependencies.AddUnit('unitnams.pas') не будет работать, в то время как Targets.Addunit требует наличия расширения).
250+
251+### Could not find unit directory for dependency package "rtl"
252+
253+Не удалось найти каталог модуля для зависимостей пакета "rtl"
254+
255+\- В общем, система fpmake сканирует места, обычно используемые для установки fpc. В случае, если fpmake не найдет каталог FPC, вы получите вышеупомянутую ошибку. В таком случае установите для переменной среды FPCDIR базовый каталог установки FPC, например:
256+```
257+export FPCDIR=~/src/lib/fpc/2.6.4
258+```
259+
260+или
261+```
262+set FPCDIR=C:\lazarus\fpc\2.6.4\
263+```
264+
265+Это также может быть полезно, если вам необходимо устранить неоднозначность в нескольких установках FPC.
266+
267+---
268+*From the Free Pascal wiki, page "FPMake/ru", as the Internet Archive kept it on 2025-01-17. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history