summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-07-29 15:37:06 +0800
committerruki <[email protected]>2017-07-29 15:37:06 +0800
commitcac0dd80b29ee923382442c274d37fb73589cb06 (patch)
tree4a04c360a532a7d161f9fb824857a9075808cf64
parentff6997a754e3af66ea7743930b9ec83df71d0a00 (diff)
support precompiled header for vs201x project
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua11
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua48
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua18
3 files changed, 70 insertions, 7 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index 7563eb5c7..07ded3ce5 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -189,14 +189,17 @@ function make(outputdir, vsinfo)
for targetname, target in pairs(project.targets()) do
if not target:isphony() then
- -- TODO
- -- disable precompiled header first
- target:set("precompiled_header", nil)
-
-- make target with the given mode and arch
targets[targetname] = targets[targetname] or {}
local _target = targets[targetname]
+ -- save precompiled header and source
+ local precompiled_header, precompiled_source = target:pcsourcefile()
+ _target.pcheader = precompiled_header -- header.h
+ _target.pcsourcefile = precompiled_source -- header.cpp
+ _target.pcheaderfile = target:pcheaderfile() -- header.h.pch
+ target:set("precompiled_header", nil)
+
-- init target info
_target.name = targetname
_target.kind = target:get("kind")
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index f0a302618..b5904209a 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -301,7 +301,7 @@ function _make_source_options(vcxprojfile, flags, condition)
end
-- make common item
-function _make_common_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
+function _make_common_item(vcxprojfile, vsinfo, target, targetinfo, vcxprojdir)
-- enter ItemDefinitionGroup
vcxprojfile:enter("<ItemDefinitionGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", targetinfo.mode, targetinfo.arch)
@@ -376,6 +376,29 @@ function _make_common_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
vcxprojfile:print("<ProgramDatabaseFile>%s</ProgramDatabaseFile>", path.relative(path.absolute(symbolfile), vcxprojdir))
end
+ -- use precompiled header
+ if target.pcheader then
+
+ -- get precompiled header file
+ local pcheader = path.filename(target.pcheader)
+ if target.pcsourcefile and os.isfile(target.pcsourcefile) then
+ local sourcedata = io.readfile(target.pcsourcefile)
+ if sourcedata then
+ local includefile = sourcedata:match("#include%s+[<\"](.+)[>\"]")
+ if includefile then
+ pcheader = includefile
+ end
+ end
+ end
+
+ -- make precompiled header and outputfile
+ vcxprojfile:print("<PrecompiledHeader>Use</PrecompiledHeader>")
+ vcxprojfile:print("<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>", pcheader)
+ if target.pcheaderfile then
+ vcxprojfile:print("<PrecompiledHeaderOutputFile>%s</PrecompiledHeaderOutputFile>", path.relative(path.absolute(target.pcheaderfile), vcxprojdir))
+ end
+ end
+
vcxprojfile:leave("</ClCompile>")
-- leave ItemDefinitionGroup
@@ -443,7 +466,7 @@ function _make_common_items(vcxprojfile, vsinfo, target, vcxprojdir)
targetinfo.sourceflags = sourceflags
-- make common item
- _make_common_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
+ _make_common_item(vcxprojfile, vsinfo, target, targetinfo, vcxprojdir)
end
end
@@ -576,6 +599,19 @@ function _make_source_file_forspec(vcxprojfile, vsinfo, sourcefile, sourceinfo,
end
end
+-- make source file for precompiled header
+function _make_source_file_forpch(vcxprojfile, vsinfo, pcsourcefile, pcheaderfile, vcxprojdir)
+
+ -- add precompiled source file
+ local sourcefile = path.relative(path.absolute(pcsourcefile), vcxprojdir)
+ local objectfile = path.relative(path.absolute(pcheaderfile .. ".obj"), vcxprojdir)
+ vcxprojfile:enter("<ClCompile Include=\"%s\">", sourcefile)
+ vcxprojfile:print("<PrecompiledHeader>Create</PrecompiledHeader>")
+ vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", objectfile)
+ vcxprojfile:print("<AdditionalOptions> %%(AdditionalOptions)</AdditionalOptions>")
+ vcxprojfile:leave("</ClCompile>")
+end
+
-- make source files
function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
@@ -607,6 +643,11 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
end
end
+ -- make precompiled source file
+ if target.pcsourcefile then
+ _make_source_file_forpch(vcxprojfile, vsinfo, target.pcsourcefile, target.pcheaderfile, vcxprojdir)
+ end
+
vcxprojfile:leave("</ItemGroup>")
-- add headers
@@ -614,6 +655,9 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
for _, includefile in ipairs(target.headerfiles) do
_make_header_file(vcxprojfile, includefile, vcxprojdir)
end
+ if target.pcheader then
+ _make_header_file(vcxprojfile, target.pcheader, vcxprojdir)
+ end
vcxprojfile:leave("</ItemGroup>")
end
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
index a1a7be693..c2432b4df 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
@@ -99,6 +99,14 @@ function _make_sources(filtersfile, vsinfo, target, vcxprojdir)
filtersfile:leave("</%s>", ifelse(as, "CustomBuild", "ClCompile"))
end
end
+ if target.pcsourcefile then
+ local filter = _make_filter(target.pcsourcefile, target, vcxprojdir)
+ if filter then
+ filtersfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(target.pcsourcefile), vcxprojdir))
+ filtersfile:print("<Filter>%s</Filter>", filter)
+ filtersfile:leave("</ClCompile>")
+ end
+ end
filtersfile:leave("</ItemGroup>")
end
@@ -111,7 +119,15 @@ function _make_headers(filtersfile, vsinfo, target, vcxprojdir)
local filter = _make_filter(headerfile, target, vcxprojdir)
if filter then
filtersfile:enter("<ClInclude Include=\"%s\">", path.relative(path.absolute(headerfile), vcxprojdir))
- filtersfile:print("<Filter>%s</Filter>", _make_filter(headerfile, target, vcxprojdir))
+ filtersfile:print("<Filter>%s</Filter>", filter)
+ filtersfile:leave("</ClInclude>")
+ end
+ end
+ if target.pcheader then
+ local filter = _make_filter(target.pcheader, target, vcxprojdir)
+ if filter then
+ filtersfile:enter("<ClInclude Include=\"%s\">", path.relative(path.absolute(target.pcheader), vcxprojdir))
+ filtersfile:print("<Filter>%s</Filter>", filter)
filtersfile:leave("</ClInclude>")
end
end