FPMake/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: FPMake/ru
| Old | New | Line | |
|---|---|---|---|
| 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).* |
