diff options
| author | ruki <[email protected]> | 2021-11-10 00:21:29 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-11-10 00:21:29 +0800 |
| commit | 0a17c9c9d9143dfa4281efb13b0f550533d96a18 (patch) | |
| tree | e04530f85f0b3cab8c29ec6daac253fbc8573fdd | |
| parent | f0d88dbc6bf6b06724edf942488a8e21050c9484 (diff) | |
support std for c++ modules/msvc
| -rw-r--r-- | core/src/xmake/engine.c | 2 | ||||
| -rw-r--r-- | core/src/xmake/makefile | 3 | ||||
| -rw-r--r-- | core/src/xmake/winos/short_path.c | 79 | ||||
| -rw-r--r-- | tests/projects/c++/modules/hello/src/main.cpp | 2 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/winos.lua | 9 | ||||
| -rw-r--r-- | xmake/modules/detect/sdks/find_vstudio.lua | 4 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/msvc.lua | 25 |
7 files changed, 120 insertions, 4 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c index 34ed7a196..53ec0d1d0 100644 --- a/core/src/xmake/engine.c +++ b/core/src/xmake/engine.c @@ -187,6 +187,7 @@ tb_int_t xm_winos_logical_drives(lua_State* lua); tb_int_t xm_winos_registry_query(lua_State* lua); tb_int_t xm_winos_registry_keys(lua_State* lua); tb_int_t xm_winos_registry_values(lua_State* lua); +tb_int_t xm_winos_short_path(lua_State* lua); #endif // the string functions @@ -301,6 +302,7 @@ static luaL_Reg const g_winos_functions[] = , { "registry_query", xm_winos_registry_query } , { "registry_keys", xm_winos_registry_keys } , { "registry_values", xm_winos_registry_values } +, { "short_path", xm_winos_short_path } , { tb_null, tb_null } }; #endif diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index f45d834e2..9e0a3decb 100644 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -145,7 +145,8 @@ xmake_C_FILES += \ winos/logical_drives \ winos/registry_keys \ winos/registry_values \ - winos/registry_query + winos/registry_query \ + winos/short_path endif # flags diff --git a/core/src/xmake/winos/short_path.c b/core/src/xmake/winos/short_path.c new file mode 100644 index 000000000..040b33209 --- /dev/null +++ b/core/src/xmake/winos/short_path.c @@ -0,0 +1,79 @@ +/*!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-present, TBOOX Open Source Group. + * + * @author ruki + * @file short_path.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "short_path" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ + +/* get windows short path from long path + * + * local short_path, errors = winos.short_path(long_path) + */ +tb_int_t xm_winos_short_path(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the arguments + tb_char_t const* long_path = luaL_checkstring(lua, 1); + tb_check_return_val(long_path, 0); + + // convert long path to wide characters + tb_wchar_t long_path_w[TB_PATH_MAXN]; + if (tb_atow(long_path_w, long_path, TB_PATH_MAXN) == (tb_size_t)-1) + { + lua_pushnil(lua); + lua_pushfstring(lua, "invalid long path: %s", long_path); + return 2; + } + + // get short path + tb_wchar_t short_path_w[TB_PATH_MAXN]; + if (GetShortPathNameW(long_path_w, short_path_w, TB_PATH_MAXN) == 0) + { + lua_pushnil(lua); + lua_pushfstring(lua, "cannot get short path from: %s", long_path); + return 2; + } + + // return result + tb_char_t* short_path_a = (tb_char_t*)long_path_w; + tb_size_t short_path_n = tb_wtoa(short_path_a, short_path_w, TB_PATH_MAXN); + if (short_path_n == (tb_size_t)-1) + { + lua_pushnil(lua); + lua_pushfstring(lua, "invalid short path from %s!", long_path); + return 2; + } + lua_pushlstring(lua, short_path_a, short_path_n); + return 1; +} diff --git a/tests/projects/c++/modules/hello/src/main.cpp b/tests/projects/c++/modules/hello/src/main.cpp index 175b4d348..1e5cc698f 100644 --- a/tests/projects/c++/modules/hello/src/main.cpp +++ b/tests/projects/c++/modules/hello/src/main.cpp @@ -3,4 +3,4 @@ import hello; int main() { hello::say("hello module!"); return 0; -}
\ No newline at end of file +} diff --git a/xmake/core/sandbox/modules/winos.lua b/xmake/core/sandbox/modules/winos.lua index 0a0192470..6bc5ce0c4 100644 --- a/xmake/core/sandbox/modules/winos.lua +++ b/xmake/core/sandbox/modules/winos.lua @@ -70,6 +70,15 @@ function sandbox_winos.registry_values(keypath) return values end +-- get short path +function sandbox_winos.short_path(long_path) + local short_path, errors = winos.short_path(long_path) + if not short_path then + raise(errors) + end + return short_path +end + -- return module return sandbox_winos diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua index 0abbb131c..0d3d98f2c 100644 --- a/xmake/modules/detect/sdks/find_vstudio.lua +++ b/xmake/modules/detect/sdks/find_vstudio.lua @@ -28,8 +28,8 @@ local vcvars = {"path", "libpath", "include", "DevEnvdir", - "VSINSTALLDIR", - "VCINSTALLDIR", + "VSInstallDir", + "VCInstallDir", "WindowsSdkDir", "WindowsLibPath", "WindowsSDKVersion", diff --git a/xmake/rules/c++/modules/build_modules/msvc.lua b/xmake/rules/c++/modules/build_modules/msvc.lua index 831b5cd88..8b28d68f6 100644 --- a/xmake/rules/c++/modules/build_modules/msvc.lua +++ b/xmake/rules/c++/modules/build_modules/msvc.lua @@ -37,7 +37,9 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) -- get output flag local cachedir local outputflag + local hasifc = false if compinst:has_flags("/ifcOutput") then + hasifc = true outputflag = "/ifcOutput" cachedir = path.join(target:autogendir(), "rules", "modules", "cache") if not os.isdir(cachedir) then @@ -66,6 +68,15 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) end assert(referenceflag, "compiler(msvc): does not support c++ module!") + -- get stdifcdir flag + local stdifcdirflag + if compinst:has_flags("/stdIfcDir") then + stdifcdirflag = "/stdIfcDir" + elseif compinst:has_flags("/module:stdIfcDir") then + stdifcdirflag = "/module:stdIfcDir" + end + assert(stdifcdirflag, "compiler(msvc): does not support c++ module!") + -- we need patch objectfiles to sourcebatch for linking module objects local modulefiles = {} sourcebatch.sourcekind = "cxx" @@ -116,6 +127,20 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) if cachedir then target:add("cxxflags", "/ifcSearchDir " .. os.args(cachedir)) end + if stdifcdirflag then + for _, toolchain_inst in ipairs(target:toolchains()) do + if toolchain_inst:name() == "msvc" then + local vcvars = toolchain_inst:config("vcvars") + if vcvars.VCInstallDir and vcvars.VCToolsVersion then + local stdifcdir = path.join(vcvars.VCInstallDir, "Tools", "MSVC", vcvars.VCToolsVersion, "ifc", target:is_arch("x64") and "x64" or "x86") + if os.isdir(stdifcdir) then + target:add("cxxflags", stdifcdirflag .. " " .. winos.short_path(stdifcdir)) + end + end + break + end + end + end -- build batchjobs local rootjob = opt.rootjob |
