diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2018-06-20 10:28:49 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-07-01 15:51:13 -0300 |
commit | 4c1c170b9d344b6c069c8e6df5798f6e0bd63966 (patch) | |
tree | 21b0061a4c41434239320db45749ec5b4086be4c /src | |
parent | 50cd8ea8941d38678e8e6cf82065108dc3217d91 (diff) | |
download | luarocks-4c1c170b9d344b6c069c8e6df5798f6e0bd63966.tar.gz luarocks-4c1c170b9d344b6c069c8e6df5798f6e0bd63966.tar.bz2 luarocks-4c1c170b9d344b6c069c8e6df5798f6e0bd63966.zip |
cfg, cmd: major reorganization
* `--lua-dir` flag, specifying a prefix for the Lua installation to
be used. This reconfigures LuaRocks entirely, including allowing
a LuaRocks which is itself running using one Lua 5.x version to
manage packages for a different Lua 5.y version. The resulting
configuration can be checked with `luarocks config --lua-dir=<path>`.
* requiring `luarocks.core.cfg` no longer has side-effects
* configuration now needs to be initialized with `cfg.init([lua_data])`,
where `lua_data` is a table with the configuration of the VM:
* `lua_version` - e.g. `"5.3"`
* `luajit_version` - e.g. `"2.1.0-beta3"`
* `lua_interpreter` - e.g. `"lua5.3"`
* `lua_bindir` - e.g. `"/usr/local/bin"`
* `lua_libdir` - e.g. `"/usr/local/lib"`
* `lua_incdir` - e.g. `"/usr/local/include/lua-5.3"`
* `cfg.init` can be called multiple times, reconfiguring the global state.
This is important since `luarocks.loader` now calls it, and the `--lua-dir`
command line can override the configuration and reconfigure LuaRocks.
* `site_config_*` is no more: LuaRocks is no longer dependent on a properly-written
site_config file. Instead, it can *optionally* use `luarocks.core.hardcoded`
for hardcoded values, or detect its configuration at runtime, based on
OS detection, arg[-1] or command-line flags.
* reduction of moving parts in the configuration:
* `cfg.platforms` is no longer a globally-visible table; instead, `cfg`
provides an API of read-only functions: `is_platform`, `each_platform`,
`print_platforms`.
* `cfg.*_proxy` options are no longer configured via the config files,
but rather via the standard `*_proxy` environment variables.
* `"windows"` is now the more general platform name of the Windows family.
This is technically a breaking change but I don't expect it to cause
problems with real-world rockspecs.
* internal code reorganization in `luarocks.cmd` module
Diffstat (limited to 'src')
-rw-r--r-- | src/luarocks/cmd.lua | 427 | ||||
-rw-r--r-- | src/luarocks/cmd/help.lua | 1 | ||||
-rw-r--r-- | src/luarocks/core/cfg.lua | 1288 | ||||
-rw-r--r-- | src/luarocks/deps.lua | 18 | ||||
-rw-r--r-- | src/luarocks/fs/lua.lua | 8 | ||||
-rw-r--r-- | src/luarocks/loader.lua | 5 | ||||
-rw-r--r-- | src/luarocks/util.lua | 1 |
7 files changed, 963 insertions, 785 deletions
diff --git a/src/luarocks/cmd.lua b/src/luarocks/cmd.lua index 51d22154..70d93670 100644 --- a/src/luarocks/cmd.lua +++ b/src/luarocks/cmd.lua | |||
@@ -4,13 +4,13 @@ local cmd = {} | |||
4 | 4 | ||
5 | local unpack = unpack or table.unpack | 5 | local unpack = unpack or table.unpack |
6 | 6 | ||
7 | local util = require("luarocks.util") | ||
8 | local cfg = require("luarocks.core.cfg") | 7 | local cfg = require("luarocks.core.cfg") |
8 | local util = require("luarocks.util") | ||
9 | local path = require("luarocks.path") | 9 | local path = require("luarocks.path") |
10 | local dir = require("luarocks.dir") | ||
11 | local deps = require("luarocks.deps") | 10 | local deps = require("luarocks.deps") |
12 | local fs = require("luarocks.fs") | 11 | local dir = require("luarocks.dir") |
13 | local fun = require("luarocks.fun") | 12 | local fun = require("luarocks.fun") |
13 | local fs = require("luarocks.fs") | ||
14 | 14 | ||
15 | local program = util.this_program("luarocks") | 15 | local program = util.this_program("luarocks") |
16 | 16 | ||
@@ -22,12 +22,6 @@ cmd.errorcodes = { | |||
22 | CRASH = 99 | 22 | CRASH = 99 |
23 | } | 23 | } |
24 | 24 | ||
25 | local function replace_tree(flags, tree) | ||
26 | tree = dir.normalize(tree) | ||
27 | flags["tree"] = tree | ||
28 | path.use_tree(tree) | ||
29 | end | ||
30 | |||
31 | local function is_ownership_ok(directory) | 25 | local function is_ownership_ok(directory) |
32 | local me = fs.current_user() | 26 | local me = fs.current_user() |
33 | for _ = 1,3 do -- try up to grandparent | 27 | for _ = 1,3 do -- try up to grandparent |
@@ -40,16 +34,240 @@ local function is_ownership_ok(directory) | |||
40 | return false | 34 | return false |
41 | end | 35 | end |
42 | 36 | ||
43 | local function find_project_dir() | 37 | do |
44 | local try = "." | 38 | local function check_lua_version(lua_exe, luaver) |
45 | for _ = 1, 10 do -- FIXME detect when root dir was hit instead | 39 | local luajitver |
46 | local abs = fs.absolute_name(try) | 40 | if not (luaver and luaver:match("^[0-9]")) then |
47 | if fs.is_dir(abs .. "/.luarocks") and fs.is_dir(abs .. "/lua_modules") then | 41 | luaver = util.popen_read(lua_exe .. ' -e "io.write(_VERSION:sub(5))"') |
48 | abs = abs:gsub("/.$", "") | 42 | end |
49 | return abs, abs .. "/lua_modules" | 43 | if luaver == "5.1" then |
44 | luajitver = util.popen_read(lua_exe .. ' -e "io.write(tostring(jit and jit.version:sub(8)))"') | ||
45 | if luajitver == "nil" then | ||
46 | luajitver = nil | ||
47 | end | ||
48 | end | ||
49 | return luaver, luajitver | ||
50 | end | ||
51 | |||
52 | local function exists(file) | ||
53 | local fd = io.open(file, "r") | ||
54 | if fd then | ||
55 | fd:close() | ||
56 | return true | ||
57 | end | ||
58 | return false | ||
59 | end | ||
60 | |||
61 | local find_lua_bindir | ||
62 | do | ||
63 | local exe_suffix = (package.config:sub(1, 1) == "\\" and ".exe" or "") | ||
64 | |||
65 | local function insert_lua_versions(names, luaver) | ||
66 | local variants = { | ||
67 | "lua" .. luaver .. exe_suffix, | ||
68 | "lua" .. luaver:gsub("%.", "") .. exe_suffix, | ||
69 | "lua-" .. luaver .. exe_suffix, | ||
70 | "lua-" .. luaver:gsub("%.", "") .. exe_suffix, | ||
71 | } | ||
72 | for _, name in ipairs(variants) do | ||
73 | names[name] = luaver | ||
74 | table.insert(names, name) | ||
75 | end | ||
76 | end | ||
77 | |||
78 | find_lua_bindir = function(prefix, luaver) | ||
79 | local names = {} | ||
80 | if luaver then | ||
81 | insert_lua_versions(names, luaver) | ||
82 | else | ||
83 | for v in util.lua_versions("descending") do | ||
84 | insert_lua_versions(names, v) | ||
85 | end | ||
86 | end | ||
87 | table.insert(names, "lua" .. exe_suffix) | ||
88 | table.insert(names, "luajit" .. exe_suffix) | ||
89 | |||
90 | local bindirs = { prefix .. "/bin", prefix } | ||
91 | local tried = {} | ||
92 | for _, d in ipairs(bindirs) do | ||
93 | for _, name in ipairs(names) do | ||
94 | local lua_exe = dir.path(d, name) | ||
95 | table.insert(tried, lua_exe) | ||
96 | if exists(lua_exe) then | ||
97 | return name, d, luaver | ||
98 | end | ||
99 | end | ||
100 | end | ||
101 | return nil, "Lua interpreter not found at " .. prefix .. "\n" .. | ||
102 | "Tried:\t" .. table.concat(tried, "\n\t") | ||
103 | end | ||
104 | end | ||
105 | |||
106 | local function find_lua_incdir(prefix, luaver, luajitver) | ||
107 | luajitver = luajitver and luajitver:gsub("%-.*", "") | ||
108 | local incdirs = { | ||
109 | prefix .. "/include", | ||
110 | prefix .. "/include/lua/" .. luaver, | ||
111 | prefix .. "/include/lua" .. luaver, | ||
112 | prefix, | ||
113 | luajitver and prefix .. "/include/luajit-" .. luajitver, | ||
114 | } | ||
115 | |||
116 | for _, d in ipairs(incdirs) do | ||
117 | local lua_h = dir.path(d, "lua.h") | ||
118 | if exists(lua_h) then | ||
119 | return d | ||
120 | end | ||
121 | end | ||
122 | |||
123 | -- fallback to a default, as it is not necessarily needed. | ||
124 | return incdirs[1] | ||
125 | end | ||
126 | |||
127 | find_lua = function(prefix, luaver) | ||
128 | local lua_interpreter, bindir | ||
129 | lua_interpreter, bindir, luaver = find_lua_bindir(prefix, luaver) | ||
130 | if not lua_interpreter then | ||
131 | return nil, bindir | ||
132 | end | ||
133 | |||
134 | local luajitver | ||
135 | local lua_exe = dir.path(bindir, lua_interpreter) | ||
136 | luaver, luajitver = check_lua_version(lua_exe, luaver) | ||
137 | |||
138 | return { | ||
139 | lua_version = luaver, | ||
140 | luajit_version = luajitver, | ||
141 | lua_interpreter = lua_interpreter, | ||
142 | lua_dir = prefix, | ||
143 | lua_bindir = bindir, | ||
144 | lua_incdir = find_lua_incdir(prefix, luaver, luajitver), | ||
145 | lua_libdir = prefix .. "/lib", | ||
146 | } | ||
147 | end | ||
148 | end | ||
149 | |||
150 | local function check_popen() | ||
151 | local popen_ok, popen_result = pcall(io.popen, "") | ||
152 | if popen_ok then | ||
153 | if popen_result then | ||
154 | popen_result:close() | ||
155 | end | ||
156 | else | ||
157 | io.stderr:write("Your version of Lua does not support io.popen,\n") | ||
158 | io.stderr:write("which is required by LuaRocks. Please check your Lua installation.\n") | ||
159 | os.exit(cmd.errorcodes.UNSPECIFIED) | ||
160 | end | ||
161 | end | ||
162 | |||
163 | local process_tree_flags | ||
164 | do | ||
165 | local function replace_tree(flags, tree) | ||
166 | tree = dir.normalize(tree) | ||
167 | flags["tree"] = tree | ||
168 | path.use_tree(tree) | ||
169 | end | ||
170 | |||
171 | local function find_project_dir() | ||
172 | local try = "." | ||
173 | for _ = 1, 10 do -- FIXME detect when root dir was hit instead | ||
174 | local abs = fs.absolute_name(try) | ||
175 | if fs.is_dir(abs .. "/.luarocks") and fs.is_dir(abs .. "/lua_modules") then | ||
176 | abs = abs:gsub("/.$", "") | ||
177 | return abs, abs .. "/lua_modules" | ||
178 | end | ||
179 | try = try .. "/.." | ||
180 | end | ||
181 | end | ||
182 | |||
183 | local function strip_trailing_slashes() | ||
184 | if type(cfg.root_dir) == "string" then | ||
185 | cfg.root_dir = cfg.root_dir:gsub("/+$", "") | ||
186 | else | ||
187 | cfg.root_dir.root = cfg.root_dir.root:gsub("/+$", "") | ||
188 | end | ||
189 | cfg.rocks_dir = cfg.rocks_dir:gsub("/+$", "") | ||
190 | cfg.deploy_bin_dir = cfg.deploy_bin_dir:gsub("/+$", "") | ||
191 | cfg.deploy_lua_dir = cfg.deploy_lua_dir:gsub("/+$", "") | ||
192 | cfg.deploy_lib_dir = cfg.deploy_lib_dir:gsub("/+$", "") | ||
193 | end | ||
194 | |||
195 | process_tree_flags = function(flags) | ||
196 | |||
197 | if cfg.local_by_default then | ||
198 | flags["local"] = true | ||
199 | end | ||
200 | |||
201 | if flags["tree"] then | ||
202 | local named = false | ||
203 | for _, tree in ipairs(cfg.rocks_trees) do | ||
204 | if type(tree) == "table" and flags["tree"] == tree.name then | ||
205 | if not tree.root then | ||
206 | return nil, "Configuration error: tree '"..tree.name.."' has no 'root' field." | ||
207 | end | ||
208 | replace_tree(flags, tree.root) | ||
209 | named = true | ||
210 | break | ||
211 | end | ||
212 | end | ||
213 | if not named then | ||
214 | local root_dir = fs.absolute_name(flags["tree"]) | ||
215 | replace_tree(flags, root_dir) | ||
216 | end | ||
217 | elseif flags["project-tree"] then | ||
218 | local tree = flags["project-tree"] | ||
219 | table.insert(cfg.rocks_trees, 1, { name = "project", root = tree } ) | ||
220 | path.use_tree(tree) | ||
221 | elseif flags["local"] then | ||
222 | if not cfg.home_tree then | ||
223 | return nil, "The --local flag is meant for operating in a user's home directory.\n".. | ||
224 | "You are running as a superuser, which is intended for system-wide operation.\n".. | ||
225 | "To force using the superuser's home, use --tree explicitly." | ||
226 | end | ||
227 | replace_tree(flags, cfg.home_tree) | ||
228 | else | ||
229 | local project_dir, rocks_tree = find_project_dir() | ||
230 | if project_dir then | ||
231 | table.insert(cfg.rocks_trees, 1, { name = "project", root = rocks_tree } ) | ||
232 | path.use_tree(rocks_tree) | ||
233 | else | ||
234 | local trees = cfg.rocks_trees | ||
235 | path.use_tree(trees[#trees]) | ||
236 | end | ||
237 | end | ||
238 | |||
239 | strip_trailing_slashes() | ||
240 | |||
241 | cfg.variables.ROCKS_TREE = cfg.rocks_dir | ||
242 | cfg.variables.SCRIPTS_DIR = cfg.deploy_bin_dir | ||
243 | |||
244 | return true | ||
245 | end | ||
246 | end | ||
247 | |||
248 | local function process_server_flags(flags) | ||
249 | if flags["server"] then | ||
250 | local protocol, pathname = dir.split_url(flags["server"]) | ||
251 | table.insert(cfg.rocks_servers, 1, protocol.."://"..pathname) | ||
252 | end | ||
253 | |||
254 | if flags["dev"] then | ||
255 | local append_dev = function(s) return dir.path(s, "dev") end | ||
256 | local dev_servers = fun.traverse(cfg.rocks_servers, append_dev) | ||
257 | cfg.rocks_servers = fun.concat(dev_servers, cfg.rocks_servers) | ||
258 | end | ||
259 | |||
260 | if flags["only-server"] then | ||
261 | if flags["dev"] then | ||
262 | return nil, "--only-server cannot be used with --dev" | ||
50 | end | 263 | end |
51 | try = try .. "/.." | 264 | if flags["server"] then |
265 | return nil, "--only-server cannot be used with --server" | ||
266 | end | ||
267 | cfg.rocks_servers = { flags["only-server"] } | ||
52 | end | 268 | end |
269 | |||
270 | return true | ||
53 | end | 271 | end |
54 | 272 | ||
55 | --- Main command-line processor. | 273 | --- Main command-line processor. |
@@ -58,9 +276,13 @@ end | |||
58 | -- to it any additional arguments passed by the user. | 276 | -- to it any additional arguments passed by the user. |
59 | -- Uses the global table "commands", which contains | 277 | -- Uses the global table "commands", which contains |
60 | -- the loaded modules representing commands. | 278 | -- the loaded modules representing commands. |
279 | -- @param program_version string: The program version number as a string. | ||
280 | -- @param description string: Short summary description of the program. | ||
61 | -- @param ... string: Arguments given on the command-line. | 281 | -- @param ... string: Arguments given on the command-line. |
62 | function cmd.run_command(description, commands, ...) | 282 | function cmd.run_command(description, commands, ...) |
63 | 283 | ||
284 | check_popen() | ||
285 | |||
64 | local function error_handler(err) | 286 | local function error_handler(err) |
65 | return debug.traceback("LuaRocks "..cfg.program_version.. | 287 | return debug.traceback("LuaRocks "..cfg.program_version.. |
66 | " bug (please report at https://github.com/luarocks/luarocks/issues).\n"..err, 2) | 288 | " bug (please report at https://github.com/luarocks/luarocks/issues).\n"..err, 2) |
@@ -82,45 +304,39 @@ function cmd.run_command(description, commands, ...) | |||
82 | os.exit(exitcode or cmd.errorcodes.UNSPECIFIED) | 304 | os.exit(exitcode or cmd.errorcodes.UNSPECIFIED) |
83 | end | 305 | end |
84 | 306 | ||
85 | local args = {...} | 307 | local function process_arguments(...) |
86 | local cmdline_vars = {} | 308 | local args = {...} |
87 | for i = #args, 1, -1 do | 309 | local cmdline_vars = {} |
88 | local arg = args[i] | 310 | for i = #args, 1, -1 do |
89 | if arg:match("^[^-][^=]*=") then | 311 | local arg = args[i] |
90 | local var, val = arg:match("^([A-Z_][A-Z0-9_]*)=(.*)") | 312 | if arg:match("^[^-][^=]*=") then |
91 | if val then | 313 | local var, val = arg:match("^([A-Z_][A-Z0-9_]*)=(.*)") |
92 | cmdline_vars[var] = val | 314 | if val then |
93 | table.remove(args, i) | 315 | cmdline_vars[var] = val |
94 | else | 316 | table.remove(args, i) |
95 | die("Invalid assignment: "..arg) | 317 | else |
318 | die("Invalid assignment: "..arg) | ||
319 | end | ||
96 | end | 320 | end |
97 | end | 321 | end |
98 | end | 322 | local nonflags = { util.parse_flags(unpack(args)) } |
99 | local nonflags = { util.parse_flags(unpack(args)) } | 323 | local flags = table.remove(nonflags, 1) |
100 | local flags = table.remove(nonflags, 1) | 324 | if flags.ERROR then |
101 | if flags.ERROR then | 325 | die(flags.ERROR.." See --help.") |
102 | die(flags.ERROR.." See --help.") | 326 | end |
103 | end | ||
104 | |||
105 | fs.init() | ||
106 | 327 | ||
107 | if flags["from"] then flags["server"] = flags["from"] end | 328 | -- Compatibility for old names of some flags |
108 | if flags["only-from"] then flags["only-server"] = flags["only-from"] end | 329 | if flags["to"] then flags["tree"] = flags["to"] end |
109 | if flags["only-sources-from"] then flags["only-sources"] = flags["only-sources-from"] end | 330 | if flags["from"] then flags["server"] = flags["from"] end |
110 | if flags["to"] then flags["tree"] = flags["to"] end | 331 | if flags["nodeps"] then flags["deps-mode"] = "none" end |
111 | if flags["nodeps"] then | 332 | if flags["only-from"] then flags["only-server"] = flags["only-from"] end |
112 | flags["deps-mode"] = "none" | 333 | if flags["only-sources-from"] then flags["only-sources"] = flags["only-sources-from"] end |
113 | end | ||
114 | |||
115 | cfg.flags = flags | ||
116 | 334 | ||
117 | local command | 335 | return flags, nonflags, cmdline_vars |
118 | |||
119 | if flags["verbose"] then -- setting it in the config file will kick-in earlier in the process | ||
120 | cfg.verbose = true | ||
121 | fs.verbose() | ||
122 | end | 336 | end |
123 | 337 | ||
338 | local flags, nonflags, cmdline_vars = process_arguments(...) | ||
339 | |||
124 | if flags["timeout"] then -- setting it in the config file will kick-in earlier in the process | 340 | if flags["timeout"] then -- setting it in the config file will kick-in earlier in the process |
125 | local timeout = tonumber(flags["timeout"]) | 341 | local timeout = tonumber(flags["timeout"]) |
126 | if timeout then | 342 | if timeout then |
@@ -130,6 +346,7 @@ function cmd.run_command(description, commands, ...) | |||
130 | end | 346 | end |
131 | end | 347 | end |
132 | 348 | ||
349 | local command | ||
133 | if flags["version"] then | 350 | if flags["version"] then |
134 | util.printout(program.." "..cfg.program_version) | 351 | util.printout(program.." "..cfg.program_version) |
135 | util.printout(description) | 352 | util.printout(description) |
@@ -141,101 +358,55 @@ function cmd.run_command(description, commands, ...) | |||
141 | command = table.remove(nonflags, 1) | 358 | command = table.remove(nonflags, 1) |
142 | end | 359 | end |
143 | command = command:gsub("-", "_") | 360 | command = command:gsub("-", "_") |
144 | |||
145 | if cfg.local_by_default then | ||
146 | flags["local"] = true | ||
147 | end | ||
148 | 361 | ||
149 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then | 362 | if flags["deps-mode"] and not deps.check_deps_mode_flag(flags["deps-mode"]) then |
150 | die("Invalid entry for --deps-mode.") | 363 | die("Invalid entry for --deps-mode.") |
151 | end | 364 | end |
152 | 365 | ||
153 | if flags["tree"] then | 366 | local lua_data |
154 | local named = false | 367 | if flags["lua-dir"] then |
155 | for _, tree in ipairs(cfg.rocks_trees) do | 368 | lua_data = find_lua(flags["lua-dir"], flags["lua-version"]) |
156 | if type(tree) == "table" and flags["tree"] == tree.name then | ||
157 | if not tree.root then | ||
158 | die("Configuration error: tree '"..tree.name.."' has no 'root' field.") | ||
159 | end | ||
160 | replace_tree(flags, tree.root) | ||
161 | named = true | ||
162 | break | ||
163 | end | ||
164 | end | ||
165 | if not named then | ||
166 | local root_dir = fs.absolute_name(flags["tree"]) | ||
167 | replace_tree(flags, root_dir) | ||
168 | end | ||
169 | elseif flags["project-tree"] then | ||
170 | local tree = flags["project-tree"] | ||
171 | table.insert(cfg.rocks_trees, 1, { name = "project", root = tree } ) | ||
172 | path.use_tree(tree) | ||
173 | elseif flags["local"] then | ||
174 | if not cfg.home_tree then | ||
175 | die("The --local flag is meant for operating in a user's home directory.\n".. | ||
176 | "You are running as a superuser, which is intended for system-wide operation.\n".. | ||
177 | "To force using the superuser's home, use --tree explicitly.") | ||
178 | end | ||
179 | replace_tree(flags, cfg.home_tree) | ||
180 | else | ||
181 | local project_dir, rocks_tree = find_project_dir() | ||
182 | if project_dir then | ||
183 | table.insert(cfg.rocks_trees, 1, { name = "project", root = rocks_tree } ) | ||
184 | path.use_tree(rocks_tree) | ||
185 | else | ||
186 | local trees = cfg.rocks_trees | ||
187 | path.use_tree(trees[#trees]) | ||
188 | end | ||
189 | end | 369 | end |
190 | 370 | ||
191 | if type(cfg.root_dir) == "string" then | 371 | ----------------------------------------------------------------------------- |
192 | cfg.root_dir = cfg.root_dir:gsub("/+$", "") | 372 | local ok, err = cfg.init(lua_data, util.warning) |
193 | else | 373 | if not ok then |
194 | cfg.root_dir.root = cfg.root_dir.root:gsub("/+$", "") | 374 | die(err) |
195 | end | 375 | end |
196 | cfg.rocks_dir = cfg.rocks_dir:gsub("/+$", "") | 376 | ----------------------------------------------------------------------------- |
197 | cfg.deploy_bin_dir = cfg.deploy_bin_dir:gsub("/+$", "") | ||
198 | cfg.deploy_lua_dir = cfg.deploy_lua_dir:gsub("/+$", "") | ||
199 | cfg.deploy_lib_dir = cfg.deploy_lib_dir:gsub("/+$", "") | ||
200 | |||
201 | cfg.variables.ROCKS_TREE = cfg.rocks_dir | ||
202 | cfg.variables.SCRIPTS_DIR = cfg.deploy_bin_dir | ||
203 | 377 | ||
204 | if flags["server"] then | 378 | fs.init() |
205 | local protocol, pathname = dir.split_url(flags["server"]) | 379 | |
206 | table.insert(cfg.rocks_servers, 1, protocol.."://"..pathname) | 380 | if flags["verbose"] then |
381 | cfg.verbose = true | ||
382 | fs.verbose() | ||
207 | end | 383 | end |
208 | 384 | ||
209 | if flags["dev"] then | 385 | if (not fs.current_dir()) or fs.current_dir() == "" then |
210 | local append_dev = function(s) return dir.path(s, "dev") end | 386 | die("Current directory does not exist. Please run LuaRocks from an existing directory.") |
211 | local dev_servers = fun.traverse(cfg.rocks_servers, append_dev) | ||
212 | cfg.rocks_servers = fun.concat(dev_servers, cfg.rocks_servers) | ||
213 | end | 387 | end |
214 | 388 | ||
215 | if flags["only-server"] then | 389 | local ok, err |
216 | if flags["dev"] then | 390 | ok, err = process_tree_flags(flags) |
217 | die("--only-server cannot be used with --dev") | 391 | if not ok then |
218 | end | 392 | die(err) |
219 | if flags["server"] then | 393 | end |
220 | die("--only-server cannot be used with --server") | 394 | |
221 | end | 395 | ok, err = process_server_flags(flags) |
222 | cfg.rocks_servers = { flags["only-server"] } | 396 | if not ok then |
397 | die(err) | ||
223 | end | 398 | end |
224 | 399 | ||
225 | if flags["only-sources"] then | 400 | if flags["only-sources"] then |
226 | cfg.only_sources_from = flags["only-sources"] | 401 | cfg.only_sources_from = flags["only-sources"] |
227 | end | 402 | end |
228 | 403 | ||
229 | if command ~= "help" then | 404 | if command ~= "help" then |
230 | for k, v in pairs(cmdline_vars) do | 405 | for k, v in pairs(cmdline_vars) do |
231 | cfg.variables[k] = v | 406 | cfg.variables[k] = v |
232 | end | 407 | end |
233 | end | 408 | end |
234 | 409 | ||
235 | if (not fs.current_dir()) or fs.current_dir() == "" then | ||
236 | die("Current directory does not exist. Please run LuaRocks from an existing directory.") | ||
237 | end | ||
238 | |||
239 | if not is_ownership_ok(cfg.local_cache) then | 410 | if not is_ownership_ok(cfg.local_cache) then |
240 | util.warning("The directory '" .. cfg.local_cache .. "' or its parent directory ".. | 411 | util.warning("The directory '" .. cfg.local_cache .. "' or its parent directory ".. |
241 | "is not owned by the current user and the cache has been disabled. ".. | 412 | "is not owned by the current user and the cache has been disabled. ".. |
@@ -246,10 +417,16 @@ function cmd.run_command(description, commands, ...) | |||
246 | cfg.local_cache = fs.make_temp_dir("local_cache") | 417 | cfg.local_cache = fs.make_temp_dir("local_cache") |
247 | util.schedule_function(fs.delete, cfg.local_cache) | 418 | util.schedule_function(fs.delete, cfg.local_cache) |
248 | end | 419 | end |
249 | 420 | ||
250 | if commands[command] then | 421 | if commands[command] then |
251 | local cmd_mod = require(commands[command]) | 422 | local cmd_mod = require(commands[command]) |
252 | local call_ok, ok, err, exitcode = xpcall(function() return cmd_mod.command(flags, unpack(nonflags)) end, error_handler) | 423 | local call_ok, ok, err, exitcode = xpcall(function() |
424 | if command == "help" then | ||
425 | return cmd_mod.command(description, commands, unpack(nonflags)) | ||
426 | else | ||
427 | return cmd_mod.command(flags, unpack(nonflags)) | ||
428 | end | ||
429 | end, error_handler) | ||
253 | if not call_ok then | 430 | if not call_ok then |
254 | die(ok, cmd.errorcodes.CRASH) | 431 | die(ok, cmd.errorcodes.CRASH) |
255 | elseif not ok then | 432 | elseif not ok then |
diff --git a/src/luarocks/cmd/help.lua b/src/luarocks/cmd/help.lua index 1e1d8676..3b13acc2 100644 --- a/src/luarocks/cmd/help.lua +++ b/src/luarocks/cmd/help.lua | |||
@@ -63,6 +63,7 @@ function help.command(description, commands, command) | |||
63 | (overrides any entries in the config file) | 63 | (overrides any entries in the config file) |
64 | --only-sources=<url> Restrict downloads to paths matching the | 64 | --only-sources=<url> Restrict downloads to paths matching the |
65 | given URL. | 65 | given URL. |
66 | --lua-dir=<prefix> Which Lua installation to use. | ||
66 | --tree=<tree> Which tree to operate on. | 67 | --tree=<tree> Which tree to operate on. |
67 | --local Use the tree in the user's home directory. | 68 | --local Use the tree in the user's home directory. |
68 | To enable it, see ']]..program..[[ help path'. | 69 | To enable it, see ']]..program..[[ help path'. |
diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 7c29e2dc..cd3aadbc 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua | |||
@@ -10,106 +10,19 @@ | |||
10 | -- files. Run `luarocks` with no arguments to see the locations of | 10 | -- files. Run `luarocks` with no arguments to see the locations of |
11 | -- these files in your platform. | 11 | -- these files in your platform. |
12 | 12 | ||
13 | local rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION = | 13 | local next, table, pairs, require, os, pcall, ipairs, package, tonumber, type, assert = |
14 | rawset, next, table, pairs, require, io, os, setmetatable, pcall, ipairs, package, tonumber, type, assert, _VERSION | 14 | next, table, pairs, require, os, pcall, ipairs, package, tonumber, type, assert |
15 | |||
16 | local cfg = {} | ||
17 | |||
18 | cfg.lua_version = _VERSION:match(" (5%.[1234])$") or "5.1" | ||
19 | local version_suffix = cfg.lua_version:gsub("%.", "_") | ||
20 | |||
21 | -- Load site-local global configurations | ||
22 | local ok, site_config = pcall(require, "luarocks.core.site_config_"..version_suffix) | ||
23 | if not ok then | ||
24 | io.stderr:write("Site-local luarocks/core/site_config_"..version_suffix..".lua file not found. Incomplete installation?\n") | ||
25 | site_config = {} | ||
26 | end | ||
27 | 15 | ||
28 | local util = require("luarocks.core.util") | 16 | local util = require("luarocks.core.util") |
29 | local persist = require("luarocks.core.persist") | 17 | local persist = require("luarocks.core.persist") |
30 | local require = nil | ||
31 | -------------------------------------------------------------------------------- | ||
32 | 18 | ||
33 | cfg.program_version = "dev" | 19 | -------------------------------------------------------------------------------- |
34 | cfg.program_series = "3.0" | ||
35 | cfg.major_version = (cfg.program_version:match("([^.]%.[^.])")) or cfg.program_series | ||
36 | cfg.variables = {} | ||
37 | cfg.rocks_trees = {} | ||
38 | cfg.platforms = {} | ||
39 | |||
40 | local popen_ok, popen_result = pcall(io.popen, "") | ||
41 | if popen_ok then | ||
42 | if popen_result then | ||
43 | popen_result:close() | ||
44 | end | ||
45 | else | ||
46 | io.stderr:write("Your version of Lua does not support io.popen,\n") | ||
47 | io.stderr:write("which is required by LuaRocks. Please check your Lua installation.\n") | ||
48 | os.exit(1) -- FIXME | ||
49 | end | ||
50 | 20 | ||
51 | -- System detection: | 21 | local program_version = "dev" |
52 | 22 | local program_series = "3.0" | |
53 | -- A proper installation of LuaRocks will hardcode the system | 23 | local major_version = (program_version:match("([^.]%.[^.])")) or program_series |
54 | -- and proc values with site_config.LUAROCKS_UNAME_S and site_config.LUAROCKS_UNAME_M, | ||
55 | -- so that this detection does not run every time. When it is | ||
56 | -- performed, we use the Unix way to identify the system, | ||
57 | -- even on Windows (assuming UnxUtils or Cygwin). | ||
58 | local system = site_config.LUAROCKS_UNAME_S or util.popen_read("uname -s") | ||
59 | local proc = site_config.LUAROCKS_UNAME_M or util.popen_read("uname -m") | ||
60 | if proc:match("i[%d]86") then | ||
61 | cfg.target_cpu = "x86" | ||
62 | elseif proc:match("amd64") or proc:match("x86_64") then | ||
63 | cfg.target_cpu = "x86_64" | ||
64 | elseif proc:match("Power Macintosh") then | ||
65 | cfg.target_cpu = "powerpc" | ||
66 | else | ||
67 | cfg.target_cpu = proc | ||
68 | end | ||
69 | 24 | ||
70 | if system == "FreeBSD" then | 25 | local is_windows = package.config:sub(1,1) == "\\" |
71 | cfg.platforms.unix = true | ||
72 | cfg.platforms.freebsd = true | ||
73 | cfg.platforms.bsd = true | ||
74 | elseif system == "OpenBSD" then | ||
75 | cfg.platforms.unix = true | ||
76 | cfg.platforms.openbsd = true | ||
77 | cfg.platforms.bsd = true | ||
78 | elseif system == "NetBSD" then | ||
79 | cfg.platforms.unix = true | ||
80 | cfg.platforms.netbsd = true | ||
81 | cfg.platforms.bsd = true | ||
82 | elseif system == "Darwin" then | ||
83 | cfg.platforms.unix = true | ||
84 | cfg.platforms.macosx = true | ||
85 | cfg.platforms.bsd = true | ||
86 | elseif system == "Linux" then | ||
87 | cfg.platforms.unix = true | ||
88 | cfg.platforms.linux = true | ||
89 | elseif system == "SunOS" then | ||
90 | cfg.platforms.unix = true | ||
91 | cfg.platforms.solaris = true | ||
92 | elseif system and system:match("^CYGWIN") then | ||
93 | cfg.platforms.unix = true | ||
94 | cfg.platforms.cygwin = true | ||
95 | elseif system and system:match("^MSYS") then | ||
96 | cfg.platforms.unix = true | ||
97 | cfg.platforms.msys = true | ||
98 | cfg.platforms.cygwin = true | ||
99 | elseif system and system:match("^Windows") then | ||
100 | cfg.platforms.windows = true | ||
101 | cfg.platforms.win32 = true | ||
102 | elseif system and system:match("^MINGW") then | ||
103 | cfg.platforms.windows = true | ||
104 | cfg.platforms.mingw32 = true | ||
105 | cfg.platforms.win32 = true | ||
106 | elseif system == "Haiku" then | ||
107 | cfg.platforms.unix = true | ||
108 | cfg.platforms.haiku = true | ||
109 | else | ||
110 | cfg.platforms.unix = true | ||
111 | -- Fall back to Unix in unknown systems. | ||
112 | end | ||
113 | 26 | ||
114 | -- Set order for platform overrides. | 27 | -- Set order for platform overrides. |
115 | -- More general platform identifiers should be listed first, | 28 | -- More general platform identifiers should be listed first, |
@@ -128,630 +41,719 @@ local platform_order = { | |||
128 | "msys", | 41 | "msys", |
129 | "haiku", | 42 | "haiku", |
130 | -- Windows | 43 | -- Windows |
44 | "windows", | ||
131 | "win32", | 45 | "win32", |
132 | "mingw32", | 46 | "mingw32", |
133 | "windows", | ||
134 | } | 47 | } |
135 | 48 | ||
136 | -- Path configuration: | 49 | local load_config_file |
137 | local sys_config_file, home_config_file | 50 | do |
138 | local sys_config_file_default, home_config_file_default | 51 | -- Create global environment for the config files; |
139 | local sys_config_dir, home_config_dir | 52 | local function env_for_config_file(cfg, platforms) |
140 | local sys_config_ok, home_config_ok = false, false | 53 | local e |
141 | local extra_luarocks_module_dir | 54 | e = { |
142 | sys_config_dir = site_config.LUAROCKS_SYSCONFDIR or site_config.LUAROCKS_PREFIX | 55 | home = cfg.home, |
143 | if cfg.platforms.windows then | 56 | lua_version = cfg.lua_version, |
144 | cfg.home = os.getenv("APPDATA") or "c:" | 57 | platforms = util.make_shallow_copy(platforms), |
145 | sys_config_dir = sys_config_dir or "c:/luarocks" | 58 | processor = cfg.target_cpu, -- remains for compat reasons |
146 | home_config_dir = cfg.home.."/luarocks" | 59 | target_cpu = cfg.target_cpu, -- replaces `processor` |
147 | cfg.home_tree = cfg.home.."/luarocks/" | 60 | os_getenv = os.getenv, |
148 | else | 61 | variables = cfg.variables or {}, |
149 | cfg.home = os.getenv("HOME") or "" | 62 | dump_env = function() |
150 | sys_config_dir = sys_config_dir or "/etc/luarocks" | 63 | -- debug function, calling it from a config file will show all |
151 | home_config_dir = cfg.home.."/.luarocks" | 64 | -- available globals to that config file |
152 | cfg.home_tree = (os.getenv("USER") ~= "root") and cfg.home.."/.luarocks/" | 65 | print(util.show_table(e, "global environment")) |
153 | end | 66 | end, |
67 | } | ||
68 | return e | ||
69 | end | ||
154 | 70 | ||
155 | -- Create global environment for the config files; | 71 | -- Merge values from config files read into the `cfg` table |
156 | local env_for_config_file = function() | 72 | local function merge_overrides(cfg, overrides) |
157 | local e | 73 | -- remove some stuff we do not want to integrate |
158 | e = { | 74 | overrides.os_getenv = nil |
159 | home = cfg.home, | 75 | overrides.dump_env = nil |
160 | lua_version = cfg.lua_version, | 76 | -- remove tables to be copied verbatim instead of deeply merged |
161 | platforms = util.make_shallow_copy(cfg.platforms), | 77 | if overrides.rocks_trees then cfg.rocks_trees = nil end |
162 | processor = cfg.target_cpu, -- remains for compat reasons | 78 | if overrides.rocks_servers then cfg.rocks_servers = nil end |
163 | target_cpu = cfg.target_cpu, -- replaces `processor` | 79 | -- perform actual merge |
164 | os_getenv = os.getenv, | 80 | util.deep_merge(cfg, overrides) |
165 | dump_env = function() | 81 | end |
166 | -- debug function, calling it from a config file will show all | 82 | |
167 | -- available globals to that config file | 83 | local function update_platforms(platforms, overrides) |
168 | print(util.show_table(e, "global environment")) | 84 | if overrides[1] then |
169 | end, | 85 | for k, _ in pairs(platforms) do |
170 | } | 86 | platforms[k] = nil |
171 | return e | 87 | end |
172 | end | 88 | for _, v in ipairs(overrides) do |
89 | platforms[v] = true | ||
90 | end | ||
91 | -- set some fallback default in case the user provides an incomplete configuration. | ||
92 | -- LuaRocks expects a set of defaults to be available. | ||
93 | if not (platforms.unix or platforms.windows) then | ||
94 | platforms[is_windows and "windows" or "unix"] = true | ||
95 | end | ||
96 | end | ||
97 | end | ||
173 | 98 | ||
174 | -- Merge values from config files read into the `cfg` table | 99 | -- Load config file and merge its contents into the `cfg` module table. |
175 | local merge_overrides = function(overrides) | 100 | -- @return filepath of succesfully loaded file or nil if it failed |
176 | -- remove some stuff we do not want to integrate | 101 | load_config_file = function(cfg, platforms, filepath) |
177 | overrides.os_getenv = nil | 102 | local result, err, errcode = persist.load_into_table(filepath, env_for_config_file(cfg, platforms)) |
178 | overrides.dump_env = nil | 103 | if (not result) and errcode ~= "open" then |
179 | -- remove tables to be copied verbatim instead of deeply merged | 104 | -- errcode is either "load" or "run"; bad config file, so error out |
180 | if overrides.rocks_trees then cfg.rocks_trees = nil end | 105 | return nil, err, "config" |
181 | if overrides.rocks_servers then cfg.rocks_servers = nil end | 106 | end |
182 | -- perform actual merge | 107 | if result then |
183 | util.deep_merge(cfg, overrides) | 108 | -- success in loading and running, merge contents and exit |
109 | update_platforms(platforms, result.platforms) | ||
110 | result.platforms = nil | ||
111 | merge_overrides(cfg, result) | ||
112 | return filepath | ||
113 | end | ||
114 | return nil -- nothing was loaded | ||
115 | end | ||
184 | end | 116 | end |
185 | 117 | ||
186 | -- Load config file and merge its contents into the `cfg` module table. | 118 | local function make_platforms(system) |
187 | -- @return filepath of succesfully loaded file or nil if it failed | 119 | if system then |
188 | local load_config_file = function(filepath) | 120 | if system == "Linux" then return { unix = true, linux = true } |
189 | local result, err, errcode = persist.load_into_table(filepath, env_for_config_file()) | 121 | elseif system == "FreeBSD" then return { unix = true, bsd = true, freebsd = true } |
190 | if (not result) and errcode ~= "open" then | 122 | elseif system == "OpenBSD" then return { unix = true, bsd = true, openbsd = true } |
191 | -- errcode is either "load" or "run"; bad config file, so error out | 123 | elseif system == "NetBSD" then return { unix = true, bsd = true, netbsd = true } |
192 | io.stderr:write(err.."\n") | 124 | elseif system == "Darwin" then return { unix = true, bsd = true, macosx = true, macos = true } |
193 | os.exit(3) -- FIXME | 125 | elseif system == "SunOS" then return { unix = true, solaris = true } |
194 | end | 126 | elseif system == "Haiku" then return { unix = true, haiku = true } |
195 | if result then | 127 | elseif system:match("^CYGWIN") then return { unix = true, cygwin = true } |
196 | -- success in loading and running, merge contents and exit | 128 | elseif system:match("^MSYS") then return { unix = true, cygwin = true, msys = true } |
197 | merge_overrides(result) | 129 | elseif system:match("^Windows") then return { windows = true, win32 = true } |
198 | return filepath | 130 | elseif system:match("^MINGW") then return { windows = true, win32 = true, mingw32 = true, mingw = true } |
199 | end | 131 | end |
200 | return nil -- nothing was loaded | 132 | end |
133 | return { unix = true } -- fallback to Unix in unknown systems | ||
201 | end | 134 | end |
202 | 135 | ||
136 | -------------------------------------------------------------------------------- | ||
203 | 137 | ||
204 | -- Load system configuration file | 138 | local function make_defaults(lua_version, target_cpu, platforms, home) |
205 | do | 139 | |
206 | sys_config_file_default = sys_config_dir.."/config-"..cfg.lua_version..".lua" | 140 | -- Configure defaults: |
207 | sys_config_file = load_config_file( | 141 | local defaults = { |
208 | site_config.LUAROCKS_SYSCONFIG or sys_config_file_default | 142 | |
209 | ) | 143 | lua_interpreter = "lua", |
210 | sys_config_ok = (sys_config_file ~= nil) | 144 | local_by_default = false, |
211 | end | 145 | accept_unknown_fields = false, |
146 | fs_use_modules = true, | ||
147 | hooks_enabled = true, | ||
148 | deps_mode = "one", | ||
149 | check_certificates = false, | ||
150 | |||
151 | lua_modules_path = "/share/lua/"..lua_version, | ||
152 | lib_modules_path = "/lib/lua/"..lua_version, | ||
153 | rocks_subdir = "/lib/luarocks/rocks-"..lua_version, | ||
154 | |||
155 | arch = "unknown", | ||
156 | lib_extension = "unknown", | ||
157 | obj_extension = "unknown", | ||
158 | link_lua_explicitly = false, | ||
159 | |||
160 | rocks_servers = { | ||
161 | { | ||
162 | "https://luarocks.org", | ||
163 | "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/", | ||
164 | "http://luafr.org/moonrocks/", | ||
165 | "http://luarocks.logiceditor.com/rocks", | ||
166 | } | ||
167 | }, | ||
168 | disabled_servers = {}, | ||
212 | 169 | ||
213 | -- Load user configuration file (if allowed) | 170 | upload = { |
214 | if not site_config.LUAROCKS_FORCE_CONFIG then | 171 | server = "https://luarocks.org", |
215 | 172 | tool_version = "1.0.0", | |
216 | home_config_file_default = home_config_dir.."/config-"..cfg.lua_version..".lua" | 173 | api_version = "1", |
217 | 174 | }, | |
218 | local config_env_var = "LUAROCKS_CONFIG_" .. version_suffix | 175 | |
219 | local config_env_value = os.getenv(config_env_var) | 176 | lua_extension = "lua", |
220 | if not config_env_value then | 177 | connection_timeout = 30, -- 0 = no timeout |
221 | config_env_var = "LUAROCKS_CONFIG" | 178 | |
222 | config_env_value = os.getenv(config_env_var) | 179 | variables = { |
223 | end | 180 | MAKE = "make", |
224 | 181 | CC = "cc", | |
225 | -- first try environment provided file, so we can explicitly warn when it is missing | 182 | LD = "ld", |
226 | if config_env_value then | 183 | AR = "ar", |
227 | home_config_file = load_config_file(config_env_value) | 184 | RANLIB = "ranlib", |
228 | home_config_ok = (home_config_file ~= nil) | 185 | |
229 | if not home_config_ok then | 186 | CVS = "cvs", |
230 | io.stderr:write("Warning: could not load configuration file `"..config_env_value.."` given in environment variable "..config_env_var.."\n") | 187 | GIT = "git", |
188 | SSCM = "sscm", | ||
189 | SVN = "svn", | ||
190 | HG = "hg", | ||
191 | |||
192 | RSYNC = "rsync", | ||
193 | WGET = "wget", | ||
194 | SCP = "scp", | ||
195 | CURL = "curl", | ||
196 | |||
197 | PWD = "pwd", | ||
198 | MKDIR = "mkdir", | ||
199 | RMDIR = "rmdir", | ||
200 | CP = "cp", | ||
201 | LS = "ls", | ||
202 | RM = "rm", | ||
203 | FIND = "find", | ||
204 | TEST = "test", | ||
205 | CHMOD = "chmod", | ||
206 | ICACLS = "icacls", | ||
207 | MKTEMP = "mktemp", | ||
208 | |||
209 | ZIP = "zip", | ||
210 | UNZIP = "unzip -n", | ||
211 | GUNZIP = "gunzip", | ||
212 | BUNZIP2 = "bunzip2", | ||
213 | TAR = "tar", | ||
214 | |||
215 | MD5SUM = "md5sum", | ||
216 | OPENSSL = "openssl", | ||
217 | MD5 = "md5", | ||
218 | STAT = "stat", | ||
219 | TOUCH = "touch", | ||
220 | |||
221 | CMAKE = "cmake", | ||
222 | SEVENZ = "7z", | ||
223 | |||
224 | RSYNCFLAGS = "--exclude=.git -Oavz", | ||
225 | STATPERMFLAG = "-c '%a'", | ||
226 | STATOWNERFLAG = "-c '%U'", | ||
227 | CURLNOCERTFLAG = "", | ||
228 | WGETNOCERTFLAG = "", | ||
229 | }, | ||
230 | |||
231 | external_deps_subdirs = { | ||
232 | bin = "bin", | ||
233 | lib = "lib", | ||
234 | include = "include" | ||
235 | }, | ||
236 | runtime_external_deps_subdirs = { | ||
237 | bin = "bin", | ||
238 | lib = "lib", | ||
239 | include = "include" | ||
240 | }, | ||
241 | } | ||
242 | |||
243 | if platforms.windows then | ||
244 | |||
245 | defaults.arch = "win32-"..target_cpu | ||
246 | defaults.lib_extension = "dll" | ||
247 | defaults.external_lib_extension = "dll" | ||
248 | defaults.static_lib_extension = "lib" | ||
249 | defaults.obj_extension = "obj" | ||
250 | defaults.external_deps_dirs = { "c:/external/", "c:/windows/system32" } | ||
251 | |||
252 | defaults.makefile = "Makefile.win" | ||
253 | defaults.variables.MAKE = "nmake" | ||
254 | defaults.variables.CC = "cl" | ||
255 | defaults.variables.RC = "rc" | ||
256 | defaults.variables.LD = "link" | ||
257 | defaults.variables.MT = "mt" | ||
258 | defaults.variables.AR = "lib" | ||
259 | defaults.variables.LUALIB = "lua"..lua_version..".lib" | ||
260 | defaults.variables.CFLAGS = "/nologo /MD /O2" | ||
261 | defaults.variables.LIBFLAG = "/nologo /dll" | ||
262 | |||
263 | defaults.variables.LUA_DIR = "c:/lua" | ||
264 | defaults.variables.LUA_BINDIR = "c:/lua/bin" | ||
265 | defaults.variables.LUA_LIBDIR = "c:/lua/lib" | ||
266 | defaults.variables.LUA_INCDIR = "c:/lua/include" | ||
267 | |||
268 | defaults.external_deps_patterns = { | ||
269 | bin = { "?.exe", "?.bat" }, | ||
270 | lib = { "?.lib", "?.dll", "lib?.dll" }, | ||
271 | include = { "?.h" } | ||
272 | } | ||
273 | defaults.runtime_external_deps_patterns = { | ||
274 | bin = { "?.exe", "?.bat" }, | ||
275 | lib = { "?.dll", "lib?.dll" }, | ||
276 | include = { "?.h" } | ||
277 | } | ||
278 | defaults.export_path_separator = ";" | ||
279 | defaults.wrapper_suffix = ".bat" | ||
280 | |||
281 | local localappdata = os.getenv("LOCALAPPDATA") | ||
282 | if not localappdata then | ||
283 | -- for Windows versions below Vista | ||
284 | localappdata = os.getenv("USERPROFILE").."/Local Settings/Application Data" | ||
231 | end | 285 | end |
286 | defaults.local_cache = localappdata.."/LuaRocks/Cache" | ||
287 | defaults.web_browser = "start" | ||
288 | |||
289 | defaults.external_deps_subdirs.lib = { "", "lib" } | ||
290 | defaults.runtime_external_deps_subdirs.lib = { "", "lib" } | ||
232 | end | 291 | end |
233 | 292 | ||
234 | -- try the alternative defaults if there was no environment specified file or it didn't work | 293 | if platforms.mingw32 then |
235 | if not home_config_ok then | 294 | defaults.obj_extension = "o" |
236 | home_config_file = load_config_file(home_config_file_default) | 295 | defaults.static_lib_extension = "a" |
237 | home_config_ok = (home_config_file ~= nil) | 296 | defaults.external_deps_dirs = { "c:/external/", "c:/mingw", "c:/windows/system32" } |
297 | defaults.cmake_generator = "MinGW Makefiles" | ||
298 | defaults.variables.MAKE = "mingw32-make" | ||
299 | defaults.variables.CC = "mingw32-gcc" | ||
300 | defaults.variables.RC = "windres" | ||
301 | defaults.variables.LD = "mingw32-gcc" | ||
302 | defaults.variables.AR = "ar" | ||
303 | defaults.variables.RANLIB = "ranlib" | ||
304 | defaults.variables.CFLAGS = "-O2" | ||
305 | defaults.variables.LIBFLAG = "-shared" | ||
306 | defaults.makefile = "Makefile" | ||
307 | defaults.external_deps_patterns = { | ||
308 | bin = { "?.exe", "?.bat" }, | ||
309 | -- mingw lookup list from http://stackoverflow.com/a/15853231/1793220 | ||
310 | -- ...should we keep ?.lib at the end? It's not in the above list. | ||
311 | lib = { "lib?.dll.a", "?.dll.a", "lib?.a", "cyg?.dll", "lib?.dll", "?.dll", "?.lib" }, | ||
312 | include = { "?.h" } | ||
313 | } | ||
314 | defaults.runtime_external_deps_patterns = { | ||
315 | bin = { "?.exe", "?.bat" }, | ||
316 | lib = { "cyg?.dll", "?.dll", "lib?.dll" }, | ||
317 | include = { "?.h" } | ||
318 | } | ||
238 | end | 319 | end |
239 | end | ||
240 | 320 | ||
321 | if platforms.unix then | ||
322 | defaults.lib_extension = "so" | ||
323 | defaults.static_lib_extension = "a" | ||
324 | defaults.external_lib_extension = "so" | ||
325 | defaults.obj_extension = "o" | ||
326 | defaults.external_deps_dirs = { "/usr/local", "/usr" } | ||
327 | defaults.variables.CFLAGS = "-O2" | ||
328 | defaults.cmake_generator = "Unix Makefiles" | ||
329 | defaults.variables.CC = "gcc" | ||
330 | defaults.variables.LD = "gcc" | ||
331 | defaults.gcc_rpath = true | ||
332 | defaults.variables.LIBFLAG = "-shared" | ||
333 | |||
334 | defaults.variables.LUA_DIR = "/usr/local" | ||
335 | defaults.variables.LUA_BINDIR = "/usr/local/bin" | ||
336 | defaults.variables.LUA_LIBDIR = "/usr/local/lib" | ||
337 | defaults.variables.LUA_INCDIR = "/usr/local/include" | ||
338 | |||
339 | defaults.external_deps_patterns = { | ||
340 | bin = { "?" }, | ||
341 | lib = { "lib?.a", "lib?.so", "lib?.so.*" }, | ||
342 | include = { "?.h" } | ||
343 | } | ||
344 | defaults.runtime_external_deps_patterns = { | ||
345 | bin = { "?" }, | ||
346 | lib = { "lib?.so", "lib?.so.*" }, | ||
347 | include = { "?.h" } | ||
348 | } | ||
349 | defaults.export_path_separator = ":" | ||
350 | defaults.wrapper_suffix = "" | ||
351 | defaults.local_cache = home.."/.cache/luarocks" | ||
352 | if not defaults.variables.CFLAGS:match("-fPIC") then | ||
353 | defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC" | ||
354 | end | ||
355 | defaults.web_browser = "xdg-open" | ||
356 | end | ||
241 | 357 | ||
242 | if not next(cfg.rocks_trees) then | 358 | if platforms.cygwin then |
243 | if cfg.home_tree then | 359 | defaults.lib_extension = "so" -- can be overridden in the config file for mingw builds |
244 | table.insert(cfg.rocks_trees, { name = "user", root = cfg.home_tree } ) | 360 | defaults.arch = "cygwin-"..target_cpu |
361 | defaults.cmake_generator = "Unix Makefiles" | ||
362 | defaults.variables.CC = "echo -llua | xargs gcc" | ||
363 | defaults.variables.LD = "echo -llua | xargs gcc" | ||
364 | defaults.variables.LIBFLAG = "-shared" | ||
365 | defaults.link_lua_explicitly = true | ||
245 | end | 366 | end |
246 | if site_config.LUAROCKS_ROCKS_TREE then | 367 | |
247 | table.insert(cfg.rocks_trees, { name = "system", root = site_config.LUAROCKS_ROCKS_TREE } ) | 368 | if platforms.msys then |
369 | -- msys is basically cygwin made out of mingw, meaning the subsytem is unixish | ||
370 | -- enough, yet we can freely mix with native win32 | ||
371 | defaults.external_deps_patterns = { | ||
372 | bin = { "?.exe", "?.bat", "?" }, | ||
373 | lib = { "lib?.so", "lib?.so.*", "lib?.dll.a", "?.dll.a", | ||
374 | "lib?.a", "lib?.dll", "?.dll", "?.lib" }, | ||
375 | include = { "?.h" } | ||
376 | } | ||
377 | defaults.runtime_external_deps_patterns = { | ||
378 | bin = { "?.exe", "?.bat" }, | ||
379 | lib = { "lib?.so", "?.dll", "lib?.dll" }, | ||
380 | include = { "?.h" } | ||
381 | } | ||
248 | end | 382 | end |
249 | end | ||
250 | 383 | ||
251 | -- update platforms list; keyed -> array | 384 | if platforms.bsd then |
252 | do | 385 | defaults.variables.MAKE = "gmake" |
253 | -- if explicitly given by user, | 386 | defaults.variables.STATPERMFLAG = "-f '%OLp'" |
254 | if cfg.platforms[1] then | 387 | defaults.variables.STATOWNERFLAG = "-f '%Su'" |
255 | local is_windows = cfg.platforms.windows | 388 | end |
256 | -- Clear auto-detected values | 389 | |
257 | for k, _ in pairs(cfg.platforms) do | 390 | if platforms.macosx then |
258 | if type(k) == "string" then | 391 | defaults.variables.MAKE = "make" |
259 | cfg.platforms[k] = nil | 392 | defaults.external_lib_extension = "dylib" |
260 | end | 393 | defaults.arch = "macosx-"..target_cpu |
261 | end | 394 | defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load" |
262 | -- and set the ones given by the user. | 395 | defaults.variables.STAT = "/usr/bin/stat" |
263 | for _, plat in ipairs(cfg.platforms) do | 396 | defaults.variables.STATFLAG = "-f '%A'" |
264 | cfg.platforms[plat] = true | 397 | local version = util.popen_read("sw_vers -productVersion") |
265 | end | 398 | version = tonumber(version and version:match("^[^.]+%.([^.]+)")) or 3 |
266 | -- If no major platform family was set by the user, | 399 | if version >= 10 then |
267 | if not (cfg.platforms.unix or cfg.platforms.windows) then | 400 | version = 8 |
268 | -- set some fallback defaults in case the user provides an incomplete configuration. | 401 | elseif version >= 5 then |
269 | -- LuaRocks expects a set of defaults to be available. | 402 | version = 5 |
270 | -- This is used for setting defaults here only; the platform overrides | 403 | else |
271 | -- will use only the user's list. | 404 | defaults.gcc_rpath = false |
272 | if is_windows then | ||
273 | cfg.platforms.windows = true | ||
274 | table.insert(cfg.platforms, "windows") | ||
275 | else | ||
276 | cfg.platforms.unix = true | ||
277 | table.insert(cfg.platforms, "unix") | ||
278 | end | ||
279 | end | ||
280 | else | ||
281 | -- Sort detected platform defaults | ||
282 | local order = {} | ||
283 | for i, v in ipairs(platform_order) do | ||
284 | order[v] = i | ||
285 | end | ||
286 | local entries = {} | ||
287 | for k, v in pairs(cfg.platforms) do | ||
288 | if type(k) == "string" and v == true then | ||
289 | table.insert(entries, k) | ||
290 | end | ||
291 | end | 405 | end |
292 | table.sort(entries, function(a, b) return order[a] < order[b] end) | 406 | defaults.variables.CC = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc" |
293 | util.deep_merge(cfg.platforms, entries) | 407 | defaults.variables.LD = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc" |
408 | defaults.web_browser = "open" | ||
294 | end | 409 | end |
295 | end | ||
296 | 410 | ||
297 | -- Configure defaults: | 411 | if platforms.linux then |
298 | local defaults = { | 412 | defaults.arch = "linux-"..target_cpu |
299 | |||
300 | local_by_default = false, | ||
301 | accept_unknown_fields = false, | ||
302 | fs_use_modules = true, | ||
303 | hooks_enabled = true, | ||
304 | deps_mode = "one", | ||
305 | check_certificates = false, | ||
306 | |||
307 | lua_modules_path = "/share/lua/"..cfg.lua_version, | ||
308 | lib_modules_path = "/lib/lua/"..cfg.lua_version, | ||
309 | rocks_subdir = "/lib/luarocks/rocks-"..cfg.lua_version, | ||
310 | |||
311 | arch = "unknown", | ||
312 | lib_extension = "unknown", | ||
313 | obj_extension = "unknown", | ||
314 | link_lua_explicitly = false, | ||
315 | |||
316 | rocks_servers = { | ||
317 | { | ||
318 | "https://luarocks.org", | ||
319 | "https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/", | ||
320 | "http://luafr.org/moonrocks/", | ||
321 | "http://luarocks.logiceditor.com/rocks", | ||
322 | } | ||
323 | }, | ||
324 | disabled_servers = {}, | ||
325 | |||
326 | upload = { | ||
327 | server = "https://luarocks.org", | ||
328 | tool_version = "1.0.0", | ||
329 | api_version = "1", | ||
330 | }, | ||
331 | |||
332 | lua_extension = "lua", | ||
333 | lua_interpreter = site_config.LUA_INTERPRETER or "lua", | ||
334 | downloader = site_config.LUAROCKS_DOWNLOADER or "wget", | ||
335 | md5checker = site_config.LUAROCKS_MD5CHECKER or "md5sum", | ||
336 | connection_timeout = 30, -- 0 = no timeout | ||
337 | |||
338 | variables = { | ||
339 | MAKE = "make", | ||
340 | CC = "cc", | ||
341 | LD = "ld", | ||
342 | AR = "ar", | ||
343 | RANLIB = "ranlib", | ||
344 | |||
345 | CVS = "cvs", | ||
346 | GIT = "git", | ||
347 | SSCM = "sscm", | ||
348 | SVN = "svn", | ||
349 | HG = "hg", | ||
350 | |||
351 | RSYNC = "rsync", | ||
352 | WGET = "wget", | ||
353 | SCP = "scp", | ||
354 | CURL = "curl", | ||
355 | |||
356 | PWD = "pwd", | ||
357 | MKDIR = "mkdir", | ||
358 | RMDIR = "rmdir", | ||
359 | CP = "cp", | ||
360 | LS = "ls", | ||
361 | RM = "rm", | ||
362 | FIND = "find", | ||
363 | TEST = "test", | ||
364 | CHMOD = "chmod", | ||
365 | ICACLS = "icacls", | ||
366 | MKTEMP = "mktemp", | ||
367 | |||
368 | ZIP = "zip", | ||
369 | UNZIP = "unzip -n", | ||
370 | GUNZIP = "gunzip", | ||
371 | BUNZIP2 = "bunzip2", | ||
372 | TAR = "tar", | ||
373 | |||
374 | MD5SUM = "md5sum", | ||
375 | OPENSSL = "openssl", | ||
376 | MD5 = "md5", | ||
377 | STAT = "stat", | ||
378 | TOUCH = "touch", | ||
379 | |||
380 | CMAKE = "cmake", | ||
381 | SEVENZ = "7z", | ||
382 | |||
383 | RSYNCFLAGS = "--exclude=.git -Oavz", | ||
384 | STATPERMFLAG = "-c '%a'", | ||
385 | STATOWNERFLAG = "-c '%U'", | ||
386 | CURLNOCERTFLAG = "", | ||
387 | WGETNOCERTFLAG = "", | ||
388 | }, | ||
389 | |||
390 | external_deps_subdirs = site_config.LUAROCKS_EXTERNAL_DEPS_SUBDIRS or { | ||
391 | bin = "bin", | ||
392 | lib = "lib", | ||
393 | include = "include" | ||
394 | }, | ||
395 | runtime_external_deps_subdirs = site_config.LUAROCKS_RUNTIME_EXTERNAL_DEPS_SUBDIRS or { | ||
396 | bin = "bin", | ||
397 | lib = "lib", | ||
398 | include = "include" | ||
399 | }, | ||
400 | |||
401 | rocks_provided = {}, | ||
402 | rocks_provided_3_0 = {}, | ||
403 | } | ||
404 | 413 | ||
405 | if cfg.platforms.windows then | 414 | local gcc_arch = util.popen_read("gcc -print-multiarch 2>/dev/null") |
406 | local full_prefix = (site_config.LUAROCKS_PREFIX or (os.getenv("PROGRAMFILES")..[[\LuaRocks]])) | 415 | if gcc_arch and gcc_arch ~= "" then |
407 | extra_luarocks_module_dir = full_prefix.."/lua/?.lua" | 416 | defaults.external_deps_subdirs.lib = { "lib", "lib/" .. gcc_arch, "lib64" } |
408 | 417 | defaults.runtime_external_deps_subdirs.lib = { "lib", "lib/" .. gcc_arch, "lib64" } | |
409 | home_config_file = home_config_file and home_config_file:gsub("\\","/") | 418 | else |
410 | defaults.fs_use_modules = false | 419 | defaults.external_deps_subdirs.lib = { "lib", "lib64" } |
411 | defaults.arch = "win32-"..cfg.target_cpu | 420 | defaults.runtime_external_deps_subdirs.lib = { "lib", "lib64" } |
412 | defaults.lib_extension = "dll" | ||
413 | defaults.external_lib_extension = "dll" | ||
414 | defaults.static_lib_extension = "lib" | ||
415 | defaults.obj_extension = "obj" | ||
416 | defaults.external_deps_dirs = { "c:/external", "c:/windows/system32" } | ||
417 | defaults.variables.LUA_BINDIR = site_config.LUA_BINDIR and site_config.LUA_BINDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/bin" | ||
418 | defaults.variables.LUA_INCDIR = site_config.LUA_INCDIR and site_config.LUA_INCDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/include" | ||
419 | defaults.variables.LUA_LIBDIR = site_config.LUA_LIBDIR and site_config.LUA_LIBDIR:gsub("\\", "/") or "c:/lua"..cfg.lua_version.."/lib" | ||
420 | |||
421 | defaults.makefile = "Makefile.win" | ||
422 | defaults.variables.MAKE = "nmake" | ||
423 | defaults.variables.CC = "cl" | ||
424 | defaults.variables.RC = "rc" | ||
425 | defaults.variables.WRAPPER = full_prefix.."\\rclauncher.c" | ||
426 | defaults.variables.LD = "link" | ||
427 | defaults.variables.MT = "mt" | ||
428 | defaults.variables.AR = "lib" | ||
429 | defaults.variables.LUALIB = "lua"..cfg.lua_version..".lib" | ||
430 | defaults.variables.CFLAGS = "/nologo /MD /O2" | ||
431 | defaults.variables.LIBFLAG = "/nologo /dll" | ||
432 | |||
433 | local bins = { "SEVENZ", "CP", "FIND", "LS", "MD5SUM", | ||
434 | "MKDIR", "MV", "PWD", "RMDIR", "TEST", "UNAME", "WGET" } | ||
435 | for _, var in ipairs(bins) do | ||
436 | if defaults.variables[var] then | ||
437 | defaults.variables[var] = full_prefix.."\\tools\\"..defaults.variables[var] | ||
438 | end | 421 | end |
439 | end | 422 | end |
440 | 423 | ||
441 | defaults.external_deps_patterns = { | 424 | if platforms.freebsd then |
442 | bin = { "?.exe", "?.bat" }, | 425 | defaults.arch = "freebsd-"..target_cpu |
443 | lib = { "?.lib", "?.dll", "lib?.dll" }, | 426 | defaults.gcc_rpath = false |
444 | include = { "?.h" } | 427 | defaults.variables.CC = "cc" |
445 | } | 428 | defaults.variables.LD = "cc" |
446 | defaults.runtime_external_deps_patterns = { | ||
447 | bin = { "?.exe", "?.bat" }, | ||
448 | lib = { "?.dll", "lib?.dll" }, | ||
449 | include = { "?.h" } | ||
450 | } | ||
451 | defaults.export_path_separator = ";" | ||
452 | defaults.wrapper_suffix = ".bat" | ||
453 | |||
454 | local localappdata = os.getenv("LOCALAPPDATA") | ||
455 | if not localappdata then | ||
456 | -- for Windows versions below Vista | ||
457 | localappdata = os.getenv("USERPROFILE").."/Local Settings/Application Data" | ||
458 | end | 429 | end |
459 | defaults.local_cache = localappdata.."/LuaRocks/Cache" | ||
460 | defaults.web_browser = "start" | ||
461 | 430 | ||
462 | defaults.external_deps_subdirs = site_config.LUAROCKS_EXTERNAL_DEPS_SUBDIRS or { | 431 | if platforms.openbsd then |
463 | bin = {".", "bin"}, | 432 | defaults.arch = "openbsd-"..target_cpu |
464 | lib = {".", "lib"}, | 433 | end |
465 | include = {".", "include"}, | ||
466 | } | ||
467 | defaults.runtime_external_deps_subdirs = site_config.LUAROCKS_RUNTIME_EXTERNAL_DEPS_SUBDIRS or { | ||
468 | bin = {".", "bin"}, | ||
469 | lib = {".", "lib"}, | ||
470 | include = {".", "include"}, | ||
471 | } | ||
472 | 434 | ||
473 | end | 435 | if platforms.netbsd then |
436 | defaults.arch = "netbsd-"..target_cpu | ||
437 | end | ||
474 | 438 | ||
475 | if cfg.platforms.mingw32 then | 439 | if platforms.solaris then |
476 | defaults.obj_extension = "o" | 440 | defaults.arch = "solaris-"..target_cpu |
477 | defaults.static_lib_extension = "a" | 441 | --defaults.platforms = {"unix", "solaris"} |
478 | defaults.cmake_generator = "MinGW Makefiles" | 442 | defaults.variables.MAKE = "gmake" |
479 | defaults.variables.MAKE = "mingw32-make" | 443 | end |
480 | defaults.variables.CC = "mingw32-gcc" | ||
481 | defaults.variables.RC = "windres" | ||
482 | defaults.variables.LD = "mingw32-gcc" | ||
483 | defaults.variables.AR = "ar" | ||
484 | defaults.variables.RANLIB = "ranlib" | ||
485 | defaults.variables.CFLAGS = "-O2" | ||
486 | defaults.variables.LIBFLAG = "-shared" | ||
487 | defaults.makefile = "Makefile" | ||
488 | defaults.external_deps_dirs = { "c:/external", "c:/mingw", "c:/windows/system32" } | ||
489 | defaults.external_deps_patterns = { | ||
490 | bin = { "?.exe", "?.bat" }, | ||
491 | -- mingw lookup list from http://stackoverflow.com/a/15853231/1793220 | ||
492 | -- ...should we keep ?.lib at the end? It's not in the above list. | ||
493 | lib = { "lib?.dll.a", "?.dll.a", "lib?.a", "cyg?.dll", "lib?.dll", "?.dll", "?.lib" }, | ||
494 | include = { "?.h" } | ||
495 | } | ||
496 | defaults.runtime_external_deps_patterns = { | ||
497 | bin = { "?.exe", "?.bat" }, | ||
498 | lib = { "cyg?.dll", "?.dll", "lib?.dll" }, | ||
499 | include = { "?.h" } | ||
500 | } | ||
501 | 444 | ||
502 | end | 445 | -- Expose some more values detected by LuaRocks for use by rockspec authors. |
446 | defaults.variables.LIB_EXTENSION = defaults.lib_extension | ||
447 | defaults.variables.OBJ_EXTENSION = defaults.obj_extension | ||
503 | 448 | ||
504 | if cfg.platforms.unix then | 449 | return defaults |
505 | defaults.lib_extension = "so" | ||
506 | defaults.static_lib_extension = "a" | ||
507 | defaults.external_lib_extension = "so" | ||
508 | defaults.obj_extension = "o" | ||
509 | defaults.external_deps_dirs = { "/usr/local", "/usr" } | ||
510 | defaults.variables.LUA_BINDIR = site_config.LUA_BINDIR or "/usr/local/bin" | ||
511 | defaults.variables.LUA_INCDIR = site_config.LUA_INCDIR or "/usr/local/include" | ||
512 | defaults.variables.LUA_LIBDIR = site_config.LUA_LIBDIR or "/usr/local/lib" | ||
513 | defaults.variables.CFLAGS = "-O2" | ||
514 | defaults.cmake_generator = "Unix Makefiles" | ||
515 | defaults.variables.CC = "gcc" | ||
516 | defaults.variables.LD = "gcc" | ||
517 | defaults.gcc_rpath = true | ||
518 | defaults.variables.LIBFLAG = "-shared" | ||
519 | defaults.external_deps_patterns = { | ||
520 | bin = { "?" }, | ||
521 | lib = { "lib?.a", "lib?.so", "lib?.so.*" }, | ||
522 | include = { "?.h" } | ||
523 | } | ||
524 | defaults.runtime_external_deps_patterns = { | ||
525 | bin = { "?" }, | ||
526 | lib = { "lib?.so", "lib?.so.*" }, | ||
527 | include = { "?.h" } | ||
528 | } | ||
529 | defaults.export_path_separator = ":" | ||
530 | defaults.wrapper_suffix = "" | ||
531 | defaults.local_cache = cfg.home.."/.cache/luarocks" | ||
532 | if not defaults.variables.CFLAGS:match("-fPIC") then | ||
533 | defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC" | ||
534 | end | ||
535 | defaults.web_browser = "xdg-open" | ||
536 | end | 450 | end |
537 | 451 | ||
538 | if cfg.platforms.cygwin then | 452 | local function make_rocks_provided(lua_version, luajit_version) |
539 | defaults.lib_extension = "so" -- can be overridden in the config file for mingw builds | 453 | local rocks_provided = {} |
540 | defaults.arch = "cygwin-"..cfg.target_cpu | 454 | local rocks_provided_3_0 = {} |
541 | defaults.cmake_generator = "Unix Makefiles" | ||
542 | defaults.variables.CC = "echo -llua | xargs gcc" | ||
543 | defaults.variables.LD = "echo -llua | xargs gcc" | ||
544 | defaults.variables.LIBFLAG = "-shared" | ||
545 | defaults.link_lua_explicitly = true | ||
546 | end | ||
547 | 455 | ||
548 | if cfg.platforms.msys then | 456 | rocks_provided["lua"] = lua_version.."-1" |
549 | -- msys is basically cygwin made out of mingw, meaning the subsytem is unixish | ||
550 | -- enough, yet we can freely mix with native win32 | ||
551 | defaults.external_deps_patterns = { | ||
552 | bin = { "?.exe", "?.bat", "?" }, | ||
553 | lib = { "lib?.so", "lib?.so.*", "lib?.dll.a", "?.dll.a", | ||
554 | "lib?.a", "lib?.dll", "?.dll", "?.lib" }, | ||
555 | include = { "?.h" } | ||
556 | } | ||
557 | defaults.runtime_external_deps_patterns = { | ||
558 | bin = { "?.exe", "?.bat" }, | ||
559 | lib = { "lib?.so", "?.dll", "lib?.dll" }, | ||
560 | include = { "?.h" } | ||
561 | } | ||
562 | end | ||
563 | 457 | ||
458 | if lua_version == "5.2" or lua_version == "5.3" then | ||
459 | rocks_provided["bit32"] = lua_version.."-1" | ||
460 | end | ||
564 | 461 | ||
565 | if cfg.platforms.bsd then | 462 | if lua_version == "5.3" or lua_version == "5.4" then |
566 | defaults.variables.MAKE = "gmake" | 463 | rocks_provided["utf8"] = lua_version.."-1" |
567 | defaults.variables.STATPERMFLAG = "-f '%OLp'" | 464 | end |
568 | defaults.variables.STATOWNERFLAG = "-f '%Su'" | ||
569 | end | ||
570 | 465 | ||
571 | if cfg.platforms.macosx then | 466 | if luajit_version then |
572 | defaults.variables.MAKE = "make" | 467 | rocks_provided["luabitop"] = luajit_version.."-1" |
573 | defaults.external_lib_extension = "dylib" | 468 | rocks_provided_3_0["luajit"] = luajit_version.."-1" |
574 | defaults.arch = "macosx-"..cfg.target_cpu | ||
575 | defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load" | ||
576 | defaults.variables.STAT = "/usr/bin/stat" | ||
577 | defaults.variables.STATFLAG = "-f '%A'" | ||
578 | local version = util.popen_read("sw_vers -productVersion") | ||
579 | version = tonumber(version and version:match("^[^.]+%.([^.]+)")) or 3 | ||
580 | if version >= 10 then | ||
581 | version = 8 | ||
582 | elseif version >= 5 then | ||
583 | version = 5 | ||
584 | else | ||
585 | defaults.gcc_rpath = false | ||
586 | end | 469 | end |
587 | defaults.variables.CC = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc" | ||
588 | defaults.variables.LD = "env MACOSX_DEPLOYMENT_TARGET=10."..version.." gcc" | ||
589 | defaults.web_browser = "open" | ||
590 | end | ||
591 | 470 | ||
592 | if cfg.platforms.linux then | 471 | return rocks_provided, rocks_provided_3_0 |
593 | defaults.arch = "linux-"..cfg.target_cpu | ||
594 | end | 472 | end |
595 | 473 | ||
596 | if cfg.platforms.freebsd then | 474 | local function use_defaults(cfg, defaults) |
597 | defaults.arch = "freebsd-"..cfg.target_cpu | ||
598 | defaults.gcc_rpath = false | ||
599 | defaults.variables.CC = "cc" | ||
600 | defaults.variables.LD = "cc" | ||
601 | end | ||
602 | 475 | ||
603 | if cfg.platforms.openbsd then | 476 | -- Populate some arrays with values from their 'defaults' counterparts |
604 | defaults.arch = "openbsd-"..cfg.target_cpu | 477 | -- if they were not already set by user. |
605 | end | 478 | for _, entry in ipairs({"variables", "rocks_provided"}) do |
479 | if not cfg[entry] then | ||
480 | cfg[entry] = {} | ||
481 | end | ||
482 | for k,v in pairs(defaults[entry]) do | ||
483 | if not cfg[entry][k] then | ||
484 | cfg[entry][k] = v | ||
485 | end | ||
486 | end | ||
487 | end | ||
488 | util.deep_merge_under(defaults.rocks_provided_3_0, cfg.rocks_provided) | ||
606 | 489 | ||
607 | if cfg.platforms.netbsd then | 490 | util.deep_merge_under(cfg, defaults) |
608 | defaults.arch = "netbsd-"..cfg.target_cpu | ||
609 | end | ||
610 | 491 | ||
611 | if cfg.platforms.solaris then | 492 | -- FIXME get rid of this |
612 | defaults.arch = "solaris-"..cfg.target_cpu | 493 | if not cfg.check_certificates then |
613 | --defaults.platforms = {"unix", "solaris"} | 494 | cfg.variables.CURLNOCERTFLAG = "-k" |
614 | defaults.variables.MAKE = "gmake" | 495 | cfg.variables.WGETNOCERTFLAG = "--no-check-certificate" |
496 | end | ||
615 | end | 497 | end |
616 | 498 | ||
617 | -- Expose some more values detected by LuaRocks for use by rockspec authors. | 499 | -------------------------------------------------------------------------------- |
618 | defaults.variables.LIB_EXTENSION = defaults.lib_extension | ||
619 | defaults.variables.OBJ_EXTENSION = defaults.obj_extension | ||
620 | defaults.variables.LUAROCKS_PREFIX = site_config.LUAROCKS_PREFIX | ||
621 | defaults.variables.LUA = site_config.LUA_DIR_SET and (defaults.variables.LUA_BINDIR.."/"..defaults.lua_interpreter) or defaults.lua_interpreter | ||
622 | 500 | ||
623 | -- Add built-in modules to rocks_provided | 501 | local cfg = {} |
624 | defaults.rocks_provided["lua"] = cfg.lua_version.."-1" | ||
625 | 502 | ||
626 | if bit32 then -- Lua 5.2+ | 503 | function cfg.init(lua_data, warning) |
627 | defaults.rocks_provided["bit32"] = cfg.lua_version.."-1" | 504 | lua_data = lua_data or {} |
628 | end | ||
629 | 505 | ||
630 | if utf8 then -- Lua 5.3+ | 506 | local hc_ok, hardcoded = pcall(require, "luarocks.core.hardcoded") |
631 | defaults.rocks_provided["utf8"] = cfg.lua_version.."-1" | 507 | if not hc_ok then |
632 | end | 508 | hardcoded = {} |
509 | end | ||
633 | 510 | ||
634 | if package.loaded.jit then | 511 | local lua_version = lua_data.lua_version or hardcoded.LUA_VERSION or _VERSION:sub(5) |
635 | -- LuaJIT | 512 | local luajit_version = lua_data.luajit_version or hardcoded.LUAJIT_VERSION or (jit and jit.version:sub(8)) |
636 | local lj_version = package.loaded.jit.version:match("LuaJIT (.*)"):gsub("%-","") | 513 | local lua_interpreter = lua_data.lua_interpreter or hardcoded.LUA_INTERPRETER or (arg[-1] and arg[-1]:gsub(".*[\\/]", "")) or (is_windows and "lua.exe" or "lua") |
637 | defaults.rocks_provided["luabitop"] = lj_version.."-1" | 514 | local lua_bindir = lua_data.lua_bindir or hardcoded.LUA_BINDIR or (arg[-1] and arg[-1]:gsub("[\\/][^\\/]+$", "")) |
638 | defaults.rocks_provided_3_0["luajit"] = lj_version.."-1" | 515 | local lua_incdir = lua_data.lua_incdir or hardcoded.LUA_INCDIR |
639 | end | 516 | local lua_libdir = lua_data.lua_libdir or hardcoded.LUA_LIBDIR |
517 | local lua_dir = lua_data.lua_dir or hardcoded.LUA_DIR | ||
518 | |||
519 | local init = cfg.init | ||
640 | 520 | ||
641 | -- Use defaults: | 521 | ---------------------------------------- |
522 | -- Reset the cfg table. | ||
523 | ---------------------------------------- | ||
642 | 524 | ||
643 | -- Populate some arrays with values from their 'defaults' counterparts | 525 | for k, _ in pairs(cfg) do |
644 | -- if they were not already set by user. | 526 | cfg[k] = nil |
645 | for _, entry in ipairs({"variables", "rocks_provided"}) do | ||
646 | if not cfg[entry] then | ||
647 | cfg[entry] = {} | ||
648 | end | ||
649 | for k,v in pairs(defaults[entry]) do | ||
650 | if not cfg[entry][k] then | ||
651 | cfg[entry][k] = v | ||
652 | end | ||
653 | end | 527 | end |
654 | end | ||
655 | setmetatable(defaults.rocks_provided_3_0, { __index = cfg.rocks_provided }) | ||
656 | |||
657 | -- For values not set in the config file, use values from the 'defaults' table. | ||
658 | local cfg_mt = { | ||
659 | __index = function(t, k) | ||
660 | local default = defaults[k] | ||
661 | if default then | ||
662 | rawset(t, k, default) | ||
663 | end | ||
664 | return default | ||
665 | end | ||
666 | } | ||
667 | setmetatable(cfg, cfg_mt) | ||
668 | 528 | ||
669 | if not cfg.check_certificates then | 529 | cfg.program_version = program_version |
670 | cfg.variables.CURLNOCERTFLAG = "-k" | 530 | cfg.program_series = program_series |
671 | cfg.variables.WGETNOCERTFLAG = "--no-check-certificate" | 531 | cfg.major_version = major_version |
672 | end | ||
673 | 532 | ||
674 | function cfg.make_paths_from_tree(tree) | 533 | cfg.lua_version = lua_version |
675 | local lua_path, lib_path, bin_path | 534 | cfg.luajit_version = luajit_version |
676 | if type(tree) == "string" then | 535 | cfg.lua_interpreter = lua_interpreter |
677 | lua_path = tree..cfg.lua_modules_path | 536 | |
678 | lib_path = tree..cfg.lib_modules_path | 537 | cfg.variables = { |
679 | bin_path = tree.."/bin" | 538 | LUA_DIR = lua_dir, |
539 | LUA_BINDIR = lua_bindir, | ||
540 | LUA_INCDIR = lua_incdir, | ||
541 | LUA_LIBDIR = lua_libdir, | ||
542 | } | ||
543 | |||
544 | cfg.rocks_trees = {} | ||
545 | |||
546 | cfg.init = init | ||
547 | |||
548 | ---------------------------------------- | ||
549 | -- System detection. | ||
550 | ---------------------------------------- | ||
551 | |||
552 | -- A proper build of LuaRocks will hardcode the system | ||
553 | -- and proc values with hardcoded.SYSTEM and hardcoded.PROCESSOR. | ||
554 | -- If that is not available, we try to identify the system. | ||
555 | local system = hardcoded.SYSTEM | ||
556 | local processor = hardcoded.PROCESSOR | ||
557 | if is_windows then | ||
558 | system = system or "Windows" | ||
559 | if not processor then | ||
560 | local pe_parser = require("luarocks.fs.win32.pe-parser") | ||
561 | local err | ||
562 | local lua_exe = lua_bindir .. "\\" .. lua_interpreter | ||
563 | processor, err = pe_parser.get_architecture(lua_exe) | ||
564 | if err then | ||
565 | processor = "x86" | ||
566 | end | ||
567 | end | ||
680 | else | 568 | else |
681 | lua_path = tree.lua_dir or tree.root..cfg.lua_modules_path | 569 | system = system or util.popen_read("uname -s") |
682 | lib_path = tree.lib_dir or tree.root..cfg.lib_modules_path | 570 | processor = processor or util.popen_read("uname -m") |
683 | bin_path = tree.bin_dir or tree.root.."/bin" | ||
684 | end | 571 | end |
685 | return lua_path, lib_path, bin_path | ||
686 | end | ||
687 | 572 | ||
688 | function cfg.package_paths(current) | 573 | cfg.target_cpu = processor |
689 | local new_path, new_cpath, new_bin = {}, {}, {} | 574 | |
690 | local function add_tree_to_paths(tree) | 575 | local platforms = make_platforms(system) |
691 | local lua_path, lib_path, bin_path = cfg.make_paths_from_tree(tree) | 576 | |
692 | table.insert(new_path, lua_path.."/?.lua") | 577 | ---------------------------------------- |
693 | table.insert(new_path, lua_path.."/?/init.lua") | 578 | -- Platform is determined. |
694 | table.insert(new_cpath, lib_path.."/?."..cfg.lib_extension) | 579 | -- Let's load the config files. |
695 | table.insert(new_bin, bin_path) | 580 | ---------------------------------------- |
696 | end | 581 | |
697 | if current then | 582 | local sys_config_file |
698 | add_tree_to_paths(current) | 583 | local home_config_file |
584 | do | ||
585 | local sysconfdir = os.getenv("LUAROCKS_SYSCONFDIR") or hardcoded.SYSCONFDIR | ||
586 | local sdir, hdir | ||
587 | if platforms.windows then | ||
588 | cfg.home = os.getenv("APPDATA") or "c:" | ||
589 | sdir = sysconfdir or (os.getenv("PROGRAMFILES") or "c:") .. "/luarocks" | ||
590 | hdir = cfg.home.."/luarocks" | ||
591 | cfg.home_tree = cfg.home.."/luarocks" | ||
592 | else | ||
593 | cfg.home = os.getenv("HOME") or "" | ||
594 | sdir = sysconfdir or "/etc/luarocks" | ||
595 | hdir = cfg.home.."/.luarocks" | ||
596 | cfg.home_tree = (os.getenv("USER") ~= "root") and cfg.home.."/.luarocks/" | ||
597 | end | ||
598 | sys_config_file = sdir .. "/config-"..cfg.lua_version..".lua" | ||
599 | home_config_file = hdir .. "/config-"..cfg.lua_version..".lua" | ||
600 | |||
601 | sys_config_file = sys_config_file:gsub("\\", "/") | ||
602 | home_config_file = home_config_file:gsub("\\", "/") | ||
699 | end | 603 | end |
700 | for _,tree in ipairs(cfg.rocks_trees) do | 604 | |
701 | add_tree_to_paths(tree) | 605 | -- Load system configuration file |
606 | local sys_config_ok, err = load_config_file(cfg, platforms, sys_config_file) | ||
607 | if err then | ||
608 | return nil, err, "config" | ||
702 | end | 609 | end |
703 | if extra_luarocks_module_dir then | 610 | |
704 | table.insert(new_path, extra_luarocks_module_dir) | 611 | -- Load user configuration file (if allowed) |
612 | local home_config_ok | ||
613 | if not hardcoded.FORCE_CONFIG then | ||
614 | local env_var = "LUAROCKS_CONFIG_" .. lua_version:gsub("%.", "_") | ||
615 | local env_value = os.getenv(env_var) | ||
616 | if not env_value then | ||
617 | env_var = "LUAROCKS_CONFIG" | ||
618 | env_value = os.getenv(env_var) | ||
619 | end | ||
620 | -- first try environment provided file, so we can explicitly warn when it is missing | ||
621 | if env_value then | ||
622 | local env_ok, err = load_config_file(cfg, platforms, env_value) | ||
623 | if err then | ||
624 | return nil, err, "config" | ||
625 | elseif warning and not env_ok then | ||
626 | warning("Warning: could not load configuration file `"..env_value.."` given in environment variable "..env_var.."\n") | ||
627 | end | ||
628 | if env_ok then | ||
629 | home_config_ok = true | ||
630 | home_config_file = env_value | ||
631 | end | ||
632 | end | ||
633 | |||
634 | -- try the alternative defaults if there was no environment specified file or it didn't work | ||
635 | if not home_config_ok then | ||
636 | home_config_ok = load_config_file(cfg, platforms, home_config_file) | ||
637 | if err then | ||
638 | return nil, err, "config" | ||
639 | end | ||
640 | end | ||
705 | end | 641 | end |
706 | return table.concat(new_path, ";"), table.concat(new_cpath, ";"), table.concat(new_bin, cfg.export_path_separator) | ||
707 | end | ||
708 | 642 | ||
709 | function cfg.init_package_paths() | 643 | ---------------------------------------- |
710 | local lr_path, lr_cpath, lr_bin = cfg.package_paths() | 644 | -- Config files are loaded. |
711 | package.path = util.cleanup_path(package.path .. ";" .. lr_path, ";", cfg.lua_version) | 645 | -- Let's finish up the cfg table. |
712 | package.cpath = util.cleanup_path(package.cpath .. ";" .. lr_cpath, ";", cfg.lua_version) | 646 | ---------------------------------------- |
713 | end | 647 | |
648 | -- Settings given via lua_data (i.e. --lua-dir) take precedence over config files: | ||
649 | cfg.lua_version = lua_data.lua_version or cfg.lua_version | ||
650 | cfg.luajit_version = lua_data.luajit_version or cfg.luajit_version | ||
651 | cfg.lua_interpreter = lua_data.lua_interpreter or cfg.lua_interpreter | ||
652 | cfg.variables.LUA_BINDIR = lua_data.lua_bindir or cfg.variables.LUA_BINDIR | ||
653 | cfg.variables.LUA_INCDIR = lua_data.lua_incdir or cfg.variables.LUA_INCDIR | ||
654 | cfg.variables.LUA_LIBDIR = lua_data.lua_libdir or cfg.variables.LUA_LIBDIR | ||
655 | |||
656 | -- Build a default list of rocks trees if not given | ||
657 | if not next(cfg.rocks_trees) then | ||
658 | if cfg.home_tree then | ||
659 | table.insert(cfg.rocks_trees, { name = "user", root = cfg.home_tree } ) | ||
660 | end | ||
661 | if hardcoded.PREFIX then | ||
662 | table.insert(cfg.rocks_trees, { name = "system", root = hardcoded.PREFIX } ) | ||
663 | end | ||
664 | end | ||
714 | 665 | ||
715 | function cfg.which_config() | 666 | local defaults = make_defaults(lua_version, processor, platforms, cfg.home) |
716 | local ret = { | 667 | defaults.rocks_provided, defaults.rocks_provided_3_0 = make_rocks_provided(lua_version, luajit_version) |
717 | system = { | 668 | use_defaults(cfg, defaults) |
718 | file = sys_config_file or sys_config_file_default, | 669 | |
719 | ok = sys_config_ok, | 670 | cfg.variables.LUA = cfg.variables.LUA or cfg.variables.LUA_BINDIR .. "/" .. cfg.lua_interpreter |
720 | }, | 671 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch |
721 | user = { | 672 | |
722 | file = home_config_file or home_config_file_default, | 673 | ---------------------------------------- |
723 | ok = home_config_ok, | 674 | -- Attributes of cfg are set. |
675 | -- Let's add some methods. | ||
676 | ---------------------------------------- | ||
677 | |||
678 | function cfg.which_config() | ||
679 | return { | ||
680 | system = { | ||
681 | file = sys_config_file, | ||
682 | ok = sys_config_ok, | ||
683 | }, | ||
684 | user = { | ||
685 | file = home_config_file, | ||
686 | ok = home_config_ok, | ||
687 | }, | ||
688 | nearest = home_config_ok and home_config_file or sys_config_file, | ||
724 | } | 689 | } |
725 | } | 690 | end |
726 | ret.nearest = (ret.user.ok and ret.user.file) or ret.system.file | 691 | |
727 | return ret | 692 | do |
728 | end | 693 | local function make_paths_from_tree(tree) |
694 | local lua_path, lib_path, bin_path | ||
695 | if type(tree) == "string" then | ||
696 | lua_path = tree..cfg.lua_modules_path | ||
697 | lib_path = tree..cfg.lib_modules_path | ||
698 | bin_path = tree.."/bin" | ||
699 | else | ||
700 | lua_path = tree.lua_dir or tree.root..cfg.lua_modules_path | ||
701 | lib_path = tree.lib_dir or tree.root..cfg.lib_modules_path | ||
702 | bin_path = tree.bin_dir or tree.root.."/bin" | ||
703 | end | ||
704 | return lua_path, lib_path, bin_path | ||
705 | end | ||
729 | 706 | ||
730 | cfg.user_agent = "LuaRocks/"..cfg.program_version.." "..cfg.arch | 707 | function cfg.package_paths(current) |
708 | local new_path, new_cpath, new_bin = {}, {}, {} | ||
709 | local function add_tree_to_paths(tree) | ||
710 | local lua_path, lib_path, bin_path = make_paths_from_tree(tree) | ||
711 | table.insert(new_path, lua_path.."/?.lua") | ||
712 | table.insert(new_path, lua_path.."/?/init.lua") | ||
713 | table.insert(new_cpath, lib_path.."/?."..cfg.lib_extension) | ||
714 | table.insert(new_bin, bin_path) | ||
715 | end | ||
716 | if current then | ||
717 | add_tree_to_paths(current) | ||
718 | end | ||
719 | for _,tree in ipairs(cfg.rocks_trees) do | ||
720 | add_tree_to_paths(tree) | ||
721 | end | ||
722 | return table.concat(new_path, ";"), table.concat(new_cpath, ";"), table.concat(new_bin, cfg.export_path_separator) | ||
723 | end | ||
724 | end | ||
731 | 725 | ||
732 | cfg.http_proxy = os.getenv("http_proxy") | 726 | function cfg.init_package_paths() |
733 | cfg.https_proxy = os.getenv("https_proxy") | 727 | local lr_path, lr_cpath, lr_bin = cfg.package_paths() |
734 | cfg.no_proxy = os.getenv("no_proxy") | 728 | package.path = util.cleanup_path(package.path .. ";" .. lr_path, ";", lua_version) |
729 | package.cpath = util.cleanup_path(package.cpath .. ";" .. lr_cpath, ";", lua_version) | ||
730 | end | ||
735 | 731 | ||
736 | --- Check if platform was detected | 732 | --- Check if platform was detected |
737 | -- @param query string: The platform name to check. | 733 | -- @param name string: The platform name to check. |
738 | -- @return boolean: true if LuaRocks is currently running on queried platform. | 734 | -- @return boolean: true if LuaRocks is currently running on queried platform. |
739 | function cfg.is_platform(query) | 735 | function cfg.is_platform(name) |
740 | assert(type(query) == "string") | 736 | assert(type(name) == "string") |
737 | return platforms[name] | ||
738 | end | ||
741 | 739 | ||
742 | for _, platform in ipairs(cfg.platforms) do | 740 | function cfg.each_platform() |
743 | if platform == query then | 741 | local i = 0 |
744 | return true | 742 | return function() |
743 | local p | ||
744 | repeat | ||
745 | i = i + 1 | ||
746 | p = platform_order[i] | ||
747 | until (not p) or platforms[p] | ||
748 | return p | ||
745 | end | 749 | end |
746 | end | 750 | end |
747 | end | ||
748 | 751 | ||
749 | function cfg.each_platform() | 752 | function cfg.print_platforms() |
750 | local i = 0 | 753 | return table.concat(platforms, ", ") |
751 | return function() | ||
752 | i = i + 1 | ||
753 | return cfg.platforms[i] | ||
754 | end | 754 | end |
755 | |||
756 | return true | ||
755 | end | 757 | end |
756 | 758 | ||
757 | return cfg | 759 | return cfg |
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua index bcd6ccf5..3217a18f 100644 --- a/src/luarocks/deps.lua +++ b/src/luarocks/deps.lua | |||
@@ -187,30 +187,24 @@ end | |||
187 | -- nil and an error message if any test failed, followed by an optional | 187 | -- nil and an error message if any test failed, followed by an optional |
188 | -- error code. | 188 | -- error code. |
189 | function deps.fulfill_dependencies(rockspec, depskey, deps_mode) | 189 | function deps.fulfill_dependencies(rockspec, depskey, deps_mode) |
190 | if rockspec.supported_platforms then | 190 | if rockspec.supported_platforms and next(rockspec.supported_platforms) then |
191 | if not deps.platforms_set then | 191 | local supported = false |
192 | deps.platforms_set = values_set(cfg.platforms) | ||
193 | end | ||
194 | local supported = nil | ||
195 | for _, plat in pairs(rockspec.supported_platforms) do | 192 | for _, plat in pairs(rockspec.supported_platforms) do |
196 | local neg | 193 | local neg |
197 | neg, plat = plat:match("^(!?)(.*)") | 194 | neg, plat = plat:match("^(!?)(.*)") |
198 | if neg == "!" then | 195 | if neg == "!" then |
199 | if deps.platforms_set[plat] then | 196 | if cfg.is_platform(plat) then |
200 | return nil, "This rockspec for "..rockspec.package.." does not support "..plat.." platforms." | 197 | return nil, "This rockspec for "..rockspec.package.." does not support "..plat.." platforms." |
201 | end | 198 | end |
202 | else | 199 | else |
203 | if deps.platforms_set[plat] then | 200 | if cfg.is_platform(plat) then |
204 | supported = true | 201 | supported = true |
205 | else | 202 | break |
206 | if supported == nil then | ||
207 | supported = false | ||
208 | end | ||
209 | end | 203 | end |
210 | end | 204 | end |
211 | end | 205 | end |
212 | if supported == false then | 206 | if supported == false then |
213 | local plats = table.concat(cfg.platforms, ", ") | 207 | local plats = cfg.print_platforms() |
214 | return nil, "This rockspec for "..rockspec.package.." does not support "..plats.." platforms." | 208 | return nil, "This rockspec for "..rockspec.package.." does not support "..plats.." platforms." |
215 | end | 209 | end |
216 | end | 210 | end |
diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua index b53ef8cc..88fc31d9 100644 --- a/src/luarocks/fs/lua.lua +++ b/src/luarocks/fs/lua.lua | |||
@@ -557,7 +557,7 @@ local redirect_protocols = { | |||
557 | local function request(url, method, http, loop_control) | 557 | local function request(url, method, http, loop_control) |
558 | local result = {} | 558 | local result = {} |
559 | 559 | ||
560 | local proxy = cfg.http_proxy | 560 | local proxy = os.getenv("http_proxy") |
561 | if type(proxy) ~= "string" then proxy = nil end | 561 | if type(proxy) ~= "string" then proxy = nil end |
562 | -- LuaSocket's http.request crashes when given URLs missing the scheme part. | 562 | -- LuaSocket's http.request crashes when given URLs missing the scheme part. |
563 | if proxy and not proxy:find("://") then | 563 | if proxy and not proxy:find("://") then |
@@ -691,7 +691,7 @@ function fs_lua.download(url, filename, cache) | |||
691 | filename = fs.absolute_name(filename or dir.base_name(url)) | 691 | filename = fs.absolute_name(filename or dir.base_name(url)) |
692 | 692 | ||
693 | -- delegate to the configured downloader so we don't have to deal with whitelists | 693 | -- delegate to the configured downloader so we don't have to deal with whitelists |
694 | if cfg.no_proxy then | 694 | if os.getenv("no_proxy") then |
695 | return fs.use_downloader(url, filename, cache) | 695 | return fs.use_downloader(url, filename, cache) |
696 | end | 696 | end |
697 | 697 | ||
@@ -702,7 +702,7 @@ function fs_lua.download(url, filename, cache) | |||
702 | ok, err = ftp_request(url, filename) | 702 | ok, err = ftp_request(url, filename) |
703 | elseif util.starts_with(url, "https:") then | 703 | elseif util.starts_with(url, "https:") then |
704 | -- skip LuaSec when proxy is enabled since it is not supported | 704 | -- skip LuaSec when proxy is enabled since it is not supported |
705 | if luasec_ok and not cfg.https_proxy then | 705 | if luasec_ok and not os.getenv("https_proxy") then |
706 | ok, err = http_request(url, filename, https, cache) | 706 | ok, err = http_request(url, filename, https, cache) |
707 | else | 707 | else |
708 | https_err = true | 708 | https_err = true |
@@ -919,7 +919,7 @@ function fs_lua.is_lua(filename) | |||
919 | filename = filename:gsub([[%\]],"/") -- normalize on fw slash to prevent escaping issues | 919 | filename = filename:gsub([[%\]],"/") -- normalize on fw slash to prevent escaping issues |
920 | local lua = fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)) -- get lua interpreter configured | 920 | local lua = fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)) -- get lua interpreter configured |
921 | -- execute on configured interpreter, might not be the same as the interpreter LR is run on | 921 | -- execute on configured interpreter, might not be the same as the interpreter LR is run on |
922 | local result = fs.execute_string(lua..[[ -e "if loadfile(']]..filename..[[') then os.exit() else os.exit(1) end"]]) | 922 | local result = fs.execute_string(lua..[[ -e "if loadfile(']]..filename..[[') then os.exit(0) else os.exit(1) end"]]) |
923 | return (result == true) | 923 | return (result == true) |
924 | end | 924 | end |
925 | 925 | ||
diff --git a/src/luarocks/loader.lua b/src/luarocks/loader.lua index 078e4068..537adf94 100644 --- a/src/luarocks/loader.lua +++ b/src/luarocks/loader.lua | |||
@@ -16,7 +16,10 @@ local is_clean = not package.loaded["luarocks.core.cfg"] | |||
16 | 16 | ||
17 | -- This loader module depends only on core modules. | 17 | -- This loader module depends only on core modules. |
18 | local cfg = require("luarocks.core.cfg") | 18 | local cfg = require("luarocks.core.cfg") |
19 | cfg.init_package_paths() | 19 | local cfg_ok, err = cfg.init() |
20 | if cfg_ok then | ||
21 | cfg.init_package_paths() | ||
22 | end | ||
20 | 23 | ||
21 | local path = require("luarocks.core.path") | 24 | local path = require("luarocks.core.path") |
22 | local manif = require("luarocks.core.manif") | 25 | local manif = require("luarocks.core.manif") |
diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index 5a111dbb..fd2b7b42 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua | |||
@@ -115,6 +115,7 @@ local supported_flags = { | |||
115 | ["lr-bin"] = true, | 115 | ["lr-bin"] = true, |
116 | ["lr-cpath"] = true, | 116 | ["lr-cpath"] = true, |
117 | ["lr-path"] = true, | 117 | ["lr-path"] = true, |
118 | ["lua-dir"] = "<path>", | ||
118 | ["lua-version"] = "<vers>", | 119 | ["lua-version"] = "<vers>", |
119 | ["lua-ver"] = true, | 120 | ["lua-ver"] = true, |
120 | ["lua-incdir"] = true, | 121 | ["lua-incdir"] = true, |