diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2019-03-15 19:42:17 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2019-03-15 19:43:22 -0300 |
commit | 6d7723a48093eb49b17fd1e5eb3653b9c20461b7 (patch) | |
tree | aea6607b28333c772f272f6a62545a04f69f8fbd /src | |
parent | b7ad1123af254a5b1fffab4251effa96db58c408 (diff) | |
download | luarocks-6d7723a48093eb49b17fd1e5eb3653b9c20461b7.tar.gz luarocks-6d7723a48093eb49b17fd1e5eb3653b9c20461b7.tar.bz2 luarocks-6d7723a48093eb49b17fd1e5eb3653b9c20461b7.zip |
deps: improve performance of external dependency checks
This is especially important now that the Lua library paths
are detected using the dependency check machinery.
Diffstat (limited to 'src')
-rw-r--r-- | src/luarocks/deps.lua | 49 |
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 |
267 | end | 267 | end |
268 | 268 | ||
269 | local function check_external_dependency_at(extdir, name, ext_files, vars, dirs, err_files) | 269 | local 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 |
286 | end | ||
287 | |||
288 | local 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 |
367 | end | 373 | end |
368 | 374 | ||
369 | local function check_external_dependency(name, ext_files, vars, mode) | 375 | local 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 |