From c9185f42835c52956b4cb906d765d5b4e6bb3539 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 11 Jun 2018 18:11:20 -0300 Subject: builtin: if "libraries" is used but "external_dependencies" is not given, autogenerate it The approach is slightly ugly since it adds builtin-specific knowledge to `luarocks.deps`, but I don't think any other build backends will support this behavior any time soon. --- spec/build_spec.lua | 27 +++++++++++++++++++++++++++ src/luarocks/build/builtin.lua | 32 ++++++++++++++++++++++++++++++++ src/luarocks/deps.lua | 4 ++++ 3 files changed, 63 insertions(+) diff --git a/spec/build_spec.lua b/spec/build_spec.lua index af2dfe38..ae559654 100644 --- a/spec/build_spec.lua +++ b/spec/build_spec.lua @@ -311,6 +311,33 @@ describe("LuaRocks build tests #integration", function() assert.truthy(run.luarocks_bool("build " .. rockspec)) assert.match("bla.lua", run.luarocks("show autodetect")) end) + + it("'builtin' synthesizes external_dependencies if not given but a library is given in build", function() + local rockspec = "autodetect-1.0-1.rockspec" + test_env.write_file(rockspec, [[ + rockspec_format = "3.0" + package = "autodetect" + version = "1.0-1" + source = { + url = "file://]] .. testing_paths.fixtures_dir .. [[/c_module.c" + } + description = { + summary = "An example rockspec", + } + dependencies = { + "lua >= 5.1" + } + build = { + modules = { + c_module = { + sources = "c_module.c", + libraries = "inexistent_library", + } + } + } + ]], finally) + assert.match("INEXISTENT_LIBRARY_DIR", run.luarocks("build " .. rockspec)) + end) end) describe("#mock external dependencies", function() diff --git a/src/luarocks/build/builtin.lua b/src/luarocks/build/builtin.lua index 4ff59f8b..f414c166 100644 --- a/src/luarocks/build/builtin.lua +++ b/src/luarocks/build/builtin.lua @@ -10,6 +10,38 @@ local util = require("luarocks.util") local cfg = require("luarocks.core.cfg") local dir = require("luarocks.dir") +function builtin.autodetect_external_dependencies(build) + if not build or not build.modules then + return nil + end + local extdeps = {} + local any = false + for _, data in pairs(build.modules) do + if type(data) == "table" and data.libraries then + local libraries = data.libraries + if type(libraries) == "string" then + libraries = { libraries } + end + local incdirs = {} + local libdirs = {} + for _, lib in ipairs(libraries) do + local upper = lib:upper() + any = true + extdeps[upper] = { library = lib } + table.insert(incdirs, "$(" .. upper .. "_INCDIR)") + table.insert(libdirs, "$(" .. upper .. "_LIBDIR)") + end + if not data.incdirs then + data.incdirs = incdirs + end + if not data.libdirs then + data.libdirs = libdirs + end + end + end + return any and extdeps or nil +end + local function autoextract_libs(external_dependencies, variables) if not external_dependencies then return nil, nil, nil diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua index 3ec1aa93..bcd6ccf5 100644 --- a/src/luarocks/deps.lua +++ b/src/luarocks/deps.lua @@ -9,6 +9,7 @@ local dir = require("luarocks.dir") local util = require("luarocks.util") local vers = require("luarocks.core.vers") local queries = require("luarocks.queries") +local builtin = require("luarocks.build.builtin") --- Attempt to match a dependency to an installed rock. -- @param dep table: A dependency parsed in table format. @@ -277,6 +278,9 @@ function deps.check_external_deps(rockspec, mode) patterns = cfg.runtime_external_deps_patterns subdirs = cfg.runtime_external_deps_subdirs end + if not rockspec.external_dependencies then + rockspec.external_dependencies = builtin.autodetect_external_dependencies(rockspec.build) + end if rockspec.external_dependencies then for name, ext_files in util.sortedpairs(rockspec.external_dependencies) do local ok = true -- cgit v1.2.3-55-g6feb