summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-07-13 17:48:11 +0800
committerruki <[email protected]>2017-07-13 17:48:11 +0800
commit4888f584e8cac792995203d593ceaa4e784dc4d9 (patch)
treedbf6c1d969d485a3160d209c24dc3fcda0637e10
parenta1fc9f0ad2b41cd2bf8e99b46a43d7901a2fda80 (diff)
support asm source files for vs201x project
-rw-r--r--CHANGELOG.md2
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua149
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua5
3 files changed, 93 insertions, 63 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa65cb767..afbb8ad2b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@
* [#71](https://github.com/tboox/xmake/issues/71): Improve to detect compiler and linker from env vars
* Improve the option detection (cache and multi-jobs) and increase 70% speed
* [#129](https://github.com/tboox/xmake/issues/129): Check link deps and cache the target file
+* Support `*.asm` source files for vs201x project plugin
### Bugs fixed
@@ -334,6 +335,7 @@
* [#71](https://github.com/tboox/xmake/issues/71): 改进从环境变量中探测链接器和编译器
* 改进option选项检测,通过多任务检测,提升70%的检测速度
* [#129](https://github.com/tboox/xmake/issues/129): 检测链接依赖,如果源文件没有改变,就不必重新链接目标文件了
+* 在vs201x工程插件中增加对`*.asm`文件的支持
### Bugs修复
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index 2bc68af20..122218c17 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -385,21 +385,25 @@ function _make_common_items(vcxprojfile, vsinfo, target, vcxprojdir)
local first_flags = nil
targetinfo.sourceflags = {}
for sourcekind, sourcebatch in pairs(targetinfo.sourcebatches) do
- if sourcekind == "cc" or sourcekind == "cxx" then
+ if sourcekind == "cc" or sourcekind == "cxx" or sourcekind == "as" then
for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
-- make compiler flags
local flags = _make_compflags(sourcefile, targetinfo, vcxprojdir)
- for _, flag in ipairs(flags) do
- flags_stats[flag] = (flags_stats[flag] or 0) + 1
- end
- -- update files count
- files_count = files_count + 1
+ -- no common flags for asm
+ if sourcekind ~= "as" then
+ for _, flag in ipairs(flags) do
+ flags_stats[flag] = (flags_stats[flag] or 0) + 1
+ end
+
+ -- update files count
+ files_count = files_count + 1
- -- save first flags
- if first_flags == nil then
- first_flags = flags
+ -- save first flags
+ if first_flags == nil then
+ first_flags = flags
+ end
end
-- save source flags
@@ -442,105 +446,130 @@ end
-- make source file for all modes
function _make_source_file_forall(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir)
- -- get object file
- local objectfile = nil
+ -- get object file and source kind
+ local sourcekind = nil
for _, info in ipairs(sourceinfo) do
- objectfile = info.objectfile
+ sourcekind = info.sourcekind
break
end
-- enter it
- vcxprojfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir))
+ sourcefile = path.relative(path.absolute(sourcefile), vcxprojdir)
+ vcxprojfile:enter("<%s Include=\"%s\">", ifelse(sourcekind == "as", "CustomBuild", "ClCompile"), sourcefile)
- -- make ObjectFileName
- vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", path.relative(path.absolute(objectfile), vcxprojdir))
+ -- for *.asm files
+ if sourcekind == "as" then
+ vcxprojfile:print("<ExcludedFromBuild>false</ExcludedFromBuild>")
+ vcxprojfile:print("<FileType>Document</FileType>")
+ for _, info in ipairs(sourceinfo) do
+ local objectfile = path.relative(path.absolute(info.objectfile), vcxprojdir)
+ vcxprojfile:print("<Outputs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s\'\">%s</Outputs>", info.mode .. '|' .. info.arch, objectfile)
+ vcxprojfile:print("<Command Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s\'\">%s /nologo /c %s -Fo%s %s</Command>", info.mode .. '|' .. info.arch, ifelse(info.arch == "x64", "ml64", "ml"), os.args(info.flags), objectfile, sourcefile)
+ end
- -- make AdditionalOptions
- local mergeflags = {}
- for _, info in ipairs(sourceinfo) do
- local flags = os.args(info.flags)
- if flags ~= "" then
+ -- for *.c/cpp files
+ else
+
+ -- make AdditionalOptions
+ local mergeflags = {}
+ local objectfiles = {}
+ for _, info in ipairs(sourceinfo) do
+ local flags = os.args(info.flags)
mergeflags[flags] = mergeflags[flags] or {}
mergeflags[flags][info.mode .. '|' .. info.arch] = true
+ objectfiles[flags] = path.relative(path.absolute(info.objectfile), vcxprojdir)
end
- end
- for flags, mergeinfos in pairs(mergeflags) do
+ for flags, mergeinfos in pairs(mergeflags) do
- -- merge mode and arch first
- local count = 0
- for _, mode in ipairs(vsinfo.modes) do
- if mergeinfos[mode .. "|Win32"] and mergeinfos[mode .. "|x64"] then
- mergeinfos[mode .. "|Win32"] = nil
- mergeinfos[mode .. "|x64"] = nil
- mergeinfos[mode] = true
- end
- if mergeinfos[mode] then
- count = count + 1
+ -- merge mode and arch first
+ local count = 0
+ for _, mode in ipairs(vsinfo.modes) do
+ if mergeinfos[mode .. "|Win32"] and mergeinfos[mode .. "|x64"] then
+ mergeinfos[mode .. "|Win32"] = nil
+ mergeinfos[mode .. "|x64"] = nil
+ mergeinfos[mode] = true
+ end
+ if mergeinfos[mode] then
+ count = count + 1
+ end
end
- end
- -- all modes and archs exist?
- if count == #vsinfo.modes then
- vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", flags)
- else
- for cond, _ in pairs(mergeinfos) do
- if cond:find('|', 1, true) then
- -- for mode | arch
- vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", cond, flags)
- else
- -- only for mode
- vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)\'==\'%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", cond, flags)
+ -- all modes and archs exist?
+ if count == #vsinfo.modes then
+ vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", objectfiles[flags])
+ if #flags > 0 then
+ vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", flags)
+ end
+ else
+ for cond, _ in pairs(mergeinfos) do
+ if cond:find('|', 1, true) then
+ -- for mode | arch
+ vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s\'\">%s</ObjectFileName>", cond, objectfiles[flags])
+ if #flags > 0 then
+ vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", cond, flags)
+ end
+ else
+ -- only for mode
+ vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)\'==\'%s\'\">%s</ObjectFileName>", cond, objectfiles[flags])
+ if #flags > 0 then
+ vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)\'==\'%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", cond, flags)
+ end
+ end
end
end
end
end
-- leave it
- vcxprojfile:leave("</ClCompile>")
+ vcxprojfile:leave("</%s>", ifelse(sourcekind == "as", "CustomBuild", "ClCompile"))
end
-- make source file for specific modes
function _make_source_file_forspec(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir)
-- add source file
+ sourcefile = path.relative(path.absolute(sourcefile), vcxprojdir)
for _, info in ipairs(sourceinfo) do
-- enter it
- vcxprojfile:enter("<ClCompile Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Include=\"%s\">", info.mode, info.arch, path.relative(path.absolute(sourcefile), vcxprojdir))
+ vcxprojfile:enter("<%s Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Include=\"%s\">", ifelse(info.sourcekind == "as", "CustomBuild", "ClCompile"), info.mode, info.arch, sourcefile)
- -- make ObjectFileName
- vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", path.relative(path.absolute(info.objectfile), vcxprojdir))
+ -- for *.asm files
+ local objectfile = path.relative(path.absolute(info.objectfile), vcxprojdir)
+ if info.sourcekind == "as" then
+ vcxprojfile:print("<ExcludedFromBuild>false</ExcludedFromBuild>")
+ vcxprojfile:print("<FileType>Document</FileType>")
+ vcxprojfile:print("<Outputs>%s</Outputs>", objectfile)
+ vcxprojfile:print("<Command>%s /nologo /c %s -Fo%s %s</Command>", ifelse(info.arch == "x64", "ml64", "ml"), os.args(info.flags), objectfile, sourcefile)
- -- get source flags
- local flags = os.args(info.flags)
-
- -- make AdditionalOptions
- if flags ~= "" then
- vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", flags)
+ -- for *.c/cpp files
+ else
+ vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", objectfile)
+ vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", os.args(info.flags))
end
-- leave it
- vcxprojfile:leave("</ClCompile>")
+ vcxprojfile:leave("</%s>", ifelse(info.sourcekind == "as", "CustomBuild", "ClCompile"))
end
end
-- make source files
function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
- -- enter ItemGroup
+ -- add source files
vcxprojfile:enter("<ItemGroup>")
-- make source file infos
local sourceinfos = {}
for _, targetinfo in ipairs(target.info) do
for sourcekind, sourcebatch in pairs(targetinfo.sourcebatches) do
- if sourcekind == "cc" or sourcekind == "cxx" then
+ if sourcekind == "cc" or sourcekind == "cxx" or sourcekind == "as" then
local objectfiles = sourcebatch.objectfiles
for idx, sourcefile in ipairs(sourcebatch.sourcefiles) do
local objectfile = objectfiles[idx]
local flags = targetinfo.sourceflags[sourcefile]
sourceinfos[sourcefile] = sourceinfos[sourcefile] or {}
- table.insert(sourceinfos[sourcefile], {mode = targetinfo.mode, arch = targetinfo.arch, objectfile = objectfile, flags = flags})
+ table.insert(sourceinfos[sourcefile], {mode = targetinfo.mode, arch = targetinfo.arch, sourcekind = sourcekind, objectfile = objectfile, flags = flags})
end
end
end
@@ -557,10 +586,8 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
vcxprojfile:leave("</ItemGroup>")
- -- enter header group
+ -- add headers
vcxprojfile:enter("<ItemGroup>")
-
- -- add headers
for _, includefile in ipairs(target.headerfiles) do
_make_header_file(vcxprojfile, includefile, vcxprojdir)
end
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
index c10137303..a1a7be693 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
@@ -93,9 +93,10 @@ function _make_sources(filtersfile, vsinfo, target, vcxprojdir)
for _, sourcefile in ipairs(target.sourcefiles) do
local filter = _make_filter(sourcefile, target, vcxprojdir)
if filter then
- filtersfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir))
+ local as = sourcefile:endswith(".asm")
+ filtersfile:enter("<%s Include=\"%s\">", ifelse(as, "CustomBuild", "ClCompile"), path.relative(path.absolute(sourcefile), vcxprojdir))
filtersfile:print("<Filter>%s</Filter>", filter)
- filtersfile:leave("</ClCompile>")
+ filtersfile:leave("</%s>", ifelse(as, "CustomBuild", "ClCompile"))
end
end
filtersfile:leave("</ItemGroup>")