diff options
| author | OpportunityLiu <[email protected]> | 2019-07-13 09:32:30 +0800 |
|---|---|---|
| committer | OpportunityLiu <[email protected]> | 2019-07-14 00:04:52 +0800 |
| commit | 515a9c3f542ef1b104a3af9a2398335e2d10fe7c (patch) | |
| tree | 43cce985ab728cc7e4290b369cb000a8762fbff5 /xmake/plugins/project/vsxmake/vsxmake.lua | |
| parent | 6061930a5c24f9b1ba717a9a39dafda02e8a802a (diff) | |
support call xmake from msbuild
Diffstat (limited to 'xmake/plugins/project/vsxmake/vsxmake.lua')
| -rw-r--r-- | xmake/plugins/project/vsxmake/vsxmake.lua | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/xmake/plugins/project/vsxmake/vsxmake.lua b/xmake/plugins/project/vsxmake/vsxmake.lua new file mode 100644 index 000000000..19ec2bfa6 --- /dev/null +++ b/xmake/plugins/project/vsxmake/vsxmake.lua @@ -0,0 +1,158 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015 - 2019, TBOOX Open Source Group. +-- +-- @author OpportunityLiu +-- @file vsxmake.lua +-- + +-- imports +import("core.base.hashset") +import("vstudio.impl.vsinfo", { rootdir = path.directory(os.scriptdir()) }) +import("render") +import("getinfo") + +local template_root = path.join(os.scriptdir(), "vsproj", "templates") +local template_sln = path.join(template_root, "sln", "vsxmake.sln") +local template_vcx = path.join(template_root, "vcxproj", "#target#.vcxproj") + +local template_fil = path.join(template_root, "vcxproj.filters", "#target#.vcxproj.filters") +local template_usr = path.join(template_root, "#target#.vcxproj.user") +local template_props = path.join(template_root, "Xmake.Custom.props") +local template_targets = path.join(template_root, "Xmake.Custom.targets") + +function _filter_files(files, exts) + local extset = hashset.from(exts) + local f = {} + for _, file in ipairs(files) do + local ext = path.extension(file) + if extset:has(ext) then + table.insert(f, file) + end + end + return f +end + +function _buildparams(info, target, default) + + local function getprop(match, opt) + local i = info + local r = info[match] + if target then + opt = table.join(target, opt) + end + for _,k in ipairs(opt) do + local v = (i._sub or {})[k] or (i._sub2 or {})[k] or (i._sub3 or {})[k] or (i._sub4 or {})[k]or i[k] + if v == nil then + raise("key '" .. k .. "' not found") + end + i = v + r = i[match] or r + end + + return r or default + end + + local function listconfig(args) + for _, k in ipairs(args) do + args[k] = true + end + local r = {} + if args.target then + table.insert(r, info.targets) + end + if args.mode then + table.insert(r, info.modes) + end + if args.arch then + table.insert(r, info.archs) + end + if args.dir then + table.insert(r, info._sub[target].dirs) + end + if args.dep then + table.insert(r, info._sub[target].deps) + end + if args.filec then + local files = info._sub[target].sourcefiles + table.insert(r, _filter_files(files, {".c"})) + elseif args.filecxx then + local files = info._sub[target].sourcefiles + table.insert(r, _filter_files(files, {".cpp", ".cc", ".cxx"})) + elseif args.filecu then + local files = info._sub[target].sourcefiles + table.insert(r, _filter_files(files, {".cu"})) + elseif args.fileobj then + local files = info._sub[target].sourcefiles + table.insert(r, _filter_files(files, {".obj", ".o"})) + elseif args.filerc then + local files = info._sub[target].sourcefiles + table.insert(r, _filter_files(files, {".rc"})) + end + return r + end + + return function(match, opt) + if type(match) == "table" then + return listconfig(match) + end + return getprop(match, opt) + end +end + +function _trycp(file, target, targetname) + targetname = targetname or path.filename(file) + local targetfile = path.join(target, targetname) + if os.isfile(targetfile) then + dprint("skipped file %s", path.relative(targetfile)) + return + end + os.cp(file,targetfile) +end + +-- make +function make(version) + + return function(outputdir) + local info = getinfo(outputdir, vsinfo(version)) + local paramsprovidersln = _buildparams(info) + + -- write solution file + local sln = path.join(info.solution_dir, info.slnfile .. "_vsxmake" .. info.vstudio_version .. ".sln") + io.writefile(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) + + for _, target in ipairs(info.targets) do + local paramsprovidertarget = _buildparams(info, target, "<!-- nil -->") + local proj_dir = info._sub[target].vcxprojdir + + -- write project file + local proj = path.join(proj_dir, target .. ".vcxproj") + io.writefile(proj, render(template_vcx, "#([A-Za-z0-9_,%.%*%(%)]+)#", paramsprovidertarget)) + + local projfil = path.join(proj_dir, target .. ".vcxproj.filters") + io.writefile(projfil, render(template_fil, "#([A-Za-z0-9_,%.%*%(%)]+)#", paramsprovidertarget)) + + -- add project custom file + _trycp(template_props, proj_dir) + _trycp(template_targets, proj_dir) + -- add project user file + _trycp(template_usr, proj_dir, target .. ".vcxproj.user") + end + end +end |
