summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-06-04 03:04:35 +0800
committerGitHub <[email protected]>2025-06-04 03:04:35 +0800
commitc8d17a7e9e935a66202fb90aedcf55f957a0ca33 (patch)
treed92c759ae652175f44e78bc5a126b03ed5fcaab0
parentc09fc2cef2c3cb3191bc8c6a74f72e2bd2dcf582 (diff)
parent08b1b83e2ea26ff9cba52df62ec6e41376f9177e (diff)
Merge pull request #6520 from xmake-io/vsxmake
Add generator.vsxmake.root_sln policy
-rw-r--r--xmake/core/project/policy.lua5
-rw-r--r--xmake/plugins/project/vsxmake/getinfo.lua10
-rw-r--r--xmake/plugins/project/vsxmake/vsxmake.lua4
-rw-r--r--xmake/scripts/vsxmake/vsproj/templates/sln/Project(target)2
4 files changed, 15 insertions, 6 deletions
diff --git a/xmake/core/project/policy.lua b/xmake/core/project/policy.lua
index 0c79be649..361ed059d 100644
--- a/xmake/core/project/policy.lua
+++ b/xmake/core/project/policy.lua
@@ -178,7 +178,10 @@ function policy.policies()
-- private: it will disable fetch remote package repositories
["network.mode"] = {description = "Set the network mode", type = "string"},
-- Set the compatibility version, e.g. 2.0, 3.0
- ["compatibility.version"] = {description = "Set the compatibility version", type = "string", default = "3.0", values = {"2.0", "3.0"}}
+ ["compatibility.version"] = {description = "Set the compatibility version", type = "string", default = "3.0", values = {"2.0", "3.0"}},
+ -- Generate the solution file in root output directory
+ -- @see https://github.com/xmake-io/xmake/issues/6519
+ ["generator.vsxmake.root_sln"] = {description = "Generate the solution file in root output directory", default = false, type = "boolean"}
}
policy._POLICIES = policies
end
diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua
index ae69fbb58..d9c4b4b6b 100644
--- a/xmake/plugins/project/vsxmake/getinfo.lua
+++ b/xmake/plugins/project/vsxmake/getinfo.lua
@@ -393,7 +393,12 @@ function main(outputdir, vsinfo)
local oldir = os.cd(project.directory())
-- init solution directory
- vsinfo.solution_dir = path.absolute(path.join(outputdir, "vsxmake" .. vsinfo.vstudio_version))
+ vsinfo.vcxproj_rootdir = path.absolute(path.join(outputdir, "vsxmake" .. vsinfo.vstudio_version))
+ if project.policy("generator.vsxmake.root_sln") then
+ vsinfo.solution_dir = path.absolute(outputdir)
+ else
+ vsinfo.solution_dir = vsinfo.vcxproj_rootdir
+ end
vsinfo.programdir = _make_dirs(xmake.programdir())
vsinfo.programfile = xmake.programfile()
vsinfo.projectdir = project.directory()
@@ -491,7 +496,8 @@ function main(outputdir, vsinfo)
-- init target info
_target.target = targetname
- _target.vcxprojdir = path.join(vsinfo.solution_dir, targetname)
+ _target.vcxprojdir = path.join(vsinfo.vcxproj_rootdir, targetname)
+ _target.vcxprojdir_relative_sln = path.relative(_target.vcxprojdir, vsinfo.solution_dir)
_target.target_id = hash.uuid4(targetname)
_target.kind = target:kind()
_target.absscriptdir = target:scriptdir()
diff --git a/xmake/plugins/project/vsxmake/vsxmake.lua b/xmake/plugins/project/vsxmake/vsxmake.lua
index 2b3ded5d6..d5cd5e078 100644
--- a/xmake/plugins/project/vsxmake/vsxmake.lua
+++ b/xmake/plugins/project/vsxmake/vsxmake.lua
@@ -235,8 +235,8 @@ function make(version)
_writefileifneeded(sln, render(template_sln, "#([A-Za-z0-9_,%.%*%(%)]+)#", "@([^@]+)@", paramsprovidersln))
-- add solution custom file
- _trycp(template_props, info.solution_dir)
- _trycp(template_targets, info.solution_dir)
+ _trycp(template_props, info.vcxproj_rootdir)
+ _trycp(template_targets, info.vcxproj_rootdir)
for _, target in ipairs(info.targets) do
local paramsprovidertarget = _buildparams(info, target, "<!-- nil -->")
diff --git a/xmake/scripts/vsxmake/vsproj/templates/sln/Project(target) b/xmake/scripts/vsxmake/vsproj/templates/sln/Project(target)
index 11e743c8a..87d435af2 100644
--- a/xmake/scripts/vsxmake/vsproj/templates/sln/Project(target)
+++ b/xmake/scripts/vsxmake/vsproj/templates/sln/Project(target)
@@ -1,2 +1,2 @@
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "#target#", "#target#\#target#.vcxproj", "{#target_id#}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "#target#", "#vcxprojdir_relative_sln#\#target#.vcxproj", "{#target_id#}"
EndProject