From e145314e263e9daeb99e0586505a81902e5e483b Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Wed, 11 Apr 2018 14:48:26 -0300 Subject: Add support for build-only dependencies Adds the `build_dependencies` key to the rockspec format, for dependencies that are only triggered when building from source (e.g. via `luarocks build` or running `luarocks install` on a rockspec) and not when building from a packaged `.rock` file using `luarocks install`. --- src/luarocks/build.lua | 25 ++++++++++++++++--------- src/luarocks/cmd/build.lua | 1 - src/luarocks/cmd/install.lua | 5 ++--- src/luarocks/deps.lua | 7 ++++--- src/luarocks/fetch.lua | 33 ++++++++++++++++++--------------- src/luarocks/type/rockspec.lua | 9 +++++++++ 6 files changed, 49 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index c08fa6c6..c9e36d89 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua @@ -173,18 +173,25 @@ function build.build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_m return nil, "Rockspec error: build type not specified" end - local ok - if not build_only_deps then - ok, err, errcode = deps.check_external_deps(rockspec, "build") - if err then - return nil, err, errcode - end - end - if deps_mode == "none" then util.warning("skipping dependency checks.") else - local ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode) + + if not build_only_deps then + local ok, err, errcode = deps.check_external_deps(rockspec, "build") + if err then + return nil, err, errcode + end + + if next(rockspec.build_dependencies) then + local ok, err, errcode = deps.fulfill_dependencies(rockspec, "build_dependencies", deps_mode) + if err then + return nil, err, errcode + end + end + end + + local ok, err, errcode = deps.fulfill_dependencies(rockspec, "dependencies", deps_mode) if err then return nil, err, errcode end diff --git a/src/luarocks/cmd/build.lua b/src/luarocks/cmd/build.lua index 1b5c8fdc..0a408fb4 100644 --- a/src/luarocks/cmd/build.lua +++ b/src/luarocks/cmd/build.lua @@ -8,7 +8,6 @@ local path = require("luarocks.path") local util = require("luarocks.util") local fetch = require("luarocks.fetch") local fs = require("luarocks.fs") -local dir = require("luarocks.dir") local deps = require("luarocks.deps") local remove = require("luarocks.remove") local cfg = require("luarocks.core.cfg") diff --git a/src/luarocks/cmd/install.lua b/src/luarocks/cmd/install.lua index 80fc4d27..c1d9ccc7 100644 --- a/src/luarocks/cmd/install.lua +++ b/src/luarocks/cmd/install.lua @@ -12,7 +12,6 @@ local writer = require("luarocks.manif.writer") local remove = require("luarocks.remove") local search = require("luarocks.search") local queries = require("luarocks.queries") -local vers = require("luarocks.core.vers") local cfg = require("luarocks.core.cfg") install.help_summary = "Install a rock." @@ -89,7 +88,7 @@ function install.install_binary_rock(rock_file, deps_mode, namespace) end if deps_mode ~= "none" then - ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode) + ok, err, errcode = deps.fulfill_dependencies(rockspec, "dependencies", deps_mode) if err then return nil, err, errcode end end @@ -137,7 +136,7 @@ function install.install_binary_rock_deps(rock_file, deps_mode) return nil, "Failed loading rockspec for installed package: "..err, errcode end - ok, err, errcode = deps.fulfill_dependencies(rockspec, deps_mode) + ok, err, errcode = deps.fulfill_dependencies(rockspec, "dependencies", deps_mode) if err then return nil, err, errcode end util.printout() diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua index ccbced0c..ae15cd5e 100644 --- a/src/luarocks/deps.lua +++ b/src/luarocks/deps.lua @@ -124,10 +124,11 @@ end -- Packages are installed using the LuaRocks "install" command. -- Aborts the program if a dependency could not be fulfilled. -- @param rockspec table: A rockspec in table format. +-- @param depskey table: Rockspec key to fetch to get dependency table. -- @return boolean or (nil, string, [string]): True if no errors occurred, or -- nil and an error message if any test failed, followed by an optional -- error code. -function deps.fulfill_dependencies(rockspec, deps_mode) +function deps.fulfill_dependencies(rockspec, depskey, deps_mode) local search = require("luarocks.search") local install = require("luarocks.cmd.install") @@ -160,11 +161,11 @@ function deps.fulfill_dependencies(rockspec, deps_mode) end end - deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec.dependencies, deps_mode, rockspec.rocks_provided) + deps.report_missing_dependencies(rockspec.name, rockspec.version, rockspec[depskey], deps_mode, rockspec.rocks_provided) local first_missing_dep = true - for _, dep in ipairs(rockspec.dependencies) do + for _, dep in ipairs(rockspec[depskey]) do if not match_dep(dep, nil, deps_mode, rockspec.rocks_provided) then if first_missing_dep then util.printout() diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua index db99c3d5..ce9aaff5 100644 --- a/src/luarocks/fetch.lua +++ b/src/luarocks/fetch.lua @@ -180,6 +180,20 @@ function fetch.url_to_base_dir(url) return (base:gsub("%.([^.]*)$", known_exts):gsub("%.tar", "")) end +local function convert_dependencies(rockspec, key) + if rockspec[key] then + for i = 1, #rockspec[key] do + local parsed, err = queries.from_dep_string(rockspec[key][i]) + if not parsed then + return nil, "Parse error processing dependency '"..rockspec[key][i].."': "..tostring(err) + end + rockspec[key][i] = parsed + end + else + rockspec[key] = {} + end +end + --- Back-end function that actually loads the local rockspec. -- Performs some validation and postprocessing of the rockspec contents. -- @param filename string: The local filename of the rockspec file. @@ -212,10 +226,6 @@ function fetch.load_local_rockspec(filename, quick) end end - rockspec.format_is_at_least = function(_, v) - return parsed_format >= vers.parse_version(v) - end - --- Check if rockspec format version satisfies version requirement. -- @param rockspec table: The rockspec table. -- @param version string: required version. @@ -229,6 +239,7 @@ function fetch.load_local_rockspec(filename, quick) util.platform_overrides(rockspec.build) util.platform_overrides(rockspec.dependencies) + util.platform_overrides(rockspec.build_dependencies) util.platform_overrides(rockspec.external_dependencies) util.platform_overrides(rockspec.source) util.platform_overrides(rockspec.hooks) @@ -274,17 +285,9 @@ function fetch.load_local_rockspec(filename, quick) and cfg.rocks_provided_3_0 or cfg.rocks_provided) - if rockspec.dependencies then - for i = 1, #rockspec.dependencies do - local parsed, err = queries.from_dep_string(rockspec.dependencies[i]) - if not parsed then - return nil, "Parse error processing dependency '"..rockspec.dependencies[i].."': "..tostring(err) - end - rockspec.dependencies[i] = parsed - end - else - rockspec.dependencies = {} - end + convert_dependencies(rockspec, "dependencies") + convert_dependencies(rockspec, "build_dependencies") + if not quick then path.configure_paths(rockspec) end diff --git a/src/luarocks/type/rockspec.lua b/src/luarocks/type/rockspec.lua index 214f8e0f..54ce9db8 100644 --- a/src/luarocks/type/rockspec.lua +++ b/src/luarocks/type/rockspec.lua @@ -48,6 +48,15 @@ local rockspec_types = { }, }, }, + build_dependencies = { + _version = "3.0", + platforms = {}, -- recursively defined below + _any = { + _type = "string", + _name = "a valid dependency string", + _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + }, + }, supported_platforms = { _any = string_1, }, -- cgit v1.2.3-55-g6feb