From e657f348e658d91255fd01d347faf74ccafdfa4e Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 19 May 2018 21:59:23 +0800 Subject: add win sdk rules --- xmake/core/project/target.lua | 13 +++ xmake/modules/detect/sdks/find_dotnet.lua | 137 ++++++++++++++++++++++++++++++ xmake/rules/winsdk/dotnet/xmake.lua | 40 +++++++++ xmake/rules/winsdk/xmake.lua | 14 +-- 4 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 xmake/modules/detect/sdks/find_dotnet.lua diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 578b3f0f3..6d0aa648a 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -642,6 +642,19 @@ function target:fileconfig(sourcefile) return filesconfig[sourcefile] end +-- set the config info to the given source file +function target:fileconfig_set(sourcefile, info) + + -- get files config + local filesconfig = self._FILESCONFIG or {} + + -- set config info + filesconfig[sourcefile] = info + + -- update files config + self._FILESCONFIG = filesconfig +end + -- get the source files function target:sourcefiles() diff --git a/xmake/modules/detect/sdks/find_dotnet.lua b/xmake/modules/detect/sdks/find_dotnet.lua new file mode 100644 index 000000000..04928d63a --- /dev/null +++ b/xmake/modules/detect/sdks/find_dotnet.lua @@ -0,0 +1,137 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you 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 - 2018, TBOOX Open Source Group. +-- +-- @author ruki +-- @file find_dotnet.lua +-- + +-- imports +import("lib.detect.cache") +import("lib.detect.find_file") +import("core.base.option") +import("core.base.global") +import("core.project.config") + +-- find dotnet directory +function _find_sdkdir(sdkdir) + + -- get sdk directory from vsvars + if not sdkdir then + local arch = config.arch() + local vcvarsall = config.get("__vcvarsall") + if vcvarsall then + sdkdir = (vcvarsall[arch] or {}).WindowsSdkDir + if sdkdir then + sdkdir = path.join(path.directory(path.translate(sdkdir)), "NETFXSDK") + end + end + end + return sdkdir +end + +-- find dotnet toolchains +function _find_dotnet(sdkdir, sdkver) + + -- find dotnet directory + sdkdir = _find_sdkdir(sdkdir) + if not sdkdir or not os.isdir(sdkdir) then + return nil + end + + -- get sdk version + if not sdkver then + local vers = {} + for _, dir in ipairs(os.dirs(path.join(sdkdir, "*", "Include"))) do + table.insert(vers, path.filename(path.directory(dir))) + end + for _, ver in ipairs(vers) do + if os.isdir(path.join(sdkdir, ver, "Lib", "um")) and os.isdir(path.join(sdkdir, ver, "Include", "um")) then + sdkver = ver + break + end + end + end + if not sdkver then + return nil + end + + -- get the lib directory + local libdir = path.join(sdkdir, sdkver, "Lib") + + -- get the include directory + local includedir = path.join(sdkdir, sdkver, "Include") + + -- get toolchains + return {sdkdir = sdkdir, libdir = libdir, includedir = includedir, sdkver = sdkver} +end + +-- find dotnet toolchains +-- +-- @param sdkdir the dotnet directory +-- @param opt the argument options, .e.g {verbose = true, force = false, version = "5.9.1"} +-- +-- @return the dotnet toolchains. .e.g {sdkver = ..., sdkdir = ..., bindir = .., libdir = ..., includedir = ..., .. } +-- +-- @code +-- +-- local toolchains = find_dotnet("~/dotnet") +-- +-- @endcode +-- +function main(sdkdir, opt) + + -- init arguments + opt = opt or {} + + -- attempt to load cache first + local key = "detect.sdks.find_dotnet." .. (sdkdir or "") + local cacheinfo = cache.load(key) + if not opt.force and cacheinfo.dotnet then + return cacheinfo.dotnet + end + + -- find dotnet + local dotnet = _find_dotnet(sdkdir or config.get("dotnet") or global.get("dotnet"), opt.version or config.get("dotnet_sdkver")) + if dotnet then + + -- save to config + config.set("dotnet", dotnet.sdkdir, {force = true, readonly = true}) + config.set("dotnet_sdkver", dotnet.sdkver, {force = true, readonly = true}) + + -- trace + if opt.verbose or option.get("verbose") then + cprint("checking for the .Net SDK directory ... ${green}%s", dotnet.sdkdir) + cprint("checking for the .Net SDK version ... ${green}%s", dotnet.sdkver) + end + else + + -- trace + if opt.verbose or option.get("verbose") then + cprint("checking for the .Net SDK directory ... ${red}no") + end + end + + -- save to cache + cacheinfo.dotnet = dotnet or false + cache.save(key, cacheinfo) + + -- ok? + return dotnet +end diff --git a/xmake/rules/winsdk/dotnet/xmake.lua b/xmake/rules/winsdk/dotnet/xmake.lua index a54347d40..31e5ff756 100644 --- a/xmake/rules/winsdk/dotnet/xmake.lua +++ b/xmake/rules/winsdk/dotnet/xmake.lua @@ -28,5 +28,45 @@ rule("win.sdk.dotnet") -- on load on_load(function (target) + -- imports + import("core.project.config") + import("detect.sdks.find_dotnet") + + -- load dotnet environment + if not target:data("win.sdk.dotnet") then + + -- find dotnet + local dotnet = assert(find_dotnet(nil, {verbose = true}), "dotnet not found!") + + -- add link directory + target:add("linkdirs", path.join(dotnet.libdir, "um", config.arch())) + + -- save dotnet + target:data_set("win.sdk.dotnet", dotnet) + end end) + -- before build file + before_build_file(function (target, sourcefile, opt) + + -- get dotnet + local dotnet = target:data("win.sdk.dotnet") + + -- get file config + local fileconfig = target:fileconfig(sourcefile) or {} + + -- add cxflags to the given source file + -- + -- add_files(sourcefile, {force = {cxflags = "/clr"}}) + -- + fileconfig.force = fileconfig.force or {} + fileconfig.force.cxflags = fileconfig.force.cxflags or {} + table.insert(fileconfig.force.cxflags, "/clr") + + -- add include directory to given source file + fileconfig.includedirs = fileconfig.includedirs or {} + table.insert(fileconfig.includedirs, path.join(dotnet.includedir, "um")) + + -- update file config + target:fileconfig_set(sourcefile, fileconfig) + end) diff --git a/xmake/rules/winsdk/xmake.lua b/xmake/rules/winsdk/xmake.lua index 6ba05debe..bcd17ca83 100644 --- a/xmake/rules/winsdk/xmake.lua +++ b/xmake/rules/winsdk/xmake.lua @@ -28,13 +28,15 @@ rule("win.sdk.application") -- on load on_load(function (target) - -- TODO - -- values: win.sdk.mt/md + -- set kind: binary + target:set("kind", "binary") - -- link libcmt[d].lib - -- target:add("cflags", "-MT" .. (is_mode("debug") and "d" or "")) + -- set subsystem: windows + target:add("ldflags", "-subsystem:windows", {force = true}) - -- no msvcrt.lib --- target:add("ldflags", "-nodefaultlib:\"msvcrt.lib\"") + -- add links + target:add("links", "kernel32", "user32", "gdi32", "winspool", "comdlg32", "advapi32") + target:add("links", "shell32", "ole32", "oleaut32", "uuid", "odbc32", "odbccp32", "comctl32") + target:add("links", "cfgmgr32", "comdlg32", "setupapi", "strsafe", "shlwapi") end) -- cgit v1.3.1