From 6d7723a48093eb49b17fd1e5eb3653b9c20461b7 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Fri, 15 Mar 2019 19:42:17 -0300 Subject: deps: improve performance of external dependency checks This is especially important now that the Lua library paths are detected using the dependency check machinery. --- src/luarocks/deps.lua | 49 +++++++++++++++++++++++++++++++++---------------- 1 file 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) return dirs end -local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, err_files) - local fs = require("luarocks.fs") - local prefix = vars[name.."_DIR"] - if not prefix then - prefix = extdir - end - if type(prefix) == "table" then +local function resolve_prefix(prefix, dirs) + if type(prefix) == "string" then + return prefix + elseif type(prefix) == "table" then if prefix.bin then dirs.BINDIR.subdir = prefix.bin end @@ -284,8 +281,14 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, if prefix.lib then dirs.LIBDIR.subdir = prefix.lib end - prefix = prefix.prefix + return prefix.prefix end +end + +local function check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache) + local fs = require("luarocks.fs") + cache = cache or {} + for dirname, dirdata in util.sortedpairs(dirs) do local paths local path_var_value = vars[name.."_"..dirname] @@ -331,7 +334,10 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, for _, d in ipairs(paths) do if pattern then - for entry in fs.dir(d) do + if not cache[d] then + cache[d] = fs.list_dir(d) + end + for _, entry in ipairs(cache[d]) do if entry:match(pattern) then found = true break @@ -366,19 +372,29 @@ local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, return true end -local function check_external_dependency(name, ext_files, vars, mode) - local err_files = {program = {}, header = {}, library = {}} +local function check_external_dependency(name, ext_files, vars, mode, cache) + local ok local err_dirname local err_testfile - for _, extdir in ipairs(cfg.external_deps_dirs) do - local dirs = get_external_deps_dirs(mode) + local err_files = {program = {}, header = {}, library = {}} + + local dirs = get_external_deps_dirs(mode) + + local prefixes + if vars[name .. "_DIR"] then + prefixes = { vars[name .. "_DIR"] } + else + prefixes = cfg.external_deps_dirs + end + + for _, prefix in ipairs(prefixes) do + prefix = resolve_prefix(prefix, dirs) if cfg.is_platform("mingw32") and name == "LUA" then dirs.LIBDIR.pattern = fun.filter(util.deep_copy(dirs.LIBDIR.pattern), function(s) return not s:match("%.a$") end) end - local ok - ok, err_dirname, err_testfile = check_external_dependency_at(extdir, name, ext_files, vars, dirs, err_files) + ok, err_dirname, err_testfile = check_external_dependency_at(prefix, name, ext_files, vars, dirs, err_files, cache) if ok then return true end @@ -517,8 +533,9 @@ function deps.check_lua(vars) if cfg.luajit_version then table.insert(libnames, 1, "luajit-" .. cfg.lua_version) end + local cache = {} for _, libname in ipairs(libnames) do - local ok = check_external_dependency("LUA", { library = libname }, vars, "build") + local ok = check_external_dependency("LUA", { library = libname }, vars, "build", cache) if ok then vars.LUALIB = vars.LUA_LIBDIR_FILE return true -- cgit v1.2.3-55-g6feb