aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/luarocks/deps.lua49
1 files changed, 33 insertions, 16 deletions
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua
index b7d2b236..d9a88c2b 100644
--- a/src/luarocks/deps.lua
+++ b/src/luarocks/deps.lua
@@ -266,13 +266,10 @@ local function get_external_deps_dirs(mode)
266 return dirs 266 return dirs
267end 267end
268 268
269local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, err_files) 269local function resolve_prefix(prefix, dirs)
270 local fs = require("luarocks.fs") 270 if type(prefix) == "string" then
271 local prefix = vars[name.."_DIR"] 271 return prefix
272 if not prefix then 272 elseif type(prefix) == "table" then
273 prefix = extdir
274 end
275 if type(prefix) == "table" then
276 if prefix.bin then 273 if prefix.bin then
277 dirs.BINDIR.subdir = prefix.bin 274 dirs.BINDIR.subdir = prefix.bin
278 end 275 end
@@ -284,8 +281,14 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs,
284 if prefix.lib then 281 if prefix.lib then
285 dirs.LIBDIR.subdir = prefix.lib 282 dirs.LIBDIR.subdir = prefix.lib
286 end 283 end
287 prefix = prefix.prefix 284 return prefix.prefix
288 end 285 end
286end
287
288local function check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache)
289 local fs = require("luarocks.fs")
290 cache = cache or {}
291
289 for dirname, dirdata in util.sortedpairs(dirs) do 292 for dirname, dirdata in util.sortedpairs(dirs) do
290 local paths 293 local paths
291 local path_var_value = vars[name.."_"..dirname] 294 local path_var_value = vars[name.."_"..dirname]
@@ -331,7 +334,10 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs,
331 334
332 for _, d in ipairs(paths) do 335 for _, d in ipairs(paths) do
333 if pattern then 336 if pattern then
334 for entry in fs.dir(d) do 337 if not cache[d] then
338 cache[d] = fs.list_dir(d)
339 end
340 for _, entry in ipairs(cache[d]) do
335 if entry:match(pattern) then 341 if entry:match(pattern) then
336 found = true 342 found = true
337 break 343 break
@@ -366,19 +372,29 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs,
366 return true 372 return true
367end 373end
368 374
369local function check_external_dependency(name, ext_files, vars, mode) 375local function check_external_dependency(name, ext_files, vars, mode, cache)
370 local err_files = {program = {}, header = {}, library = {}} 376 local ok
371 local err_dirname 377 local err_dirname
372 local err_testfile 378 local err_testfile
373 for _, extdir in ipairs(cfg.external_deps_dirs) do 379 local err_files = {program = {}, header = {}, library = {}}
374 local dirs = get_external_deps_dirs(mode) 380
381 local dirs = get_external_deps_dirs(mode)
382
383 local prefixes
384 if vars[name .. "_DIR"] then
385 prefixes = { vars[name .. "_DIR"] }
386 else
387 prefixes = cfg.external_deps_dirs
388 end
389
390 for _, prefix in ipairs(prefixes) do
391 prefix = resolve_prefix(prefix, dirs)
375 if cfg.is_platform("mingw32") and name == "LUA" then 392 if cfg.is_platform("mingw32") and name == "LUA" then
376 dirs.LIBDIR.pattern = fun.filter(util.deep_copy(dirs.LIBDIR.pattern), function(s) 393 dirs.LIBDIR.pattern = fun.filter(util.deep_copy(dirs.LIBDIR.pattern), function(s)
377 return not s:match("%.a$") 394 return not s:match("%.a$")
378 end) 395 end)
379 end 396 end
380 local ok 397 ok, err_dirname, err_testfile = check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache)
381 ok, err_dirname, err_testfile = check_external_dependency_at(extdir, name, ext_files, vars, dirs, err_files)
382 if ok then 398 if ok then
383 return true 399 return true
384 end 400 end
@@ -517,8 +533,9 @@ function deps.check_lua(vars)
517 if cfg.luajit_version then 533 if cfg.luajit_version then
518 table.insert(libnames, 1, "luajit-" .. cfg.lua_version) 534 table.insert(libnames, 1, "luajit-" .. cfg.lua_version)
519 end 535 end
536 local cache = {}
520 for _, libname in ipairs(libnames) do 537 for _, libname in ipairs(libnames) do
521 local ok = check_external_dependency("LUA", { library = libname }, vars, "build") 538 local ok = check_external_dependency("LUA", { library = libname }, vars, "build", cache)
522 if ok then 539 if ok then
523 vars.LUALIB = vars.LUA_LIBDIR_FILE 540 vars.LUALIB = vars.LUA_LIBDIR_FILE
524 return true 541 return true