aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorV1K1NGbg <victor@ilchev.com>2024-08-15 14:57:17 +0300
committerV1K1NGbg <victor@ilchev.com>2024-08-15 14:57:17 +0300
commited3cc55fd5de00ce71cb6b77325ac48a63b6f577 (patch)
treefa8ff9f8c0abca41ab1f13d2a0a3d7bc7da9e502
parent23743dddc7619e728b47e6c765006d0da2a3aa16 (diff)
downloadluarocks-ed3cc55fd5de00ce71cb6b77325ac48a63b6f577.tar.gz
luarocks-ed3cc55fd5de00ce71cb6b77325ac48a63b6f577.tar.bz2
luarocks-ed3cc55fd5de00ce71cb6b77325ac48a63b6f577.zip
sanity check 2
-rw-r--r--src/luarocks/build/builtin-incomplete.lua (renamed from src/luarocks/build/builtin-original.lua)182
-rw-r--r--src/luarocks/build/builtin.lua184
2 files changed, 183 insertions, 183 deletions
diff --git a/src/luarocks/build/builtin-original.lua b/src/luarocks/build/builtin-incomplete.lua
index 4c15d2bf..76b50d9f 100644
--- a/src/luarocks/build/builtin-original.lua
+++ b/src/luarocks/build/builtin-incomplete.lua
@@ -1,13 +1,24 @@
1local _tl_compat; if (tonumber((_VERSION or ''):match('[%d.]*$')) or 0) < 5.3 then local p, m = pcall(require, 'compat53.module'); if p then _tl_compat = m end end; local io = _tl_compat and _tl_compat.io or io; local ipairs = _tl_compat and _tl_compat.ipairs or ipairs; local os = _tl_compat and _tl_compat.os or os; local package = _tl_compat and _tl_compat.package or package; local pairs = _tl_compat and _tl_compat.pairs or pairs; local string = _tl_compat and _tl_compat.string or string; local table = _tl_compat and _tl_compat.table or table; local _tl_table_unpack = unpack or table.unpack
1 2
2--- A builtin build system: back-end to provide a portable way of building C-based Lua modules.
3local builtin = {} 3local builtin = {}
4 4
5-- This build driver checks LUA_INCDIR and LUA_LIBDIR on demand, 5
6-- so that pure-Lua rocks don't need to have development headers 6
7-- installed. 7
8
9
10
11
12
13
14
15
16
17
18
19
8builtin.skip_lua_inc_lib_check = true 20builtin.skip_lua_inc_lib_check = true
9 21
10local unpack = unpack or table.unpack
11local dir_sep = package.config:sub(1, 1) 22local dir_sep = package.config:sub(1, 1)
12 23
13local fs = require("luarocks.fs") 24local fs = require("luarocks.fs")
@@ -57,7 +68,7 @@ do
57 local copy_directories 68 local copy_directories
58 69
59 local prefix = "" 70 local prefix = ""
60 for _, parent in ipairs({"src", "lua", "lib"}) do 71 for _, parent in ipairs({ "src", "lua", "lib" }) do
61 if fs.is_dir(parent) then 72 if fs.is_dir(parent) then
62 fs.change_dir(parent) 73 fs.change_dir(parent)
63 prefix = parent .. dir_sep 74 prefix = parent .. dir_sep
@@ -67,16 +78,16 @@ do
67 78
68 for _, file in ipairs(fs.find()) do 79 for _, file in ipairs(fs.find()) do
69 local base = file:match("^([^\\/]*)") 80 local base = file:match("^([^\\/]*)")
70 if not skiplist[base] then 81 if not (skiplist)[base] then
71 local luamod = file:match("(.*)%.lua$") 82 local luamod = file:match("(.*)%.lua$")
72 if luamod then 83 if luamod then
73 modules[path.path_to_module(file)] = prefix .. file 84 modules[path.path_to_module(file)] = prefix .. file
74 else 85 else
75 local cmod = file:match("(.*)%.c$") 86 local cmod = file:match("(.*)%.c$")
76 if cmod then 87 if cmod then
77 local modname = get_cmod_name(file) or path.path_to_module(file:gsub("%.c$", ".lua")) 88 local modname = get_cmod_name(file) or path.path_to_module((file:gsub("%.c$", ".lua")))
78 modules[modname] = { 89 modules[modname] = {
79 sources = prefix..file, 90 sources = prefix .. file,
80 libraries = libs, 91 libraries = libs,
81 incdirs = incdirs, 92 incdirs = incdirs,
82 libdirs = libdirs, 93 libdirs = libdirs,
@@ -90,8 +101,8 @@ do
90 fs.pop_dir() 101 fs.pop_dir()
91 end 102 end
92 103
93 local bindir = (fs.is_dir(dir.path("src", "bin")) and dir.path("src", "bin")) 104 local bindir = (fs.is_dir(dir.path("src", "bin")) and dir.path("src", "bin")) or
94 or (fs.is_dir("bin") and "bin") 105 (fs.is_dir("bin") and "bin")
95 if bindir then 106 if bindir then
96 install = { bin = {} } 107 install = { bin = {} }
97 for _, file in ipairs(fs.list_dir(bindir)) do 108 for _, file in ipairs(fs.list_dir(bindir)) do
@@ -112,33 +123,34 @@ do
112 end 123 end
113end 124end
114 125
115--- Run a command displaying its execution on standard output. 126
116-- @return boolean: true if command succeeds (status code 0), false 127
117-- otherwise. 128
118local function execute(...) 129local function execute(...)
119 io.stdout:write(table.concat({...}, " ").."\n") 130 io.stdout:write(table.concat({ ... }, " ") .. "\n")
120 return fs.execute(...) 131 return fs.execute(...)
121end 132end
122 133
123--- Driver function for the builtin build back-end. 134
124-- @param rockspec table: the loaded rockspec. 135
125-- @return boolean or (nil, string): true if no errors occurred, 136
126-- nil and an error message otherwise. 137
127function builtin.run(rockspec, no_install) 138function builtin.run(rockspec, no_install)
128 assert(rockspec:type() == "rockspec") 139 local compile_object
129 local compile_object, compile_library, compile_static_library 140 local compile_library
141 local compile_static_library
130 142
131 local build = rockspec.build 143 local build = rockspec.build
132 local variables = rockspec.variables 144 local variables = rockspec.variables
133 local checked_lua_h = false 145 local checked_lua_h = false
134 146
135 for _, var in ipairs{ "CC", "CFLAGS", "LDFLAGS" } do 147 for _, var in ipairs({ "CC", "CFLAGS", "LDFLAGS" }) do
136 variables[var] = variables[var] or os.getenv(var) or "" 148 variables[var] = variables[var] or os.getenv(var) or ""
137 end 149 end
138 150
139 local function add_flags(extras, flag, flags) 151 local function add_flags(extras, flag, flags)
140 if flags then 152 if flags then
141 if type(flags) ~= "table" then 153 if not (type(flags) == "table") then
142 flags = { tostring(flags) } 154 flags = { tostring(flags) }
143 end 155 end
144 util.variable_substitutions(flags, variables) 156 util.variable_substitutions(flags, variables)
@@ -153,43 +165,43 @@ function builtin.run(rockspec, no_install)
153 local extras = {} 165 local extras = {}
154 add_flags(extras, "-D%s", defines) 166 add_flags(extras, "-D%s", defines)
155 add_flags(extras, "-I%s", incdirs) 167 add_flags(extras, "-I%s", incdirs)
156 return execute(variables.CC.." "..variables.CFLAGS, "-c", "-o", object, "-I"..variables.LUA_INCDIR, source, unpack(extras)) 168 return execute(variables.CC .. " " .. variables.CFLAGS, "-c", "-o", object, "-I" .. variables.LUA_INCDIR, source, _tl_table_unpack(extras))
157 end 169 end
158 compile_library = function(library, objects, libraries, libdirs, name) 170 compile_library = function(library, objects, libraries, libdirs, name)
159 local extras = { unpack(objects) } 171 local extras = { _tl_table_unpack(objects) }
160 add_flags(extras, "-L%s", libdirs) 172 add_flags(extras, "-L%s", libdirs)
161 add_flags(extras, "-l%s", libraries) 173 add_flags(extras, "-l%s", libraries)
162 extras[#extras+1] = dir.path(variables.LUA_LIBDIR, variables.LUALIB) 174 extras[#extras + 1] = dir.path(variables.LUA_LIBDIR, variables.LUALIB)
163 175
164 if variables.CC == "clang" or variables.CC == "clang-cl" then 176 if variables.CC == "clang" or variables.CC == "clang-cl" then
165 local exported_name = name:gsub("%.", "_") 177 local exported_name = name:gsub("%.", "_")
166 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name 178 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name
167 extras[#extras+1] = string.format("-Wl,-export:luaopen_%s", exported_name) 179 extras[#extras + 1] = string.format("-Wl,-export:luaopen_%s", exported_name)
168 else 180 else
169 extras[#extras+1] = "-l" .. (variables.MSVCRT or "m") 181 extras[#extras + 1] = "-l" .. (variables.MSVCRT or "m")
170 end 182 end
171 183
172 local ok = execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras)) 184 local ok = execute(variables.LD .. " " .. variables.LDFLAGS .. " " .. variables.LIBFLAG, "-o", library, _tl_table_unpack(extras))
173 return ok
174 end
175 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format.
176 compile_static_library = function(library, objects, libraries, libdirs, name)
177 local ok = execute(variables.AR, "rc", library, unpack(objects))
178 if ok then
179 ok = execute(variables.RANLIB, library)
180 end
181 return ok 185 return ok
182 end 186 end
183 ]] 187
188
189
190
191
192
193
194
195
184 elseif cfg.is_platform("win32") then 196 elseif cfg.is_platform("win32") then
185 compile_object = function(object, source, defines, incdirs) 197 compile_object = function(object, source, defines, incdirs)
186 local extras = {} 198 local extras = {}
187 add_flags(extras, "-D%s", defines) 199 add_flags(extras, "-D%s", defines)
188 add_flags(extras, "-I%s", incdirs) 200 add_flags(extras, "-I%s", incdirs)
189 return execute(variables.CC.." "..variables.CFLAGS, "-c", "-Fo"..object, "-I"..variables.LUA_INCDIR, source, unpack(extras)) 201 return execute(variables.CC .. " " .. variables.CFLAGS, "-c", "-Fo" .. object, "-I" .. variables.LUA_INCDIR, source, _tl_table_unpack(extras))
190 end 202 end
191 compile_library = function(library, objects, libraries, libdirs, name) 203 compile_library = function(library, objects, libraries, libdirs, name)
192 local extras = { unpack(objects) } 204 local extras = { _tl_table_unpack(objects) }
193 add_flags(extras, "-libpath:%s", libdirs) 205 add_flags(extras, "-libpath:%s", libdirs)
194 add_flags(extras, "%s.lib", libraries) 206 add_flags(extras, "%s.lib", libraries)
195 local basename = dir.base_name(library):gsub(".[^.]*$", "") 207 local basename = dir.base_name(library):gsub(".[^.]*$", "")
@@ -198,49 +210,49 @@ function builtin.run(rockspec, no_install)
198 local exported_name = name:gsub("%.", "_") 210 local exported_name = name:gsub("%.", "_")
199 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name 211 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name
200 def:write("EXPORTS\n") 212 def:write("EXPORTS\n")
201 def:write("luaopen_"..exported_name.."\n") 213 def:write("luaopen_" .. exported_name .. "\n")
202 def:close() 214 def:close()
203 local ok = execute(variables.LD, "-dll", "-def:"..deffile, "-out:"..library, dir.path(variables.LUA_LIBDIR, variables.LUALIB), unpack(extras)) 215 local ok = execute(variables.LD, "-dll", "-def:" .. deffile, "-out:" .. library, dir.path(variables.LUA_LIBDIR, variables.LUALIB), _tl_table_unpack(extras))
204 local basedir = "" 216 local basedir = ""
205 if name:find("%.") ~= nil then 217 if name:find("%.") ~= nil then
206 basedir = name:gsub("%.%w+$", "\\") 218 basedir = name:gsub("%.%w+$", "\\")
207 basedir = basedir:gsub("%.", "\\") 219 basedir = basedir:gsub("%.", "\\")
208 end 220 end
209 local manifestfile = basedir .. basename..".dll.manifest" 221 local manifestfile = basedir .. basename .. ".dll.manifest"
210 222
211 if ok and fs.exists(manifestfile) then 223 if ok and fs.exists(manifestfile) then
212 ok = execute(variables.MT, "-manifest", manifestfile, "-outputresource:"..basedir..basename..".dll;2") 224 ok = execute(variables.MT, "-manifest", manifestfile, "-outputresource:" .. basedir .. basename .. ".dll;2")
213 end 225 end
214 return ok 226 return ok
215 end 227 end
216 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. 228
217 compile_static_library = function(library, objects, libraries, libdirs, name) 229
218 local ok = execute(variables.AR, "-out:"..library, unpack(objects)) 230
219 return ok 231
220 end 232
221 ]] 233
222 else 234 else
223 compile_object = function(object, source, defines, incdirs) 235 compile_object = function(object, source, defines, incdirs)
224 local extras = {} 236 local extras = {}
225 add_flags(extras, "-D%s", defines) 237 add_flags(extras, "-D%s", defines)
226 add_flags(extras, "-I%s", incdirs) 238 add_flags(extras, "-I%s", incdirs)
227 return execute(variables.CC.." "..variables.CFLAGS, "-I"..variables.LUA_INCDIR, "-c", source, "-o", object, unpack(extras)) 239 return execute(variables.CC .. " " .. variables.CFLAGS, "-I" .. variables.LUA_INCDIR, "-c", source, "-o", object, _tl_table_unpack(extras))
228 end 240 end
229 compile_library = function (library, objects, libraries, libdirs) 241 compile_library = function(library, objects, libraries, libdirs)
230 local extras = { unpack(objects) } 242 local extras = { _tl_table_unpack(objects) }
231 add_flags(extras, "-L%s", libdirs) 243 add_flags(extras, "-L%s", libdirs)
232 if cfg.gcc_rpath then 244 if cfg.gcc_rpath then
233 add_flags(extras, "-Wl,-rpath,%s", libdirs) 245 add_flags(extras, "-Wl,-rpath,%s", libdirs)
234 end 246 end
235 add_flags(extras, "-l%s", libraries) 247 add_flags(extras, "-l%s", libraries)
236 if cfg.link_lua_explicitly then 248 if cfg.link_lua_explicitly then
237 extras[#extras+1] = "-L"..variables.LUA_LIBDIR 249 extras[#extras + 1] = "-L" .. variables.LUA_LIBDIR
238 extras[#extras+1] = "-llua" 250 extras[#extras + 1] = "-llua"
239 end 251 end
240 return execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras)) 252 return execute(variables.LD .. " " .. variables.LDFLAGS .. " " .. variables.LIBFLAG, "-o", library, _tl_table_unpack(extras))
241 end 253 end
242 compile_static_library = function(library, objects, libraries, libdirs, name) -- luacheck: ignore 211 254 compile_static_library = function(library, objects, libraries, libdirs, name)
243 local ok = execute(variables.AR, "rc", library, unpack(objects)) 255 local ok = execute(variables.AR, "rc", library, _tl_table_unpack(objects))
244 if ok then 256 if ok then
245 ok = execute(variables.RANLIB, library) 257 ok = execute(variables.RANLIB, library)
246 end 258 end
@@ -285,15 +297,15 @@ function builtin.run(rockspec, no_install)
285 if ext == "lua" then 297 if ext == "lua" then
286 local filename = dir.base_name(info) 298 local filename = dir.base_name(info)
287 if filename == "init.lua" and not name:match("%.init$") then 299 if filename == "init.lua" and not name:match("%.init$") then
288 moddir = path.module_to_path(name..".init") 300 moddir = path.module_to_path(name .. ".init")
289 else 301 else
290 local basename = name:match("([^.]+)$") 302 local basename = name:match("([^.]+)$")
291 filename = basename..".lua" 303 filename = basename .. ".lua"
292 end 304 end
293 local dest = dir.path(luadir, moddir, filename) 305 local dest = dir.path(luadir, moddir, filename)
294 lua_modules[info] = dest 306 lua_modules[info] = dest
295 else 307 else
296 info = {info} 308 info = { info }
297 end 309 end
298 end 310 end
299 if type(info) == "table" then 311 if type(info) == "table" then
@@ -314,21 +326,21 @@ function builtin.run(rockspec, no_install)
314 local objects = {} 326 local objects = {}
315 local sources = info.sources 327 local sources = info.sources
316 if info[1] then sources = info end 328 if info[1] then sources = info end
317 if type(sources) == "string" then sources = {sources} end 329 if type(sources) == "string" then sources = { sources } end
318 if type(sources) ~= "table" then 330 if not (type(sources) == "table") then
319 return nil, "error in rockspec: module '" .. name .. "' entry has no 'sources' list" 331 return nil, "error in rockspec: module '" .. name .. "' entry has no 'sources' list"
320 end 332 end
321 for _, source in ipairs(sources) do 333 for _, source in ipairs(sources) do
322 if type(source) ~= "string" then 334 if not (type(source) == "string") then
323 return nil, "error in rockspec: module '" .. name .. "' does not specify source correctly." 335 return nil, "error in rockspec: module '" .. name .. "' does not specify source correctly."
324 end 336 end
325 local object = source:gsub("%.[^.]*$", "."..cfg.obj_extension) 337 local object = source:gsub("%.[^.]*$", "." .. cfg.obj_extension)
326 if not object then 338 if not object then
327 object = source.."."..cfg.obj_extension 339 object = source .. "." .. cfg.obj_extension
328 end 340 end
329 ok = compile_object(object, source, info.defines, info.incdirs or autoincdirs) 341 ok = compile_object(object, source, info.defines, info.incdirs or autoincdirs)
330 if not ok then 342 if not ok then
331 return nil, "Failed compiling object "..object 343 return nil, "Failed compiling object " .. object
332 end 344 end
333 table.insert(objects, object) 345 table.insert(objects, object)
334 end 346 end
@@ -338,7 +350,7 @@ function builtin.run(rockspec, no_install)
338 util.schedule_function(fs.delete, compile_temp_dir) 350 util.schedule_function(fs.delete, compile_temp_dir)
339 end 351 end
340 352
341 local module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension) 353 local module_name = name:match("([^.]*)$") .. "." .. util.matchquote(cfg.lib_extension)
342 if moddir ~= "" then 354 if moddir ~= "" then
343 module_name = dir.path(moddir, module_name) 355 module_name = dir.path(moddir, module_name)
344 end 356 end
@@ -350,42 +362,42 @@ function builtin.run(rockspec, no_install)
350 lib_modules[build_name] = dir.path(libdir, module_name) 362 lib_modules[build_name] = dir.path(libdir, module_name)
351 ok = compile_library(build_name, objects, info.libraries, info.libdirs or autolibdirs, name) 363 ok = compile_library(build_name, objects, info.libraries, info.libdirs or autolibdirs, name)
352 if not ok then 364 if not ok then
353 return nil, "Failed compiling module "..module_name 365 return nil, "Failed compiling module " .. module_name
354 end 366 end
355 367
356 -- for backwards compatibility, try keeping a copy of the module 368
357 -- in the old location (luasec-1.3.2-1 rockspec breaks otherwise) 369
358 if cached_make_dir(dir.dir_name(module_name)) then 370 if cached_make_dir(dir.dir_name(module_name)) then
359 fs.copy(build_name, module_name) 371 fs.copy(build_name, module_name)
360 end 372 end
361 373
362 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format. 374
363 module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.static_lib_extension) 375
364 if moddir ~= "" then 376
365 module_name = dir.path(moddir, module_name) 377
366 end 378
367 lib_modules[module_name] = dir.path(libdir, module_name) 379
368 ok = compile_static_library(module_name, objects, info.libraries, info.libdirs, name) 380
369 if not ok then 381
370 return nil, "Failed compiling static library "..module_name 382
371 end 383
372 ]] 384
373 end 385 end
374 end 386 end
375 if not no_install then 387 if not no_install then
376 for _, mods in ipairs({{ tbl = lua_modules, perms = "read" }, { tbl = lib_modules, perms = "exec" }}) do 388 for _, mods in ipairs({ { tbl = lua_modules, perms = "read" }, { tbl = lib_modules, perms = "exec" } }) do
377 for name, dest in pairs(mods.tbl) do 389 for name, dest in pairs(mods.tbl) do
378 cached_make_dir(dir.dir_name(dest)) 390 cached_make_dir(dir.dir_name(dest))
379 ok, err = fs.copy(name, dest, mods.perms) 391 ok, err = fs.copy(name, dest, mods.perms)
380 if not ok then 392 if not ok then
381 return nil, "Failed installing "..name.." in "..dest..": "..err 393 return nil, "Failed installing " .. name .. " in " .. dest .. ": " .. err
382 end 394 end
383 end 395 end
384 end 396 end
385 if fs.is_dir("lua") then 397 if fs.is_dir("lua") then
386 ok, err = fs.copy_contents("lua", luadir) 398 ok, err = fs.copy_contents("lua", luadir)
387 if not ok then 399 if not ok then
388 return nil, "Failed copying contents of 'lua' directory: "..err 400 return nil, "Failed copying contents of 'lua' directory: " .. err
389 end 401 end
390 end 402 end
391 end 403 end
diff --git a/src/luarocks/build/builtin.lua b/src/luarocks/build/builtin.lua
index 76b50d9f..14d13eb4 100644
--- a/src/luarocks/build/builtin.lua
+++ b/src/luarocks/build/builtin.lua
@@ -1,24 +1,13 @@
1local _tl_compat; if (tonumber((_VERSION or ''):match('[%d.]*$')) or 0) < 5.3 then local p, m = pcall(require, 'compat53.module'); if p then _tl_compat = m end end; local io = _tl_compat and _tl_compat.io or io; local ipairs = _tl_compat and _tl_compat.ipairs or ipairs; local os = _tl_compat and _tl_compat.os or os; local package = _tl_compat and _tl_compat.package or package; local pairs = _tl_compat and _tl_compat.pairs or pairs; local string = _tl_compat and _tl_compat.string or string; local table = _tl_compat and _tl_compat.table or table; local _tl_table_unpack = unpack or table.unpack
2 1
2--- A builtin build system: back-end to provide a portable way of building C-based Lua modules.
3local builtin = {} 3local builtin = {}
4 4
5 5-- This build driver checks LUA_INCDIR and LUA_LIBDIR on demand,
6 6-- so that pure-Lua rocks don't need to have development headers
7 7-- installed.
8
9
10
11
12
13
14
15
16
17
18
19
20builtin.skip_lua_inc_lib_check = true 8builtin.skip_lua_inc_lib_check = true
21 9
10local unpack = unpack or table.unpack
22local dir_sep = package.config:sub(1, 1) 11local dir_sep = package.config:sub(1, 1)
23 12
24local fs = require("luarocks.fs") 13local fs = require("luarocks.fs")
@@ -68,7 +57,7 @@ do
68 local copy_directories 57 local copy_directories
69 58
70 local prefix = "" 59 local prefix = ""
71 for _, parent in ipairs({ "src", "lua", "lib" }) do 60 for _, parent in ipairs({"src", "lua", "lib"}) do
72 if fs.is_dir(parent) then 61 if fs.is_dir(parent) then
73 fs.change_dir(parent) 62 fs.change_dir(parent)
74 prefix = parent .. dir_sep 63 prefix = parent .. dir_sep
@@ -78,16 +67,16 @@ do
78 67
79 for _, file in ipairs(fs.find()) do 68 for _, file in ipairs(fs.find()) do
80 local base = file:match("^([^\\/]*)") 69 local base = file:match("^([^\\/]*)")
81 if not (skiplist)[base] then 70 if not skiplist[base] then
82 local luamod = file:match("(.*)%.lua$") 71 local luamod = file:match("(.*)%.lua$")
83 if luamod then 72 if luamod then
84 modules[path.path_to_module(file)] = prefix .. file 73 modules[path.path_to_module(file)] = prefix .. file
85 else 74 else
86 local cmod = file:match("(.*)%.c$") 75 local cmod = file:match("(.*)%.c$")
87 if cmod then 76 if cmod then
88 local modname = get_cmod_name(file) or path.path_to_module((file:gsub("%.c$", ".lua"))) 77 local modname = get_cmod_name(file) or path.path_to_module(file:gsub("%.c$", ".lua"))
89 modules[modname] = { 78 modules[modname] = {
90 sources = prefix .. file, 79 sources = prefix..file,
91 libraries = libs, 80 libraries = libs,
92 incdirs = incdirs, 81 incdirs = incdirs,
93 libdirs = libdirs, 82 libdirs = libdirs,
@@ -101,8 +90,8 @@ do
101 fs.pop_dir() 90 fs.pop_dir()
102 end 91 end
103 92
104 local bindir = (fs.is_dir(dir.path("src", "bin")) and dir.path("src", "bin")) or 93 local bindir = (fs.is_dir(dir.path("src", "bin")) and dir.path("src", "bin"))
105 (fs.is_dir("bin") and "bin") 94 or (fs.is_dir("bin") and "bin")
106 if bindir then 95 if bindir then
107 install = { bin = {} } 96 install = { bin = {} }
108 for _, file in ipairs(fs.list_dir(bindir)) do 97 for _, file in ipairs(fs.list_dir(bindir)) do
@@ -123,34 +112,33 @@ do
123 end 112 end
124end 113end
125 114
126 115--- Run a command displaying its execution on standard output.
127 116-- @return boolean: true if command succeeds (status code 0), false
128 117-- otherwise.
129local function execute(...) 118local function execute(...)
130 io.stdout:write(table.concat({ ... }, " ") .. "\n") 119 io.stdout:write(table.concat({...}, " ").."\n")
131 return fs.execute(...) 120 return fs.execute(...)
132end 121end
133 122
134 123--- Driver function for the builtin build back-end.
135 124-- @param rockspec table: the loaded rockspec.
136 125-- @return boolean or (nil, string): true if no errors occurred,
137 126-- nil and an error message otherwise.
138function builtin.run(rockspec, no_install) 127function builtin.run(rockspec, no_install)
139 local compile_object 128 assert(rockspec:type() == "rockspec")
140 local compile_library 129 local compile_object, compile_library, compile_static_library
141 local compile_static_library
142 130
143 local build = rockspec.build 131 local build = rockspec.build
144 local variables = rockspec.variables 132 local variables = rockspec.variables
145 local checked_lua_h = false 133 local checked_lua_h = false
146 134
147 for _, var in ipairs({ "CC", "CFLAGS", "LDFLAGS" }) do 135 for _, var in ipairs{ "CC", "CFLAGS", "LDFLAGS" } do
148 variables[var] = variables[var] or os.getenv(var) or "" 136 variables[var] = variables[var] or os.getenv(var) or ""
149 end 137 end
150 138
151 local function add_flags(extras, flag, flags) 139 local function add_flags(extras, flag, flags)
152 if flags then 140 if flags then
153 if not (type(flags) == "table") then 141 if type(flags) ~= "table" then
154 flags = { tostring(flags) } 142 flags = { tostring(flags) }
155 end 143 end
156 util.variable_substitutions(flags, variables) 144 util.variable_substitutions(flags, variables)
@@ -165,43 +153,43 @@ function builtin.run(rockspec, no_install)
165 local extras = {} 153 local extras = {}
166 add_flags(extras, "-D%s", defines) 154 add_flags(extras, "-D%s", defines)
167 add_flags(extras, "-I%s", incdirs) 155 add_flags(extras, "-I%s", incdirs)
168 return execute(variables.CC .. " " .. variables.CFLAGS, "-c", "-o", object, "-I" .. variables.LUA_INCDIR, source, _tl_table_unpack(extras)) 156 return execute(variables.CC.." "..variables.CFLAGS, "-c", "-o", object, "-I"..variables.LUA_INCDIR, source, unpack(extras))
169 end 157 end
170 compile_library = function(library, objects, libraries, libdirs, name) 158 compile_library = function(library, objects, libraries, libdirs, name)
171 local extras = { _tl_table_unpack(objects) } 159 local extras = { unpack(objects) }
172 add_flags(extras, "-L%s", libdirs) 160 add_flags(extras, "-L%s", libdirs)
173 add_flags(extras, "-l%s", libraries) 161 add_flags(extras, "-l%s", libraries)
174 extras[#extras + 1] = dir.path(variables.LUA_LIBDIR, variables.LUALIB) 162 extras[#extras+1] = dir.path(variables.LUA_LIBDIR, variables.LUALIB)
175 163
176 if variables.CC == "clang" or variables.CC == "clang-cl" then 164 if variables.CC == "clang" or variables.CC == "clang-cl" then
177 local exported_name = name:gsub("%.", "_") 165 local exported_name = name:gsub("%.", "_")
178 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name 166 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name
179 extras[#extras + 1] = string.format("-Wl,-export:luaopen_%s", exported_name) 167 extras[#extras+1] = string.format("-Wl,-export:luaopen_%s", exported_name)
180 else 168 else
181 extras[#extras + 1] = "-l" .. (variables.MSVCRT or "m") 169 extras[#extras+1] = "-l" .. (variables.MSVCRT or "m")
182 end 170 end
183 171
184 local ok = execute(variables.LD .. " " .. variables.LDFLAGS .. " " .. variables.LIBFLAG, "-o", library, _tl_table_unpack(extras)) 172 local ok = execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras))
185 return ok 173 return ok
186 end 174 end
187 175 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format.
188 176 compile_static_library = function(library, objects, libraries, libdirs, name)
189 177 local ok = execute(variables.AR, "rc", library, unpack(objects))
190 178 if ok then
191 179 ok = execute(variables.RANLIB, library)
192 180 end
193 181 return ok
194 182 end
195 183 ]]
196 elseif cfg.is_platform("win32") then 184 elseif cfg.is_platform("win32") then
197 compile_object = function(object, source, defines, incdirs) 185 compile_object = function(object, source, defines, incdirs)
198 local extras = {} 186 local extras = {}
199 add_flags(extras, "-D%s", defines) 187 add_flags(extras, "-D%s", defines)
200 add_flags(extras, "-I%s", incdirs) 188 add_flags(extras, "-I%s", incdirs)
201 return execute(variables.CC .. " " .. variables.CFLAGS, "-c", "-Fo" .. object, "-I" .. variables.LUA_INCDIR, source, _tl_table_unpack(extras)) 189 return execute(variables.CC.." "..variables.CFLAGS, "-c", "-Fo"..object, "-I"..variables.LUA_INCDIR, source, unpack(extras))
202 end 190 end
203 compile_library = function(library, objects, libraries, libdirs, name) 191 compile_library = function(library, objects, libraries, libdirs, name)
204 local extras = { _tl_table_unpack(objects) } 192 local extras = { unpack(objects) }
205 add_flags(extras, "-libpath:%s", libdirs) 193 add_flags(extras, "-libpath:%s", libdirs)
206 add_flags(extras, "%s.lib", libraries) 194 add_flags(extras, "%s.lib", libraries)
207 local basename = dir.base_name(library):gsub(".[^.]*$", "") 195 local basename = dir.base_name(library):gsub(".[^.]*$", "")
@@ -210,49 +198,49 @@ function builtin.run(rockspec, no_install)
210 local exported_name = name:gsub("%.", "_") 198 local exported_name = name:gsub("%.", "_")
211 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name 199 exported_name = exported_name:match('^[^%-]+%-(.+)$') or exported_name
212 def:write("EXPORTS\n") 200 def:write("EXPORTS\n")
213 def:write("luaopen_" .. exported_name .. "\n") 201 def:write("luaopen_"..exported_name.."\n")
214 def:close() 202 def:close()
215 local ok = execute(variables.LD, "-dll", "-def:" .. deffile, "-out:" .. library, dir.path(variables.LUA_LIBDIR, variables.LUALIB), _tl_table_unpack(extras)) 203 local ok = execute(variables.LD, "-dll", "-def:"..deffile, "-out:"..library, dir.path(variables.LUA_LIBDIR, variables.LUALIB), unpack(extras))
216 local basedir = "" 204 local basedir = ""
217 if name:find("%.") ~= nil then 205 if name:find("%.") ~= nil then
218 basedir = name:gsub("%.%w+$", "\\") 206 basedir = name:gsub("%.%w+$", "\\")
219 basedir = basedir:gsub("%.", "\\") 207 basedir = basedir:gsub("%.", "\\")
220 end 208 end
221 local manifestfile = basedir .. basename .. ".dll.manifest" 209 local manifestfile = basedir .. basename..".dll.manifest"
222 210
223 if ok and fs.exists(manifestfile) then 211 if ok and fs.exists(manifestfile) then
224 ok = execute(variables.MT, "-manifest", manifestfile, "-outputresource:" .. basedir .. basename .. ".dll;2") 212 ok = execute(variables.MT, "-manifest", manifestfile, "-outputresource:"..basedir..basename..".dll;2")
225 end 213 end
226 return ok 214 return ok
227 end 215 end
228 216 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format.
229 217 compile_static_library = function(library, objects, libraries, libdirs, name)
230 218 local ok = execute(variables.AR, "-out:"..library, unpack(objects))
231 219 return ok
232 220 end
233 221 ]]
234 else 222 else
235 compile_object = function(object, source, defines, incdirs) 223 compile_object = function(object, source, defines, incdirs)
236 local extras = {} 224 local extras = {}
237 add_flags(extras, "-D%s", defines) 225 add_flags(extras, "-D%s", defines)
238 add_flags(extras, "-I%s", incdirs) 226 add_flags(extras, "-I%s", incdirs)
239 return execute(variables.CC .. " " .. variables.CFLAGS, "-I" .. variables.LUA_INCDIR, "-c", source, "-o", object, _tl_table_unpack(extras)) 227 return execute(variables.CC.." "..variables.CFLAGS, "-I"..variables.LUA_INCDIR, "-c", source, "-o", object, unpack(extras))
240 end 228 end
241 compile_library = function(library, objects, libraries, libdirs) 229 compile_library = function (library, objects, libraries, libdirs)
242 local extras = { _tl_table_unpack(objects) } 230 local extras = { unpack(objects) }
243 add_flags(extras, "-L%s", libdirs) 231 add_flags(extras, "-L%s", libdirs)
244 if cfg.gcc_rpath then 232 if cfg.gcc_rpath then
245 add_flags(extras, "-Wl,-rpath,%s", libdirs) 233 add_flags(extras, "-Wl,-rpath,%s", libdirs)
246 end 234 end
247 add_flags(extras, "-l%s", libraries) 235 add_flags(extras, "-l%s", libraries)
248 if cfg.link_lua_explicitly then 236 if cfg.link_lua_explicitly then
249 extras[#extras + 1] = "-L" .. variables.LUA_LIBDIR 237 extras[#extras+1] = "-L"..variables.LUA_LIBDIR
250 extras[#extras + 1] = "-llua" 238 extras[#extras+1] = "-llua"
251 end 239 end
252 return execute(variables.LD .. " " .. variables.LDFLAGS .. " " .. variables.LIBFLAG, "-o", library, _tl_table_unpack(extras)) 240 return execute(variables.LD.." "..variables.LDFLAGS.." "..variables.LIBFLAG, "-o", library, unpack(extras))
253 end 241 end
254 compile_static_library = function(library, objects, libraries, libdirs, name) 242 compile_static_library = function(library, objects, libraries, libdirs, name) -- luacheck: ignore 211
255 local ok = execute(variables.AR, "rc", library, _tl_table_unpack(objects)) 243 local ok = execute(variables.AR, "rc", library, unpack(objects))
256 if ok then 244 if ok then
257 ok = execute(variables.RANLIB, library) 245 ok = execute(variables.RANLIB, library)
258 end 246 end
@@ -297,15 +285,15 @@ function builtin.run(rockspec, no_install)
297 if ext == "lua" then 285 if ext == "lua" then
298 local filename = dir.base_name(info) 286 local filename = dir.base_name(info)
299 if filename == "init.lua" and not name:match("%.init$") then 287 if filename == "init.lua" and not name:match("%.init$") then
300 moddir = path.module_to_path(name .. ".init") 288 moddir = path.module_to_path(name..".init")
301 else 289 else
302 local basename = name:match("([^.]+)$") 290 local basename = name:match("([^.]+)$")
303 filename = basename .. ".lua" 291 filename = basename..".lua"
304 end 292 end
305 local dest = dir.path(luadir, moddir, filename) 293 local dest = dir.path(luadir, moddir, filename)
306 lua_modules[info] = dest 294 lua_modules[info] = dest
307 else 295 else
308 info = { info } 296 info = {info}
309 end 297 end
310 end 298 end
311 if type(info) == "table" then 299 if type(info) == "table" then
@@ -326,21 +314,21 @@ function builtin.run(rockspec, no_install)
326 local objects = {} 314 local objects = {}
327 local sources = info.sources 315 local sources = info.sources
328 if info[1] then sources = info end 316 if info[1] then sources = info end
329 if type(sources) == "string" then sources = { sources } end 317 if type(sources) == "string" then sources = {sources} end
330 if not (type(sources) == "table") then 318 if type(sources) ~= "table" then
331 return nil, "error in rockspec: module '" .. name .. "' entry has no 'sources' list" 319 return nil, "error in rockspec: module '" .. name .. "' entry has no 'sources' list"
332 end 320 end
333 for _, source in ipairs(sources) do 321 for _, source in ipairs(sources) do
334 if not (type(source) == "string") then 322 if type(source) ~= "string" then
335 return nil, "error in rockspec: module '" .. name .. "' does not specify source correctly." 323 return nil, "error in rockspec: module '" .. name .. "' does not specify source correctly."
336 end 324 end
337 local object = source:gsub("%.[^.]*$", "." .. cfg.obj_extension) 325 local object = source:gsub("%.[^.]*$", "."..cfg.obj_extension)
338 if not object then 326 if not object then
339 object = source .. "." .. cfg.obj_extension 327 object = source.."."..cfg.obj_extension
340 end 328 end
341 ok = compile_object(object, source, info.defines, info.incdirs or autoincdirs) 329 ok = compile_object(object, source, info.defines, info.incdirs or autoincdirs)
342 if not ok then 330 if not ok then
343 return nil, "Failed compiling object " .. object 331 return nil, "Failed compiling object "..object
344 end 332 end
345 table.insert(objects, object) 333 table.insert(objects, object)
346 end 334 end
@@ -350,7 +338,7 @@ function builtin.run(rockspec, no_install)
350 util.schedule_function(fs.delete, compile_temp_dir) 338 util.schedule_function(fs.delete, compile_temp_dir)
351 end 339 end
352 340
353 local module_name = name:match("([^.]*)$") .. "." .. util.matchquote(cfg.lib_extension) 341 local module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension)
354 if moddir ~= "" then 342 if moddir ~= "" then
355 module_name = dir.path(moddir, module_name) 343 module_name = dir.path(moddir, module_name)
356 end 344 end
@@ -362,46 +350,46 @@ function builtin.run(rockspec, no_install)
362 lib_modules[build_name] = dir.path(libdir, module_name) 350 lib_modules[build_name] = dir.path(libdir, module_name)
363 ok = compile_library(build_name, objects, info.libraries, info.libdirs or autolibdirs, name) 351 ok = compile_library(build_name, objects, info.libraries, info.libdirs or autolibdirs, name)
364 if not ok then 352 if not ok then
365 return nil, "Failed compiling module " .. module_name 353 return nil, "Failed compiling module "..module_name
366 end 354 end
367 355
368 356 -- for backwards compatibility, try keeping a copy of the module
369 357 -- in the old location (luasec-1.3.2-1 rockspec breaks otherwise)
370 if cached_make_dir(dir.dir_name(module_name)) then 358 if cached_make_dir(dir.dir_name(module_name)) then
371 fs.copy(build_name, module_name) 359 fs.copy(build_name, module_name)
372 end 360 end
373 361
374 362 --[[ TODO disable static libs until we fix the conflict in the manifest, which will take extending the manifest format.
375 363 module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.static_lib_extension)
376 364 if moddir ~= "" then
377 365 module_name = dir.path(moddir, module_name)
378 366 end
379 367 lib_modules[module_name] = dir.path(libdir, module_name)
380 368 ok = compile_static_library(module_name, objects, info.libraries, info.libdirs, name)
381 369 if not ok then
382 370 return nil, "Failed compiling static library "..module_name
383 371 end
384 372 ]]
385 end 373 end
386 end 374 end
387 if not no_install then 375 if not no_install then
388 for _, mods in ipairs({ { tbl = lua_modules, perms = "read" }, { tbl = lib_modules, perms = "exec" } }) do 376 for _, mods in ipairs({{ tbl = lua_modules, perms = "read" }, { tbl = lib_modules, perms = "exec" }}) do
389 for name, dest in pairs(mods.tbl) do 377 for name, dest in pairs(mods.tbl) do
390 cached_make_dir(dir.dir_name(dest)) 378 cached_make_dir(dir.dir_name(dest))
391 ok, err = fs.copy(name, dest, mods.perms) 379 ok, err = fs.copy(name, dest, mods.perms)
392 if not ok then 380 if not ok then
393 return nil, "Failed installing " .. name .. " in " .. dest .. ": " .. err 381 return nil, "Failed installing "..name.." in "..dest..": "..err
394 end 382 end
395 end 383 end
396 end 384 end
397 if fs.is_dir("lua") then 385 if fs.is_dir("lua") then
398 ok, err = fs.copy_contents("lua", luadir) 386 ok, err = fs.copy_contents("lua", luadir)
399 if not ok then 387 if not ok then
400 return nil, "Failed copying contents of 'lua' directory: " .. err 388 return nil, "Failed copying contents of 'lua' directory: "..err
401 end 389 end
402 end 390 end
403 end 391 end
404 return true 392 return true
405end 393end
406 394
407return builtin 395return builtin \ No newline at end of file