summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2016-08-08 21:56:23 +0800
committerruki <[email protected]>2016-08-08 21:56:23 +0800
commitc140b6fc0d0783dfce13532bde4cb87c2d5201d1 (patch)
tree7933bb471aad7211ac65c998fc25878e6c7ba97f
parent36cffe6922680493c36d9f9ba4a8fa18b60d8539 (diff)
fix source file path error for vcproj
-rw-r--r--xmake/core/sandbox/modules/import/core/tool/compiler.lua2
-rwxr-xr-xxmake/plugins/project/vstudio/impl/vs200x.lua7
-rwxr-xr-xxmake/plugins/project/vstudio/impl/vs200x_solution.lua4
-rwxr-xr-xxmake/plugins/project/vstudio/impl/vs200x_vcproj.lua99
4 files changed, 99 insertions, 13 deletions
diff --git a/xmake/core/sandbox/modules/import/core/tool/compiler.lua b/xmake/core/sandbox/modules/import/core/tool/compiler.lua
index 77eb51ad1..e99abcc04 100644
--- a/xmake/core/sandbox/modules/import/core/tool/compiler.lua
+++ b/xmake/core/sandbox/modules/import/core/tool/compiler.lua
@@ -42,7 +42,7 @@ function sandbox_core_tool_compiler.compcmd(sourcefile, objectfile, target)
end
-- make compiling flags for the given target
-function sandbox_core_tool_compiler.compflags(sourcefile)
+function sandbox_core_tool_compiler.compflags(sourcefile, target)
-- get the compiler instance
local instance, errors = compiler.load(compiler.kind_of_file(sourcefile))
diff --git a/xmake/plugins/project/vstudio/impl/vs200x.lua b/xmake/plugins/project/vstudio/impl/vs200x.lua
index e9f5d9eb8..51292fe03 100755
--- a/xmake/plugins/project/vstudio/impl/vs200x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs200x.lua
@@ -31,12 +31,15 @@ function make(outputdir, vsinfo)
-- enter project directory
local olddir = os.cd(project.directory())
+ -- init solution directory
+ vsinfo.solution_dir = path.join(outputdir, "vs" .. vsinfo.vstudio_version)
+
-- make solution
- vs200x_solution.make(outputdir, vsinfo)
+ vs200x_solution.make(vsinfo)
-- make vsprojs
for _, target in pairs(project.targets()) do
- vs200x_vcproj.make(outputdir, vsinfo, target)
+ vs200x_vcproj.make(vsinfo, target)
end
-- leave project directory
diff --git a/xmake/plugins/project/vstudio/impl/vs200x_solution.lua b/xmake/plugins/project/vstudio/impl/vs200x_solution.lua
index 90f0434da..ebfb45dc4 100755
--- a/xmake/plugins/project/vstudio/impl/vs200x_solution.lua
+++ b/xmake/plugins/project/vstudio/impl/vs200x_solution.lua
@@ -84,13 +84,13 @@ function _make_global(slnfile, vsinfo)
end
-- make solution
-function make(outputdir, vsinfo)
+function make(vsinfo)
-- init solution name
vsinfo.solution_name = project.name() or "vs" .. vsinfo.vstudio_version
-- open solution file
- local slnfile = vsfile.open(format("%s/vs%s/%s.sln", outputdir, vsinfo.vstudio_version, vsinfo.solution_name), "w")
+ local slnfile = vsfile.open(path.join(vsinfo.solution_dir, vsinfo.solution_name .. ".sln"), "w")
-- make header
_make_header(slnfile, vsinfo)
diff --git a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
index dca5ee419..623b914b4 100755
--- a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
@@ -136,7 +136,7 @@ function _make_VCLinkerTool(vcprojfile, vsinfo, target)
-- make it
vcprojfile:enter("<Tool")
vcprojfile:print("Name=\"VCLinkerTool\"")
- vcprojfile:print("AdditionalOptions=\"%s\"", linker.linkflags(target))
+ vcprojfile:print("AdditionalOptions=\"%s\"", (linker.linkflags(target):gsub("\"", "&quot;")))
vcprojfile:print("AdditionalDependencies=\"\"")
vcprojfile:print("AdditionalLibraryDirectories=\"\"")
vcprojfile:print("LinkIncremental=\"2\"") -- enable: 2, disable: 1
@@ -260,33 +260,116 @@ end
-- make references
function _make_references(vcprojfile, vsinfo, target)
-
vcprojfile:enter("<References>")
vcprojfile:leave("</References>")
end
+-- make file
+--
+-- .e.g
+-- <File
+-- RelativePath="..\..\..\src\file3.c"
+-- >
+-- <FileConfiguration
+-- Name="Debug|Win32"
+-- >
+-- <Tool
+-- Name="VCCLCompilerTool"
+-- AdditionalOptions="-Dtest"
+-- />
+-- </FileConfiguration>
+-- </File>
+function _make_file(vcprojfile, vsinfo, target, sourcefile, vcprojdir)
+
+ -- enter file
+ vcprojfile:enter("<File")
+
+ -- add file path
+ vcprojfile:print("RelativePath=\"%s\"", path.relative(path.absolute(sourcefile), vcprojdir))
+ vcprojfile:print(">")
+
+ -- add file configuration
+ vcprojfile:enter("<FileConfiguration")
+ vcprojfile:print("Name=\"$(mode)|Win32\"")
+ vcprojfile:print(">")
+
+ -- add compiling options
+ vcprojfile:enter("<Tool")
+ vcprojfile:print("Name=\"VCCLCompilerTool\"")
+ vcprojfile:print("AdditionalOptions=\"%s\"", (compiler.compflags(sourcefile, target):gsub("\"", "&quot;")))
+ vcprojfile:leave("/>")
+ vcprojfile:leave("</FileConfiguration>")
+
+ -- leave file
+ vcprojfile:leave("</File>")
+end
+
-- make files
-function _make_files(vcprojfile, vsinfo, target)
-
+--
+-- .e.g
+-- <Filter
+-- Name="Source Files"
+-- >
+-- <File
+-- RelativePath="..\..\..\src\file1.c"
+-- >
+-- </File>
+-- <File
+-- RelativePath="..\..\..\src\file2.c"
+-- >
+-- </File>
+-- <File
+-- RelativePath="..\..\..\src\file3.c"
+-- >
+-- <FileConfiguration
+-- Name="Debug|Win32"
+-- >
+-- <Tool
+-- Name="VCCLCompilerTool"
+-- AdditionalOptions="-Dtest"
+-- />
+-- </FileConfiguration>
+-- </File>
+-- <File
+-- RelativePath="..\..\..\src\file4.c"
+-- >
+-- </File>
+-- </Filter>
+function _make_files(vcprojfile, vsinfo, target, vcprojdir)
+
+ -- enter files
vcprojfile:enter("<Files>")
+ vcprojfile:enter("<Filter")
+ vcprojfile:print("Name=\"Source Files\"")
+ vcprojfile:print(">")
+
+ -- add files
+ for _, sourcefile in ipairs(target:sourcefiles()) do
+ _make_file(vcprojfile, vsinfo, target, sourcefile, vcprojdir)
+ end
+
+ -- leave files
+ vcprojfile:leave("</Filter>")
vcprojfile:leave("</Files>")
end
-- make globals
function _make_globals(vcprojfile, vsinfo, target)
-
vcprojfile:enter("<Globals>")
vcprojfile:leave("</Globals>")
end
-- make vcproj
-function make(outputdir, vsinfo, target)
+function make(vsinfo, target)
-- the target name
local targetname = target:name()
+ -- the vcproj directory
+ local vcprojdir = path.join(vsinfo.solution_dir, targetname)
+
-- open vcproj file
- local vcprojfile = vsfile.open(format("%s/vs%s/%s/%s.vcproj", outputdir, vsinfo.vstudio_version, targetname, targetname), "w")
+ local vcprojfile = vsfile.open(path.join(vcprojdir, targetname .. ".vcproj"), "w")
-- make header
_make_header(vcprojfile, vsinfo, target)
@@ -304,7 +387,7 @@ function make(outputdir, vsinfo, target)
_make_references(vcprojfile, vsinfo, target)
-- make files
- _make_files(vcprojfile, vsinfo, target)
+ _make_files(vcprojfile, vsinfo, target, vcprojdir)
-- make globals
_make_globals(vcprojfile, vsinfo, target)