tab.buildrc_file = string.format("buildrc")
tab.buildrc_noinit_file = string.format("buildrc-noinit")
tab.profile = string.format("/tmp/bashrc")
- tab.builtin_env = {
- E2_BUILD_NUMBER = res.buildno,
- E2_TMPDIR = res.build_config.Tc,
- E2_RESULT = r,
- E2_RELEASE_ID = info.project.release_id,
- E2_PROJECT_NAME = info.project.name,
- E2_BUILDID = buildid,
- T = res.build_config.Tc,
- r = r,
- R = r,
- }
+ tab.builtin_env = environment.new()
+ tab.builtin_env:set("E2_BUILD_NUMBER", res.buildno)
+ tab.builtin_env:set("E2_TMPDIR", res.build_config.Tc)
+ tab.builtin_env:set("E2_RESULT", r)
+ tab.builtin_env:set("E2_RELEASE_ID", info.project.release_id)
+ tab.builtin_env:set("E2_PROJECT_NAME", info.project.name)
+ tab.builtin_env:set("E2_BUILDID", buildid)
+ tab.builtin_env:set("T", res.build_config.Tc)
+ tab.builtin_env:set("r", r)
+ tab.builtin_env:set("R", r)
+ tab.env = environment.new()
+ tab.env:merge(info.global_env)
+ tab.env:merge(res.env, true)
e2lib.logf(4, "build config for result %s: ", r)
for k,v in pairs(tab) do
v = tostring(v)
local e = new_error("installing environment files failed")
-- install builtin environment variables
local file = string.format("%s/env/builtin", res.build_config.T)
- rc, re = write_environment_script(res.build_config.builtin_env, r, file)
+ rc, re = write_environment_script(res.build_config.builtin_env, file)
if not rc then
return false, e:cat(re)
end
res.build_config.Tc))
-- install project specific environment variables
local file = string.format("%s/env/env", res.build_config.T)
- rc, re = write_environment_script(info.env, r, file)
+ rc, re = write_environment_script(res.build_config.env, file)
if not rc then
return false, e:cat(re)
end
end
--- write the environment script for a result into a file
--- @param env table: the env table
--- @param r string: the result name
+-- @param env env object
-- @param file string: the target filename
-- @return bool
-- @return an error object on failure
-function write_environment_script(env, r, file)
+function write_environment_script(env, file)
local e = new_error("writing environment script")
local f, msg = io.open(file, "w")
if not f then
e:append("%s: %s", file, msg)
return false, e
end
- -- export global variables first
- for k,v in pairs(env) do
- if type(v) == "string" then
- f:write(string.format("%s=\"%s\"\n", k, v))
- end
- end
- -- export result local variables
- for k,v in pairs(env) do
- if type(v) == "table" and r == k then
- for k2, v2 in pairs(v) do
- f:write(string.format("%s=\"%s\"\n", k2, v2))
- end
- end
+ for var, val in env:iter() do
+ f:write(string.format("%s=\"%s\"\n", var, val))
end
f:close()
return true, nil
local file, line
-- generate environment script
file = string.format("%s/env", destdir)
- rc, re = write_environment_script(info.env, n, file)
+ rc, re = write_environment_script(rn.build_config.env, file)
if not rc then
return false, e:cat(re)
end
-- generate builtin environment script
local file = string.format("%s/builtin", destdir)
rc, re = write_environment_script(
- rn.build_config.builtin_env, n, file)
+ rn.build_config.builtin_env, file)
if not rc then
return false, e:cat(re)
end
-- read environment configuration
info.env = {} -- global and result specfic env (deprecated)
info.env_files = {} -- a list of environment files
- info.global_env = {} -- global env only
- info.result_env = {} -- result specific env only
+ info.global_env = environment.new()
+ info.result_env = {} -- result specific env only
local rc, re = e2tool.load_env_config(info, "proj/env")
if not rc then
return false, e:cat(re)
end
-- distribute result specific environment to the results
+ for r, res in pairs(info.results) do
+ res.env = info.result_env[r] or environment.new()
+ end
+
+ -- check for environment for non-existent results
for r, t in pairs(info.result_env) do
if not info.results[r] then
return false, e:append(
"configured environment for non existent result: %s", r)
end
- info.results[r].env = info.results[r].env or {}
- for key,val in pairs(t) do
- if info.results[r].env[key] then
- e2lib.warn("WHINT", "ignoring duplicate environment from global "..
- "configuration for result: %s %s=%s", r, key, val)
- else
- info.results[r].env[key] = val
- end
- end
end
-- servers
-- @param resultname string: name of a result
-- @return table: environment variables valid for the result
function e2tool.env_by_result(info, resultname)
- local e = {}
- -- take global variables first
- for k,v in pairs(info.env) do
- if type(v) == "string" or
- type(v) == "number" then
- e[k] = v
- end
- end
- -- result specific variables override global ones
- for k,v in pairs(info.env) do
- if type(v) == "table" and
- k == resultname then
- for k1,v1 in pairs(v) do
- e[k1] = v1
- end
- end
- end
- return e
+ local res = info.results[resultname]
+ local env = environment.new()
+ env:merge(info.global_env, false)
+ env:merge(res.env, true)
+ return env
end
--- envid: calculate a value represennting the environment for a result
-- @param resultname string: name of a result
-- @return string: envid value
function e2tool.envid(info, resultname)
- local e = e2tool.env_by_result(info, resultname)
- local hc = hash.hash_start()
- for k,v in pairs(e) do
- hc:hash_line(string.format("%s=%s", k, v))
- end
- local envid = hc:hash_finish()
- return envid
+ return e2tool.env_by_result(info, resultname):id()
end
function e2tool.add_source_result(info, sourcename, source_set)
if type(val) == "string" then
e2lib.logf(4, "global env: %-15s = %-15s", var, val)
info.env[var] = val
- info.global_env[var] = val
+ info.global_env:set(var, val)
elseif type(val) == "table" then
for var1, val1 in pairs(val) do
if type(var1) ~= "string" or
var1, val1, var)
info.env[var] = info.env[var] or {}
info.env[var][var1] = val1
- info.result_env[var] = info.result_env[var] or {}
- info.result_env[var][var1] = val1
+ info.result_env[var] = info.result_env[var] or environment.new()
+ info.result_env[var]:set(var1, val1)
end
end
end