From 83b2f487b643423fbd3d78207105c8dbaf9d0ced Mon Sep 17 00:00:00 2001 From: zhu-rong <211103376@qq.com> Date: Thu, 25 Apr 2024 15:48:16 +0800 Subject: add "build.fence" policy for block job build --- xmake/actions/build/build.lua | 32 +++++++++++++++++++++++++++++--- xmake/core/project/policy.lua | 2 ++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/xmake/actions/build/build.lua b/xmake/actions/build/build.lua index 43e28bf21..332a747ff 100644 --- a/xmake/actions/build/build.lua +++ b/xmake/actions/build/build.lua @@ -207,7 +207,7 @@ function _add_batchjobs_for_target(batchjobs, rootjob, target) end -- add batch jobs for the given target and deps -function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target) +function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target, before_job_refs) local targetjob_ref = jobrefs[target:name()] if targetjob_ref then batchjobs:add(targetjob_ref, rootjob) @@ -215,6 +215,7 @@ function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target) local job_build_before, job_build, job_build_after = _add_batchjobs_for_target(batchjobs, rootjob, target) if job_build_before and job_build and job_build_after then jobrefs[target:name()] = job_build_after + before_job_refs[target:name()] = job_build_before for _, depname in ipairs(target:get("deps")) do local dep = project.target(depname) local targetjob = job_build @@ -222,7 +223,7 @@ function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target) if dep:policy("build.across_targets_in_parallel") == false then targetjob = job_build_before end - _add_batchjobs_for_target_and_deps(batchjobs, targetjob, jobrefs, dep) + _add_batchjobs_for_target_and_deps(batchjobs, targetjob, jobrefs, dep, before_job_refs) end end end @@ -274,10 +275,35 @@ function get_batchjobs(targetnames, group_pattern) -- generate batch jobs for default or all targets local jobrefs = {} + local before_job_refs = {} local batchjobs = jobpool.new() for _, target in pairs(targets_root) do - _add_batchjobs_for_target_and_deps(batchjobs, batchjobs:rootjob(), jobrefs, target) + _add_batchjobs_for_target_and_deps(batchjobs, batchjobs:rootjob(), jobrefs, target, before_job_refs) end + + -- add fence + for _, target in pairs(project.targets()) do + local target_before_job = before_job_refs[target:name()] + + if target_before_job then + -- collect fence + local fences = {} + for _, dep in ipairs(target:orderdeps()) do + if dep:policy("build.fence") == true then + fence_job = jobrefs[dep:name()] + table.insert(fences, fence_job) + end + end + + -- add fence + if #fences > 0 then + for _, fence_job in ipairs(fences) do + batchjobs:add(fence_job, target_before_job) + end + end + end + end + return batchjobs end diff --git a/xmake/core/project/policy.lua b/xmake/core/project/policy.lua index e99f02caf..4e495e449 100644 --- a/xmake/core/project/policy.lua +++ b/xmake/core/project/policy.lua @@ -40,6 +40,8 @@ function policy.policies() ["check.auto_map_flags"] = {description = "Enable map gcc flags to the current compiler and linker automatically.", default = true, type = "boolean"}, -- We will check the compatibility of target and package licenses ["check.target_package_licenses"] = {description = "Enable check the compatibility of target and package licenses.", default = true, type = "boolean"}, + -- Provide a way to block all targets build that depends on self + ["build.fence"] = {description = "Block all targets build that depends on self.", default = false, type = "boolean"}, -- We can compile the source files for each target in parallel ["build.across_targets_in_parallel"] = {description = "Enable compile the source files for each target in parallel.", default = true, type = "boolean"}, -- Merge archive intead of linking for all dependent targets -- cgit v1.3.1 From 7fc52dceb4cc55451c7d2a3857afffae6e7447c5 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 25 Apr 2024 23:03:30 +0800 Subject: Update build.lua --- xmake/actions/build/build.lua | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/xmake/actions/build/build.lua b/xmake/actions/build/build.lua index 332a747ff..f4b371de7 100644 --- a/xmake/actions/build/build.lua +++ b/xmake/actions/build/build.lua @@ -207,7 +207,7 @@ function _add_batchjobs_for_target(batchjobs, rootjob, target) end -- add batch jobs for the given target and deps -function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target, before_job_refs) +function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, target, jobrefs, jobrefs_before) local targetjob_ref = jobrefs[target:name()] if targetjob_ref then batchjobs:add(targetjob_ref, rootjob) @@ -215,7 +215,7 @@ function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target, local job_build_before, job_build, job_build_after = _add_batchjobs_for_target(batchjobs, rootjob, target) if job_build_before and job_build and job_build_after then jobrefs[target:name()] = job_build_after - before_job_refs[target:name()] = job_build_before + jobrefs_before[target:name()] = job_build_before for _, depname in ipairs(target:get("deps")) do local dep = project.target(depname) local targetjob = job_build @@ -223,7 +223,7 @@ function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, jobrefs, target, if dep:policy("build.across_targets_in_parallel") == false then targetjob = job_build_before end - _add_batchjobs_for_target_and_deps(batchjobs, targetjob, jobrefs, dep, before_job_refs) + _add_batchjobs_for_target_and_deps(batchjobs, targetjob, dep, jobrefs, jobrefs_before) end end end @@ -252,7 +252,7 @@ function get_batchjobs(targetnames, group_pattern) else local depset = hashset.new() local targets = {} - for _, target in pairs(project.targets()) do + for _, target in ipairs(project.ordertargets()) do if target:is_enabled() then local group = target:get("group") if (target:is_default() and not group_pattern) or option.get("all") or (group_pattern and group and group:match(group_pattern)) then @@ -263,7 +263,7 @@ function get_batchjobs(targetnames, group_pattern) end end end - for _, target in pairs(targets) do + for _, target in ipairs(targets) do if not depset:has(target:name()) then table.insert(targets_root, target) end @@ -275,30 +275,22 @@ function get_batchjobs(targetnames, group_pattern) -- generate batch jobs for default or all targets local jobrefs = {} - local before_job_refs = {} + local jobrefs_before = {} local batchjobs = jobpool.new() - for _, target in pairs(targets_root) do - _add_batchjobs_for_target_and_deps(batchjobs, batchjobs:rootjob(), jobrefs, target, before_job_refs) + for _, target in ipairs(targets_root) do + _add_batchjobs_for_target_and_deps(batchjobs, batchjobs:rootjob(), target, jobrefs, jobrefs_before) end - -- add fence - for _, target in pairs(project.targets()) do - local target_before_job = before_job_refs[target:name()] - - if target_before_job then - -- collect fence - local fences = {} + -- add fence jobs, @see https://github.com/xmake-io/xmake/issues/5003 + for _, target in ipairs(project.ordertargets()) do + local target_job_before = jobrefs_before[target:name()] + if target_job_before then for _, dep in ipairs(target:orderdeps()) do - if dep:policy("build.fence") == true then - fence_job = jobrefs[dep:name()] - table.insert(fences, fence_job) - end - end - - -- add fence - if #fences > 0 then - for _, fence_job in ipairs(fences) do - batchjobs:add(fence_job, target_before_job) + if dep:policy("build.fence") then + local fence_job = jobrefs[dep:name()] + if fence_job then + batchjobs:add(fence_job, target_job_before) + end end end end @@ -329,4 +321,3 @@ function main(targetnames, group_pattern) os.cd(curdir) end end - -- cgit v1.3.1 From 48b95cd23b42a78f9bf7fddf9c0c1b9845e9202e Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 25 Apr 2024 23:20:21 +0800 Subject: Update xmake.lua --- tests/projects/other/autogen_codedep/xmake.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/projects/other/autogen_codedep/xmake.lua b/tests/projects/other/autogen_codedep/xmake.lua index 229439fef..5f2c76d67 100644 --- a/tests/projects/other/autogen_codedep/xmake.lua +++ b/tests/projects/other/autogen_codedep/xmake.lua @@ -24,6 +24,7 @@ target("autogen") set_arch(os.arch()) add_files("src/autogen.cpp") set_languages("c++11") + set_policy("build.fence", true) target("test") set_kind("binary") @@ -31,5 +32,4 @@ target("test") add_rules("autogen") add_files("src/main.cpp") add_files("src/*.in") - set_policy("build.across_targets_in_parallel", false) -- cgit v1.3.1