From a4c0dbaa2bb4f0fb1365eb4498762ff1987e545e Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Thu, 2 Nov 2017 20:25:37 +0100 Subject: [PATCH] move build mode and settings into the build process Signed-off-by: Tobias Ulmer --- local/e2-build.lua | 47 ++++++++++++---------- local/e2-playground.lua | 30 +++++++++------ local/e2build.lua | 77 +++++++++++++++++++++++++++++-------- local/e2tool.lua | 3 +- local/result.lua | 57 ++++++++++++--------------- plugins/collect_project.lua | 19 ++++----- 6 files changed, 141 insertions(+), 92 deletions(-) diff --git a/local/e2-build.lua b/local/e2-build.lua index d686de9..348f319 100644 --- a/local/e2-build.lua +++ b/local/e2-build.lua @@ -226,49 +226,54 @@ local function e2_build(arg) -- first, standard build mode and settings for all for _,resultname in ipairs(ordered_results) do local res = result.results[resultname] - res:build_mode(build_mode) - res:build_settings(e2build.build_settings_class:new()) + local bp = res:build_process(res:build_process_new()) + bp:build_mode(build_mode) + bp:build_settings(bp:build_settings_new("build")) end -- selected results e2lib.logf(4, "selected_results=%s", table.concat(selected_results, " ")) for _,resultname in ipairs(selected_results) do local res = result.results[resultname] - res:build_settings():selected(true) - res:build_settings():force_rebuild(force_rebuild) - res:build_settings():keep_chroot(keep_chroot) - res:build_settings():prep_playground(playground) + local bp = res:build_process() + bp:build_settings():selected(true) + bp:build_settings():force_rebuild(force_rebuild) + bp:build_settings():keep_chroot(keep_chroot) + bp:build_settings():prep_playground(playground) end -- specific build modi e2lib.logf(4, "tag_mode_results=%s", table.concat(tag_mode_results, " ")) for _,resultname in ipairs(tag_mode_results) do local res = result.results[resultname] - res:build_settings():selected(true) - res:build_settings():force_rebuild(force_rebuild) - res:build_settings():keep_chroot(keep_chroot) - res:build_settings():prep_playground(playground) - res:build_mode(policy.default_build_mode("tag")) + local bp = res:build_process() + bp:build_settings():selected(true) + bp:build_settings():force_rebuild(force_rebuild) + bp:build_settings():keep_chroot(keep_chroot) + bp:build_settings():prep_playground(playground) + bp:build_mode(policy.default_build_mode("tag")) end e2lib.logf(4, "branch_mode_results=%s", table.concat(branch_mode_results, " ")) for _,resultname in ipairs(branch_mode_results) do local res = result.results[resultname] - res:build_settings():selected(true) - res:build_settings():force_rebuild(force_rebuild) - res:build_settings():keep_chroot(keep_chroot) - res:build_settings():prep_playground(playground) - res:build_mode(policy.default_build_mode("branch")) + local bp = res:build_process() + bp:build_settings():selected(true) + bp:build_settings():force_rebuild(force_rebuild) + bp:build_settings():keep_chroot(keep_chroot) + bp:build_settings():prep_playground(playground) + bp:build_mode(policy.default_build_mode("branch")) end e2lib.logf(4, "wc_mode_results=%s", table.concat(wc_mode_results, " ")) for _,resultname in ipairs(wc_mode_results) do local res = result.results[resultname] - res:build_settings():selected(true) - res:build_settings():force_rebuild(force_rebuild) - res:build_settings():keep_chroot(keep_chroot) - res:build_settings():prep_playground(playground) - res:build_mode(policy.default_build_mode("working-copy")) + local bp = res:build_process() + bp:build_settings():selected(true) + bp:build_settings():force_rebuild(force_rebuild) + bp:build_settings():keep_chroot(keep_chroot) + bp:build_settings():prep_playground(playground) + bp:build_mode(policy.default_build_mode("working-copy")) end rc, re = e2tool.print_selection(ordered_results) diff --git a/local/e2-playground.lua b/local/e2-playground.lua index 91b850a..c142fb9 100644 --- a/local/e2-playground.lua +++ b/local/e2-playground.lua @@ -70,12 +70,23 @@ local function e2_playground(arg) error(err.new("unknown result: %s", arguments[1])) end - -- apply the standard build mode to all results - for _,res in pairs(result.results) do - res:build_mode(build_mode) + local ordered_results, re = e2tool.dlist_recursive({arguments[1]}) + if not ordered_results then + error(re) + end + + -- set up build process and mode for all involved results + for _,resultname in ipairs(ordered_results) do + local res2 = result.results[resultname] + res2:build_process(res2:build_process_new()) + res2:build_process():build_mode(build_mode) end - local bc + -- set up build setting for selected result + local bp, bs, bc + bp = res:build_process() + bs = bp:build_settings(bp:build_settings_new("playground")) + bc, re = res:build_config() if not bc then error(re) @@ -89,8 +100,6 @@ local function e2_playground(arg) e2lib.finish(0) end - local settings = e2build.playground_settings_class:new() - -- interactive mode, use bash profile local out = {} table.insert(out, string.format("export TERM='%s'\n", @@ -107,15 +116,15 @@ local function e2_playground(arg) table.insert(out, string.format("source %s/script/%s\n", bc.Tc, bc.buildrc_noinit_file)) end - settings:profile(table.concat(out)) + bs:profile(table.concat(out)) local command if opts.command then - settings:command( + bs:command( string.format("/bin/bash --rcfile '%s' -c '%s'", bc.profile, opts.command)) else - settings:command(string.format("/bin/bash --rcfile '%s'", bc.profile)) + bs:command(string.format("/bin/bash --rcfile '%s'", bc.profile)) end e2lib.logf(2, "entering playground for %s", res:get_name()) @@ -124,8 +133,7 @@ local function e2_playground(arg) e2lib.log(2, "type `runinit' to run the init files") end - res:build_settings(settings) - rc, re = res:build_process():build(res, "playground") + rc, re = bp:build(res, "playground") if not rc then error(e:cat(re)) end diff --git a/local/e2build.lua b/local/e2build.lua index 392bb0c..1e60dc4 100644 --- a/local/e2build.lua +++ b/local/e2build.lua @@ -190,6 +190,52 @@ function e2build.build_process_class:add_step_after(process_mode, after, name, f table.insert(self._modes[process_mode], pos + 1, { name = name, func = func }) end +--- Create new build settings instance for the desired process mode. +-- @param process_mode A process mode like "build" or "playground". +-- @return Build settings instance +-- @error Throws assertion/error on invalid process_mode. +function e2build.build_process_class:build_settings_new(process_mode) + assertIsStringN(process_mode) + + if process_mode == "build" then + return e2build.build_settings_class:new() + elseif process_mode == "playground" then + return e2build.playground_settings_class:new() + end + + error("build_process_class:build_settings_new(): unknown process_mode") +end + +--- Get/set the build process settings. +-- @param bs Build settings instance to set (optional). +-- @return Build settings instance. +-- @error Throws assertion if unset and on invalid input. +function e2build.build_process_class:build_settings(bs) + if bs then + assertIsTable(bs) + self._build_settings = bs + else + assertIsTable(self._build_settings) + end + + return self._build_settings +end + +-- Get/set the build mode. +-- @param bm Build mode table to set (optional) +-- @return Build mode table. +-- @error Throws assertion if unset and on invalid input. +function e2build.build_process_class:build_mode(bm) + if bm then + assertIsTable(bm) + self._build_mode = bm + else + assertIsTable(self._build_mode) + end + + return self._build_mode +end + --- Iterator returns the next step in the chosen build process mode -- @param process_mode Build process mode -- @return Iterator function @@ -228,7 +274,7 @@ function e2build.build_process_class:_enter_playground(res, return_flags) e = err.new("entering playground") rc, re = eio.file_write(e2lib.join(bc.c, bc.profile), - res:build_settings():profile()) + self:build_settings():profile()) if not rc then error(e:cat(re)) end @@ -247,7 +293,7 @@ function e2build.build_process_class:_enter_playground(res, return_flags) table.insert(cmd, "/bin/sh") table.insert(cmd, "-c") - table.insert(cmd, res:build_settings():command()) + table.insert(cmd, self:build_settings():command()) e2tool.set_umask() rc, re = e2lib.callcmd(cmd, {}) @@ -283,15 +329,15 @@ function e2build.build_process_class:_result_available(res, return_flags) sbid = string.format("%s...", string.sub(buildid, 1, 8)) - if res:build_settings():prep_playground() then + if self:build_settings():prep_playground() then return_flags.message = e2lib.align(columns, 0, string.format("building %-20s", res:get_name()), columns, string.format("[%s] [playground]", sbid)) return_flags.stop = false return true end - if res:build_mode().source_set() == "working-copy" or - res:build_settings():force_rebuild() then + if self:build_mode().source_set() == "working-copy" or + self:build_settings():force_rebuild() then return_flags.message = e2lib.align(columns, 0, string.format("building %-20s", res:get_name()), columns, string.format("[%s]", sbid)) @@ -300,7 +346,7 @@ function e2build.build_process_class:_result_available(res, return_flags) end local server, location = - res:build_mode().storage( + self:build_mode().storage( e2project:project_location(), project.release_id()) local result_location = e2lib.join(location, res:get_name(), buildid, "result.tar") @@ -603,7 +649,7 @@ end function e2build.build_process_class:helper_unpack_result(res, dep, destdir) local rc, re, e local buildid, server, location, resulttarpath, tmpdir - local path, resdir, dt, filesdir, e2project + local path, resdir, dt, filesdir, e2project, dep_bp e = err.new("unpacking result failed: %s", dep:get_name()) @@ -614,8 +660,9 @@ function e2build.build_process_class:helper_unpack_result(res, dep, destdir) return false, e:cat(re) end + dep_bp = dep:build_process() server, location = - dep:build_mode().storage(e2project:project_location(), project.release_id()) + dep_bp:build_mode().storage(e2project:project_location(), project.release_id()) e2lib.logf(3, "searching for dependency %s in %s:%s", dep:get_name(), server, location) @@ -702,7 +749,7 @@ function e2build.build_process_class:_install_sources(res, return_flags) bc = res:build_config() destdir = e2lib.join(bc.T, "build") - source_set = res:build_mode().source_set() + source_set = self:build_mode().source_set() for sourcename in res:sources_list():iter() do e = err.new("installing source failed: %s", sourcename) @@ -742,7 +789,7 @@ end --- function e2build.build_process_class:_build_playground(res, return_flags) - if res:build_settings():prep_playground() then + if self:build_settings():prep_playground() then return_flags.message = string.format("playground done for: %-20s", res:get_name()) return_flags.stop = true return true @@ -838,7 +885,7 @@ function e2build.build_process_class:helper_deploy(res, tmpdir) -- -> releases:////files/* --]] local e2project = e2tool.e2project() - if not res:build_mode().deploy then + if not self:build_mode().deploy then e2lib.log(4, "deployment disabled for this build mode") return true end @@ -860,7 +907,7 @@ function e2build.build_process_class:helper_deploy(res, tmpdir) table.insert(files, e2lib.join("files", f)) end table.insert(files, "checksums") - local server, location = res:build_mode().deploy_storage( + local server, location = self:build_mode().deploy_storage( e2project:project_location(), project.release_id()) -- do not re-deploy if this release was already done earlier @@ -1013,7 +1060,7 @@ function e2build.build_process_class:_store_result(res, return_flags) return false, e:cat(re) end - local server, location = res:build_mode().storage( + local server, location = self:build_mode().storage( e2project:project_location(), project.release_id()) local buildid, re = res:buildid() @@ -1048,7 +1095,7 @@ function e2build.build_process_class:_linklast(res, return_flags) e = err.new("creating link to last results") e2project = e2tool.e2project() -- calculate the path to the result - server, location = res:build_mode().storage( + server, location = self:build_mode().storage( e2project:project_location(), project.release_id()) -- compute the "last" link/directory @@ -1111,7 +1158,7 @@ end function e2build.build_process_class:_chroot_cleanup(res, return_flags) local rc, re -- do not remove chroot if the user requests to keep it - if not res:build_settings():keep_chroot() then + if not self:build_settings():keep_chroot() then rc, re = self:helper_chroot_remove(res) if not rc then return false, re diff --git a/local/e2tool.lua b/local/e2tool.lua index 5ab2d20..527597e 100644 --- a/local/e2tool.lua +++ b/local/e2tool.lua @@ -1361,7 +1361,8 @@ function e2tool.print_selection(resultvec) return false, e:append("no such result: %s", resultname) end - local settings = res:build_settings() + local bp = res:build_process() + local settings = bp:build_settings() local s = settings:selected() and "[ selected ]" or "[dependency]" local f = settings:force_rebuild() and "[force rebuild]" or "" diff --git a/local/result.lua b/local/result.lua index d082211..3f8af3c 100644 --- a/local/result.lua +++ b/local/result.lua @@ -157,8 +157,15 @@ function result.basic_result:merged_env() self._type, self._name)) end ---- Get the build process to be used for this class -function result.basic_result:build_process() +--- Return new build process for this result +function result.basic_result:build_process_new() + error(err.new("called build_process_new() of result base class, type %s name %s", + self._type, self._name)) +end + +--- Get/set the build process to be used for this class +-- @param bp Build process to set (optional). +function result.basic_result:build_process(bp) error(err.new("called build_process() of result base class, type %s name %s", self._type, self._name)) end @@ -202,8 +209,7 @@ function result.result_class:initialize(rawres) self._sources_list = sl.sl:new() self._chroot_list = sl.sl:new() self._env = environment.new() - self._build_mode = false - self._build_settings = false + self._build_process = false local e = err.new("in result %s:", self._name) local rc, re @@ -409,30 +415,6 @@ function result.result_class:build_config() return strict.readonly(bc) end ---- -function result.result_class:build_mode(bm) - if bm then - assertIsTable(bm) - self._build_mode = bm - else - assertIsTable(self._build_mode) - end - - return self._build_mode -end - ---- -function result.result_class:build_settings(bs) - if bs then - assertIsTable(bs) - self._build_settings = bs - else - assertIsTable(self._build_settings) - end - - return self._build_settings -end - --- function result.result_class:merged_env() local e = environment.new() @@ -459,8 +441,9 @@ end -- @return BuildID or false on error. -- @return Error object on failure. function result.result_class:buildid() - local e, rc, re, hc, id, build_mode - build_mode = self:build_mode() + local e, rc, re, hc, id, bp, build_mode + bp = self:build_process() + build_mode = bp:build_mode() if self._buildid then return build_mode.buildid(self._buildid) @@ -537,12 +520,20 @@ function result.result_class:buildid() end --- -function result.result_class:build_process() - assertIsTable(self._build_mode) - assertIsTable(self._build_settings) +function result.result_class:build_process_new() return e2build.build_process_class:new() end +--- +function result.result_class:build_process(bp) + if bp ~= nil then + self._build_process = bp + end + + assertIsTable(self._build_process) + return self._build_process +end + --- function result.result_class:attribute_table(flagt) assert(flagt == nil or type(flagt) == "table") diff --git a/plugins/collect_project.lua b/plugins/collect_project.lua index aa51e77..1c4ad4d 100644 --- a/plugins/collect_project.lua +++ b/plugins/collect_project.lua @@ -318,7 +318,8 @@ local function _build_collect_project(self, res, return_flags) for sourcename in cp_sources:iter() do e2lib.logf(3, "source: %s", sourcename) local destdir = e2lib.join(bc.T, "project", e2tool.sourcedir(sourcename)) - local source_set = res:build_mode().source_set() + local bp = res:build_process() + local source_set = bp:build_mode().source_set() local src = source.sources[sourcename] local source_to_result_fn = _source_to_result_functions[src:get_type()] @@ -497,16 +498,8 @@ function collect_project_class:build_config() return self._stdresult:build_config() end -function collect_project_class:build_mode(bm) - return self._stdresult:build_mode(bm) -end - -function collect_project_class:build_settings(bs) - return self._stdresult:build_settings(bs) -end - -function collect_project_class:build_process() - local bp = self._stdresult:build_process() +function collect_project_class:build_process_new() + local bp = self._stdresult:build_process_new() bp:add_step_before("build", "fix_permissions", "build_collect_project", _build_collect_project) @@ -514,6 +507,10 @@ function collect_project_class:build_process() return bp end +function collect_project_class:build_process(bp) + return self._stdresult:build_process(bp) +end + function collect_project_class:chroot_list() return self._stdresult:chroot_list() end -- 2.39.5