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