diff options
author | V1K1NGbg <victor@ilchev.com> | 2024-08-22 17:48:58 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2024-10-21 13:30:51 -0300 |
commit | 7aaed945f73fc1bd5da8c5c7510a637f38aae71a (patch) | |
tree | c6a38771f2058b9aeae4aac001a70ef48980cd40 | |
parent | e184a7a138ce887fffd96b27c8d9d445c11f9483 (diff) | |
download | luarocks-7aaed945f73fc1bd5da8c5c7510a637f38aae71a.tar.gz luarocks-7aaed945f73fc1bd5da8c5c7510a637f38aae71a.tar.bz2 luarocks-7aaed945f73fc1bd5da8c5c7510a637f38aae71a.zip |
Teal: convert luarocks.build
-rw-r--r-- | src/luarocks/build.tl (renamed from src/luarocks/build.lua) | 147 |
1 files changed, 66 insertions, 81 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.tl index 56e5ebd4..7fbe021f 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.tl | |||
@@ -1,5 +1,10 @@ | |||
1 | 1 | ||
2 | local build = {} | 2 | local record build |
3 | record Builder | ||
4 | skip_lua_inc_lib_check: boolean | ||
5 | run: function(Rockspec, boolean): boolean, string, string | ||
6 | end | ||
7 | end | ||
3 | 8 | ||
4 | local path = require("luarocks.path") | 9 | local path = require("luarocks.path") |
5 | local util = require("luarocks.util") | 10 | local util = require("luarocks.util") |
@@ -11,28 +16,26 @@ local deps = require("luarocks.deps") | |||
11 | local cfg = require("luarocks.core.cfg") | 16 | local cfg = require("luarocks.core.cfg") |
12 | local vers = require("luarocks.core.vers") | 17 | local vers = require("luarocks.core.vers") |
13 | local repos = require("luarocks.repos") | 18 | local repos = require("luarocks.repos") |
14 | local writer = require("luarocks.manif.writer") | 19 | local repo_writer = require("luarocks.repo_writer") |
15 | local deplocks = require("luarocks.deplocks") | 20 | local deplocks = require("luarocks.deplocks") |
16 | 21 | ||
17 | build.opts = util.opts_table("build.opts", { | 22 | local type Rockspec = require("luarocks.core.types.rockspec").Rockspec |
18 | need_to_fetch = "boolean", | 23 | |
19 | minimal_mode = "boolean", | 24 | local type InstallDirs = require("luarocks.core.types.installs").InstallDirs |
20 | deps_mode = "string", | 25 | local type InstallDir = require("luarocks.core.types.installs").InstallDir |
21 | build_only_deps = "boolean", | 26 | |
22 | namespace = "string?", | 27 | local type Tree = require("luarocks.core.types.tree").Tree |
23 | branch = "string?", | 28 | |
24 | verify = "boolean", | 29 | local type BOpts = require("luarocks.core.types.bopts").BOpts |
25 | check_lua_versions = "boolean", | 30 | |
26 | pin = "boolean", | 31 | |
27 | rebuild = "boolean", | 32 | local type Builder = build.Builder |
28 | no_install = "boolean" | ||
29 | }) | ||
30 | 33 | ||
31 | do | 34 | do |
32 | --- Write to the current directory the contents of a table, | 35 | --- Write to the current directory the contents of a table, |
33 | -- where each key is a file name and its value is the file content. | 36 | -- where each key is a file name and its value is the file content. |
34 | -- @param files table: The table of files to be written. | 37 | -- @param files table: The table of files to be written. |
35 | local function extract_from_rockspec(files) | 38 | local function extract_from_rockspec(files: {string: string}) |
36 | for name, content in pairs(files) do | 39 | for name, content in pairs(files) do |
37 | local fd = io.open(dir.path(fs.current_dir(), name), "w+") | 40 | local fd = io.open(dir.path(fs.current_dir(), name), "w+") |
38 | fd:write(content) | 41 | fd:write(content) |
@@ -46,8 +49,7 @@ do | |||
46 | -- @param rockspec table: A rockspec table. | 49 | -- @param rockspec table: A rockspec table. |
47 | -- @return boolean or (nil, string): True if succeeded or | 50 | -- @return boolean or (nil, string): True if succeeded or |
48 | -- nil and an error message. | 51 | -- nil and an error message. |
49 | function build.apply_patches(rockspec) | 52 | function build.apply_patches(rockspec: Rockspec): boolean, string |
50 | assert(rockspec:type() == "rockspec") | ||
51 | 53 | ||
52 | if not (rockspec.build.extra_files or rockspec.build.patches) then | 54 | if not (rockspec.build.extra_files or rockspec.build.patches) then |
53 | return true | 55 | return true |
@@ -82,13 +84,14 @@ do | |||
82 | end | 84 | end |
83 | end | 85 | end |
84 | 86 | ||
85 | local function check_macosx_deployment_target(rockspec) | 87 | local function check_macosx_deployment_target(rockspec: Rockspec): boolean, string |
86 | local target = rockspec.build.macosx_deployment_target | 88 | local target = rockspec.build.macosx_deployment_target |
87 | local function patch_variable(var) | 89 | local function patch_variable(var: string) |
88 | if rockspec.variables[var]:match("MACOSX_DEPLOYMENT_TARGET") then | 90 | local rockspec_variables = rockspec.variables |
89 | rockspec.variables[var] = (rockspec.variables[var]):gsub("MACOSX_DEPLOYMENT_TARGET=[^ ]*", "MACOSX_DEPLOYMENT_TARGET="..target) | 91 | if rockspec_variables[var]:match("MACOSX_DEPLOYMENT_TARGET") then |
92 | rockspec_variables[var] = (rockspec_variables[var]):gsub("MACOSX_DEPLOYMENT_TARGET=[^ ]*", "MACOSX_DEPLOYMENT_TARGET="..target) | ||
90 | else | 93 | else |
91 | rockspec.variables[var] = "env MACOSX_DEPLOYMENT_TARGET="..target.." "..rockspec.variables[var] | 94 | rockspec_variables[var] = "env MACOSX_DEPLOYMENT_TARGET="..target.." "..rockspec_variables[var] |
92 | end | 95 | end |
93 | end | 96 | end |
94 | if cfg.is_platform("macosx") and rockspec:format_is_at_least("3.0") and target then | 97 | if cfg.is_platform("macosx") and rockspec:format_is_at_least("3.0") and target then |
@@ -104,7 +107,7 @@ local function check_macosx_deployment_target(rockspec) | |||
104 | return true | 107 | return true |
105 | end | 108 | end |
106 | 109 | ||
107 | local function process_dependencies(rockspec, opts, cwd) | 110 | local function process_dependencies(rockspec: Rockspec, opts: BOpts, cwd: string): boolean, string, string |
108 | if not opts.build_only_deps then | 111 | if not opts.build_only_deps then |
109 | local ok, err, errcode = deps.check_external_deps(rockspec, "build") | 112 | local ok, err, errcode = deps.check_external_deps(rockspec, "build") |
110 | if err then | 113 | if err then |
@@ -135,7 +138,7 @@ local function process_dependencies(rockspec, opts, cwd) | |||
135 | cfg.lua_modules_path = cfg.lua_modules_path:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) | 138 | cfg.lua_modules_path = cfg.lua_modules_path:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) |
136 | cfg.lib_modules_path = cfg.lib_modules_path:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) | 139 | cfg.lib_modules_path = cfg.lib_modules_path:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) |
137 | cfg.rocks_subdir = cfg.rocks_subdir:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) | 140 | cfg.rocks_subdir = cfg.rocks_subdir:gsub(user_lua_version:gsub("%.", "%%."), running_lua_version) |
138 | path.use_tree(cfg.root_dir) | 141 | path.use_tree(cfg.root_dir as Tree) |
139 | end | 142 | end |
140 | 143 | ||
141 | local ok, err, errcode = deps.fulfill_dependencies(rockspec, "build_dependencies", "all", opts.verify, deplock_dir) | 144 | local ok, err, errcode = deps.fulfill_dependencies(rockspec, "build_dependencies", "all", opts.verify, deplock_dir) |
@@ -148,7 +151,7 @@ local function process_dependencies(rockspec, opts, cwd) | |||
148 | cfg.lua_modules_path = cfg.lua_modules_path:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) | 151 | cfg.lua_modules_path = cfg.lua_modules_path:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) |
149 | cfg.lib_modules_path = cfg.lib_modules_path:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) | 152 | cfg.lib_modules_path = cfg.lib_modules_path:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) |
150 | cfg.rocks_subdir = cfg.rocks_subdir:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) | 153 | cfg.rocks_subdir = cfg.rocks_subdir:gsub(running_lua_version:gsub("%.", "%%."), user_lua_version) |
151 | path.use_tree(cfg.root_dir) | 154 | path.use_tree(cfg.root_dir as Tree) |
152 | end | 155 | end |
153 | 156 | ||
154 | if err then | 157 | if err then |
@@ -160,7 +163,7 @@ local function process_dependencies(rockspec, opts, cwd) | |||
160 | return deps.fulfill_dependencies(rockspec, "dependencies", opts.deps_mode, opts.verify, deplock_dir) | 163 | return deps.fulfill_dependencies(rockspec, "dependencies", opts.deps_mode, opts.verify, deplock_dir) |
161 | end | 164 | end |
162 | 165 | ||
163 | local function fetch_and_change_to_source_dir(rockspec, opts) | 166 | local function fetch_and_change_to_source_dir(rockspec: Rockspec, opts: BOpts): boolean, string, string |
164 | if opts.minimal_mode or opts.build_only_deps then | 167 | if opts.minimal_mode or opts.build_only_deps then |
165 | return true | 168 | return true |
166 | end | 169 | end |
@@ -168,11 +171,11 @@ local function fetch_and_change_to_source_dir(rockspec, opts) | |||
168 | if opts.branch then | 171 | if opts.branch then |
169 | rockspec.source.branch = opts.branch | 172 | rockspec.source.branch = opts.branch |
170 | end | 173 | end |
171 | local ok, source_dir, errcode = fetch.fetch_sources(rockspec, true) | 174 | local oks, source_dir, errcode = fetch.fetch_sources(rockspec, true) |
172 | if not ok then | 175 | if not oks then |
173 | return nil, source_dir, errcode | 176 | return nil, source_dir, errcode |
174 | end | 177 | end |
175 | local err | 178 | local ok, err: boolean, string |
176 | ok, err = fs.change_dir(source_dir) | 179 | ok, err = fs.change_dir(source_dir) |
177 | if not ok then | 180 | if not ok then |
178 | return nil, err | 181 | return nil, err |
@@ -193,15 +196,15 @@ local function fetch_and_change_to_source_dir(rockspec, opts) | |||
193 | return true | 196 | return true |
194 | end | 197 | end |
195 | 198 | ||
196 | local function prepare_install_dirs(name, version) | 199 | local function prepare_install_dirs(name: string, version: string): InstallDirs, string |
197 | local dirs = { | 200 | local dirs: InstallDirs = { |
198 | lua = { name = path.lua_dir(name, version), is_module_path = true, perms = "read" }, | 201 | lua = { name = path.lua_dir(name, version), is_module_path = true, perms = "read" }, |
199 | lib = { name = path.lib_dir(name, version), is_module_path = true, perms = "exec" }, | 202 | lib = { name = path.lib_dir(name, version), is_module_path = true, perms = "exec" }, |
200 | bin = { name = path.bin_dir(name, version), is_module_path = false, perms = "exec" }, | 203 | bin = { name = path.bin_dir(name, version), is_module_path = false, perms = "exec" }, |
201 | conf = { name = path.conf_dir(name, version), is_module_path = false, perms = "read" }, | 204 | conf = { name = path.conf_dir(name, version), is_module_path = false, perms = "read" }, |
202 | } | 205 | } |
203 | 206 | ||
204 | for _, d in pairs(dirs) do | 207 | for _, d in pairs(dirs as {string: InstallDir}) do |
205 | local ok, err = fs.make_dir(d.name) | 208 | local ok, err = fs.make_dir(d.name) |
206 | if not ok then | 209 | if not ok then |
207 | return nil, err | 210 | return nil, err |
@@ -211,7 +214,7 @@ local function prepare_install_dirs(name, version) | |||
211 | return dirs | 214 | return dirs |
212 | end | 215 | end |
213 | 216 | ||
214 | local function run_build_driver(rockspec, no_install) | 217 | local function run_build_driver(rockspec: Rockspec, no_install: boolean): boolean, string, string |
215 | local btype = rockspec.build.type | 218 | local btype = rockspec.build.type |
216 | if btype == "none" then | 219 | if btype == "none" then |
217 | return true | 220 | return true |
@@ -222,12 +225,15 @@ local function run_build_driver(rockspec, no_install) | |||
222 | btype = "builtin" | 225 | btype = "builtin" |
223 | rockspec.build.type = btype | 226 | rockspec.build.type = btype |
224 | end | 227 | end |
228 | local driver: Builder | ||
225 | if cfg.accepted_build_types and not fun.contains(cfg.accepted_build_types, btype) then | 229 | if cfg.accepted_build_types and not fun.contains(cfg.accepted_build_types, btype) then |
226 | return nil, "This rockspec uses the '"..btype.."' build type, which is blocked by the 'accepted_build_types' setting in your LuaRocks configuration." | 230 | return nil, "This rockspec uses the '"..btype.."' build type, which is blocked by the 'accepted_build_types' setting in your LuaRocks configuration." |
227 | end | 231 | end |
228 | local pok, driver = pcall(require, "luarocks.build." .. btype) | 232 | local pok, driver_str = pcall(require, "luarocks.build." .. btype) as (boolean, Builder | string) |
229 | if not pok or type(driver) ~= "table" then | 233 | if not driver_str is Builder then |
230 | return nil, "Failed initializing build back-end for build type '"..btype.."': "..driver | 234 | return nil, "Failed initializing build back-end for build type '"..btype.."': "..driver_str |
235 | else | ||
236 | driver = driver_str as Builder | ||
231 | end | 237 | end |
232 | 238 | ||
233 | if not driver.skip_lua_inc_lib_check then | 239 | if not driver.skip_lua_inc_lib_check then |
@@ -237,7 +243,7 @@ local function run_build_driver(rockspec, no_install) | |||
237 | end | 243 | end |
238 | 244 | ||
239 | if cfg.link_lua_explicitly then | 245 | if cfg.link_lua_explicitly then |
240 | local ok, err, errcode = deps.check_lua_libdir(rockspec.variables) | 246 | ok, err, errcode = deps.check_lua_libdir(rockspec.variables) |
241 | if not ok then | 247 | if not ok then |
242 | return nil, err, errcode | 248 | return nil, err, errcode |
243 | end | 249 | end |
@@ -251,7 +257,7 @@ local function run_build_driver(rockspec, no_install) | |||
251 | return true | 257 | return true |
252 | end | 258 | end |
253 | 259 | ||
254 | local install_files | 260 | local install_files: function(Rockspec, InstallDirs): boolean, string |
255 | do | 261 | do |
256 | --- Install files to a given location. | 262 | --- Install files to a given location. |
257 | -- Takes a table where the array part is a list of filenames to be copied. | 263 | -- Takes a table where the array part is a list of filenames to be copied. |
@@ -270,16 +276,14 @@ do | |||
270 | -- Directories are always created with the default permissions. | 276 | -- Directories are always created with the default permissions. |
271 | -- @return boolean or (nil, string): True if succeeded or | 277 | -- @return boolean or (nil, string): True if succeeded or |
272 | -- nil and an error message. | 278 | -- nil and an error message. |
273 | local function install_to(files, location, is_module_path, perms) | 279 | local function install_to(files: {string: string}, location: string, is_module_path: boolean, perms: string): boolean, string |
274 | assert(type(files) == "table" or not files) | ||
275 | assert(type(location) == "string") | ||
276 | if not files then | 280 | if not files then |
277 | return true | 281 | return true |
278 | end | 282 | end |
279 | for k, file in pairs(files) do | 283 | for k, file in pairs(files) do |
280 | local dest = location | 284 | local dest = location |
281 | local filename = dir.base_name(file) | 285 | local filename = dir.base_name(file) |
282 | if type(k) == "string" then | 286 | if k is string then |
283 | local modname = k | 287 | local modname = k |
284 | if is_module_path then | 288 | if is_module_path then |
285 | dest = dir.path(location, path.module_to_path(modname)) | 289 | dest = dir.path(location, path.module_to_path(modname)) |
@@ -307,7 +311,7 @@ do | |||
307 | return true | 311 | return true |
308 | end | 312 | end |
309 | 313 | ||
310 | local function install_default_docs(name, version) | 314 | local function install_default_docs(name: string, version: string) |
311 | local patterns = { "readme", "license", "copying", ".*%.md" } | 315 | local patterns = { "readme", "license", "copying", ".*%.md" } |
312 | local dest = dir.path(path.install_dir(name, version), "doc") | 316 | local dest = dir.path(path.install_dir(name, version), "doc") |
313 | local has_dir = false | 317 | local has_dir = false |
@@ -325,12 +329,12 @@ do | |||
325 | end | 329 | end |
326 | end | 330 | end |
327 | 331 | ||
328 | install_files = function(rockspec, dirs) | 332 | install_files = function(rockspec: Rockspec, dirs: InstallDirs): boolean, string |
329 | local name, version = rockspec.name, rockspec.version | 333 | local name, version = rockspec.name, rockspec.version |
330 | 334 | ||
331 | if rockspec.build.install then | 335 | if rockspec.build.install then |
332 | for k, d in pairs(dirs) do | 336 | for k, d in pairs(dirs as {string: InstallDir}) do |
333 | local ok, err = install_to(rockspec.build.install[k], d.name, d.is_module_path, d.perms) | 337 | local ok, err = install_to((rockspec.build.install as {string: {string: string}})[k], d.name, d.is_module_path, d.perms) |
334 | if not ok then return nil, err end | 338 | if not ok then return nil, err end |
335 | end | 339 | end |
336 | end | 340 | end |
@@ -343,7 +347,7 @@ do | |||
343 | end | 347 | end |
344 | 348 | ||
345 | local any_docs = false | 349 | local any_docs = false |
346 | for _, copy_dir in pairs(copy_directories) do | 350 | for _, copy_dir in ipairs(copy_directories) do |
347 | if fs.is_dir(copy_dir) then | 351 | if fs.is_dir(copy_dir) then |
348 | local dest = dir.path(path.install_dir(name, version), copy_dir) | 352 | local dest = dir.path(path.install_dir(name, version), copy_dir) |
349 | fs.make_dir(dest) | 353 | fs.make_dir(dest) |
@@ -363,35 +367,12 @@ do | |||
363 | end | 367 | end |
364 | end | 368 | end |
365 | 369 | ||
366 | local function write_rock_dir_files(rockspec, opts) | ||
367 | local name, version = rockspec.name, rockspec.version | ||
368 | |||
369 | fs.copy(rockspec.local_abs_filename, path.rockspec_file(name, version), "read") | ||
370 | |||
371 | local deplock_file = deplocks.get_abs_filename(rockspec.name) | ||
372 | if deplock_file then | ||
373 | fs.copy(deplock_file, dir.path(path.install_dir(name, version), "luarocks.lock"), "read") | ||
374 | end | ||
375 | |||
376 | local ok, err = writer.make_rock_manifest(name, version) | ||
377 | if not ok then return nil, err end | ||
378 | |||
379 | ok, err = writer.make_namespace_file(name, version, opts.namespace) | ||
380 | if not ok then return nil, err end | ||
381 | |||
382 | return true | ||
383 | end | ||
384 | |||
385 | --- Build and install a rock given a rockspec. | 370 | --- Build and install a rock given a rockspec. |
386 | -- @param rockspec rockspec: the rockspec to build | 371 | -- @param rockspec rockspec: the rockspec to build |
387 | -- @param opts table: build options table | 372 | -- @param opts table: build options table |
388 | -- @param cwd string or nil: The current working directory | 373 | -- @param cwd string or nil: The current working directory |
389 | -- @return (string, string) or (nil, string, [string]): Name and version of | 374 | -- @return: Name and version of installed rock if succeeded or nil and an error message. |
390 | -- installed rock if succeeded or nil and an error message followed by an error code. | 375 | function build.build_rockspec(rockspec: Rockspec, opts: BOpts, cwd: string): string, string |
391 | function build.build_rockspec(rockspec, opts, cwd) | ||
392 | assert(rockspec:type() == "rockspec") | ||
393 | assert(opts:type() == "build.opts") | ||
394 | assert(type(cwd) == "string" or type(cwd) == nil) | ||
395 | 376 | ||
396 | cwd = cwd or dir.path(".") | 377 | cwd = cwd or dir.path(".") |
397 | 378 | ||
@@ -431,11 +412,11 @@ function build.build_rockspec(rockspec, opts, cwd) | |||
431 | return name, version | 412 | return name, version |
432 | end | 413 | end |
433 | 414 | ||
434 | local dirs, err | 415 | local dirs, err: InstallDirs, string |
435 | local rollback | 416 | local rollback: util.Fn |
436 | if not opts.no_install then | 417 | if not opts.no_install then |
437 | if repos.is_installed(name, version) then | 418 | if repos.is_installed(name, version) then |
438 | repos.delete_version(name, version, opts.deps_mode) | 419 | repo_writer.delete_version(name, version, opts.deps_mode) |
439 | end | 420 | end |
440 | 421 | ||
441 | dirs, err = prepare_install_dirs(name, version) | 422 | dirs, err = prepare_install_dirs(name, version) |
@@ -467,7 +448,7 @@ function build.build_rockspec(rockspec, opts, cwd) | |||
467 | ok, err = install_files(rockspec, dirs) | 448 | ok, err = install_files(rockspec, dirs) |
468 | if not ok then return nil, err end | 449 | if not ok then return nil, err end |
469 | 450 | ||
470 | for _, d in pairs(dirs) do | 451 | for _, d in pairs(dirs as {string: InstallDir}) do |
471 | fs.remove_dir_if_empty(d.name) | 452 | fs.remove_dir_if_empty(d.name) |
472 | end | 453 | end |
473 | 454 | ||
@@ -480,15 +461,19 @@ function build.build_rockspec(rockspec, opts, cwd) | |||
480 | deplocks.write_file() | 461 | deplocks.write_file() |
481 | end | 462 | end |
482 | 463 | ||
483 | ok, err = write_rock_dir_files(rockspec, opts) | 464 | fs.copy(rockspec.local_abs_filename, path.rockspec_file(name, version), "read") |
484 | if not ok then return nil, err end | 465 | |
466 | local deplock_file = deplocks.get_abs_filename(name) | ||
467 | if deplock_file then | ||
468 | fs.copy(deplock_file, dir.path(path.install_dir(name, version), "luarocks.lock"), "read") | ||
469 | end | ||
485 | 470 | ||
486 | ok, err = repos.deploy_files(name, version, repos.should_wrap_bin_scripts(rockspec), opts.deps_mode) | 471 | ok, err = repo_writer.deploy_files(name, version, repos.should_wrap_bin_scripts(rockspec), opts.deps_mode, opts.namespace) |
487 | if not ok then return nil, err end | 472 | if not ok then return nil, err end |
488 | 473 | ||
489 | util.remove_scheduled_function(rollback) | 474 | util.remove_scheduled_function(rollback) |
490 | rollback = util.schedule_function(function() | 475 | rollback = util.schedule_function(function() |
491 | repos.delete_version(name, version, opts.deps_mode) | 476 | repo_writer.delete_version(name, version, opts.deps_mode) |
492 | end) | 477 | end) |
493 | 478 | ||
494 | ok, err = repos.run_hook(rockspec, "post_install") | 479 | ok, err = repos.run_hook(rockspec, "post_install") |