summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-09-07 23:03:37 +0800
committerruki <[email protected]>2020-09-07 23:03:37 +0800
commit219a220ae31f482fdc95a21f1a479709d562c6cd (patch)
tree3bf620d4ea7198ebd66e3a90cfdf16d80fe205fb
parent813c160027d341232fae4612b1d89b2ded8eabad (diff)
add mingw toolchain to trybuild/cmake
-rw-r--r--xmake/modules/package/tools/cmake.lua154
-rw-r--r--xmake/modules/private/action/trybuild/cmake.lua145
2 files changed, 257 insertions, 42 deletions
diff --git a/xmake/modules/package/tools/cmake.lua b/xmake/modules/package/tools/cmake.lua
index 0a73b09ee..0ee40f4dd 100644
--- a/xmake/modules/package/tools/cmake.lua
+++ b/xmake/modules/package/tools/cmake.lua
@@ -24,32 +24,140 @@ import("core.tool.toolchain")
import("lib.detect.find_file")
import("lib.detect.find_tool")
+-- get configs for windows
+function _get_configs_for_windows(package, configs)
+ if package:is_arch("x64") then
+ table.insert(configs, "-A")
+ table.insert(configs, "x64")
+ end
+ local vs_runtime = package:config("vs_runtime")
+ if vs_runtime then
+ table.insert(configs, '-DCMAKE_CXX_FLAGS_DEBUG="/' .. vs_runtime .. 'd"')
+ table.insert(configs, '-DCMAKE_CXX_FLAGS_RELEASE="/' .. vs_runtime .. '"')
+ table.insert(configs, '-DCMAKE_C_FLAGS_DEBUG="/' .. vs_runtime .. 'd"')
+ table.insert(configs, '-DCMAKE_C_FLAGS_RELEASE="/' .. vs_runtime .. '"')
+ end
+end
+
+-- get configs for android
+function _get_configs_for_android(package, configs)
+
+ -- https://developer.android.google.cn/ndk/guides/cmake
+ local ndk = get_config("ndk")
+ if ndk and os.isdir(ndk) then
+ local ndk_sdkver = get_config("ndk_sdkver")
+ local ndk_cxxstl = get_config("ndk_cxxstl")
+ table.insert(configs, "-DCMAKE_TOOLCHAIN_FILE=" .. path.join(ndk, "build/cmake/android.toolchain.cmake"))
+ table.insert(configs, "-DANDROID_ABI=" .. package:arch())
+ if ndk_sdkver then
+ table.insert(configs, "-DANDROID_NATIVE_API_LEVEL=" .. ndk_sdkver)
+ end
+ if ndk_cxxstl then
+ table.insert(configs, "-DANDROID_STL=" .. ndk_cxxstl)
+ end
+ end
+end
+
+-- get configs for iphoneos
+function _get_configs_for_iphoneos(package, configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags"))
+ local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags"))
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("shflags")), ' ')
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ envs.CMAKE_OSX_SYSROOT = ""
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
+-- get configs for mingw
+function _get_configs_for_mingw(package, configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags"))
+ local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags"))
+ local sdkdir = package:build_getenv("mingw") or package:build_getenv("sdk")
+ envs.CMAKE_C_COMPILER = package:build_getenv("cc")
+ envs.CMAKE_CXX_COMPILER = package:build_getenv("cxx")
+ envs.CMAKE_ASM_COMPILER = package:build_getenv("as")
+ envs.CMAKE_AR = package:build_getenv("ar")
+ envs.CMAKE_LINKER = package:build_getenv("ld")
+ envs.CMAKE_RANLIB = package:build_getenv("ranlib")
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("shflags")), ' ')
+ envs.CMAKE_SYSTEM_NAME = "Windows"
+ -- avoid find and add system include/library path
+ envs.CMAKE_FIND_ROOT_PATH = sdkdir
+ envs.CMAKE_SYSROOT = sdkdir
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ -- avoid add -isysroot on macOS
+ envs.CMAKE_OSX_SYSROOT = ""
+ -- Avoid cmake to add the flags -search_paths_first and -headerpad_max_install_names on macOS
+ envs.HAVE_FLAG_SEARCH_PATHS_FIRST = "0"
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
+-- get configs for cross
+function _get_configs_for_cross(package, configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags"))
+ local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags"))
+ local sdkdir = package:build_getenv("sdk")
+ envs.CMAKE_C_COMPILER = package:build_getenv("cc")
+ envs.CMAKE_CXX_COMPILER = package:build_getenv("cxx")
+ envs.CMAKE_ASM_COMPILER = package:build_getenv("as")
+ envs.CMAKE_AR = package:build_getenv("ar")
+ envs.CMAKE_LINKER = package:build_getenv("ld")
+ envs.CMAKE_RANLIB = package:build_getenv("ranlib")
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("shflags")), ' ')
+ -- avoid find and add system include/library path
+ envs.CMAKE_FIND_ROOT_PATH = sdkdir
+ envs.CMAKE_SYSROOT = sdkdir
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ -- avoid add -isysroot on macOS
+ envs.CMAKE_OSX_SYSROOT = ""
+ -- Avoid cmake to add the flags -search_paths_first and -headerpad_max_install_names on macOS
+ envs.HAVE_FLAG_SEARCH_PATHS_FIRST = "0"
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
-- get configs
function _get_configs(package, configs)
local configs = configs or {}
if package:is_plat("windows") then
- local vs_runtime = package:config("vs_runtime")
- if vs_runtime then
- table.insert(configs, '-DCMAKE_CXX_FLAGS_DEBUG="/' .. vs_runtime .. 'd"')
- table.insert(configs, '-DCMAKE_CXX_FLAGS_RELEASE="/' .. vs_runtime .. '"')
- table.insert(configs, '-DCMAKE_C_FLAGS_DEBUG="/' .. vs_runtime .. 'd"')
- table.insert(configs, '-DCMAKE_C_FLAGS_RELEASE="/' .. vs_runtime .. '"')
- end
+ _get_configs_for_windows(package, configs)
elseif package:is_plat("android") then
- -- https://developer.android.google.cn/ndk/guides/cmake
- local ndk = get_config("ndk")
- if ndk and os.isdir(ndk) then
- local ndk_sdkver = get_config("ndk_sdkver")
- local ndk_cxxstl = get_config("ndk_cxxstl")
- table.insert(configs, "-DCMAKE_TOOLCHAIN_FILE=" .. path.join(ndk, "build/cmake/android.toolchain.cmake"))
- table.insert(configs, "-DANDROID_ABI=" .. package:arch())
- if ndk_sdkver then
- table.insert(configs, "-DANDROID_NATIVE_API_LEVEL=" .. ndk_sdkver)
- end
- if ndk_cxxstl then
- table.insert(configs, "-DANDROID_STL=" .. ndk_cxxstl)
- end
- end
+ _get_configs_for_android(package, configs)
+ elseif package:is_plat("iphoneos") then
+ _get_configs_for_iphoneos(package, configs)
+ elseif package:is_plat("mingw") then
+ _get_configs_for_mingw(package, configs)
+ elseif not package:is_plat(os.subhost()) then
+ _get_configs_for_cross(package, configs)
end
local cflags = package:config("cflags")
if cflags then
@@ -111,10 +219,6 @@ function build(package, configs, opt)
-- LIBDIR: object code libraries (lib or lib64 or lib/<multiarch-tuple> on Debian)
--
local argv = {"-DCMAKE_INSTALL_PREFIX=" .. path.absolute("install"), "-DCMAKE_INSTALL_LIBDIR=" .. path.absolute("install/lib")}
- if package:is_plat("windows") and package:is_arch("x64") then
- table.insert(argv, "-A")
- table.insert(argv, "x64")
- end
-- pass configurations
for name, value in pairs(_get_configs(package, configs)) do
diff --git a/xmake/modules/private/action/trybuild/cmake.lua b/xmake/modules/private/action/trybuild/cmake.lua
index 5ec6a6506..b6a899577 100644
--- a/xmake/modules/private/action/trybuild/cmake.lua
+++ b/xmake/modules/private/action/trybuild/cmake.lua
@@ -23,6 +23,7 @@ import("core.base.cli")
import("core.base.option")
import("core.project.config")
import("core.tool.toolchain")
+import("core.platform.platform")
import("lib.detect.find_file")
import("lib.detect.find_tool")
@@ -36,6 +37,126 @@ function _get_artifacts_dir()
return path.absolute(path.join(_get_buildir(), "artifacts"))
end
+-- get the build environment
+function _get_buildenv(key)
+ local value = config.get(key)
+ if value == nil then
+ value = platform.toolconfig(key, config.plat())
+ end
+ if value == nil then
+ value = platform.tool(key, config.plat())
+ end
+ return value
+end
+
+-- get configs for android
+function _get_configs_for_android(configs)
+ -- https://developer.android.google.cn/ndk/guides/cmake
+ local ndk = config.get("ndk")
+ if ndk and os.isdir(ndk) then
+ local arch = config.arch()
+ local ndk_sdkver = config.get("ndk_sdkver")
+ local ndk_cxxstl = config.get("ndk_cxxstl")
+ table.insert(configs, "-DCMAKE_TOOLCHAIN_FILE=" .. path.join(ndk, "build/cmake/android.toolchain.cmake"))
+ if arch then
+ table.insert(configs, "-DANDROID_ABI=" .. arch)
+ end
+ if ndk_sdkver then
+ table.insert(configs, "-DANDROID_NATIVE_API_LEVEL=" .. ndk_sdkver)
+ end
+ if ndk_cxxstl then
+ table.insert(configs, "-DANDROID_STL=" .. ndk_cxxstl)
+ end
+ end
+end
+
+-- get configs for iphoneos
+function _get_configs_for_iphoneos(configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cflags"))
+ local cxxflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cxxflags"))
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(_get_buildenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("shflags")), ' ')
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ envs.CMAKE_OSX_SYSROOT = ""
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
+-- get configs for mingw
+function _get_configs_for_mingw(configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cflags"))
+ local cxxflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cxxflags"))
+ local sdkdir = _get_buildenv("mingw") or _get_buildenv("sdk")
+ envs.CMAKE_C_COMPILER = _get_buildenv("cc")
+ envs.CMAKE_CXX_COMPILER = _get_buildenv("cxx")
+ envs.CMAKE_ASM_COMPILER = _get_buildenv("as")
+ envs.CMAKE_AR = _get_buildenv("ar")
+ envs.CMAKE_LINKER = _get_buildenv("ld")
+ envs.CMAKE_RANLIB = _get_buildenv("ranlib")
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(_get_buildenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("shflags")), ' ')
+ envs.CMAKE_SYSTEM_NAME = "Windows"
+ -- avoid find and add system include/library path
+ envs.CMAKE_FIND_ROOT_PATH = sdkdir
+ envs.CMAKE_SYSROOT = sdkdir
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ -- avoid add -isysroot on macOS
+ envs.CMAKE_OSX_SYSROOT = ""
+ -- Avoid cmake to add the flags -search_paths_first and -headerpad_max_install_names on macOS
+ envs.HAVE_FLAG_SEARCH_PATHS_FIRST = "0"
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
+-- get configs for cross
+function _get_configs_for_cross(configs)
+ local envs = {}
+ local cflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cflags"))
+ local cxxflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cxxflags"))
+ local sdkdir = _get_buildenv("sdk")
+ envs.CMAKE_C_COMPILER = _get_buildenv("cc")
+ envs.CMAKE_CXX_COMPILER = _get_buildenv("cxx")
+ envs.CMAKE_ASM_COMPILER = _get_buildenv("as")
+ envs.CMAKE_AR = _get_buildenv("ar")
+ envs.CMAKE_LINKER = _get_buildenv("ld")
+ envs.CMAKE_RANLIB = _get_buildenv("ranlib")
+ envs.CMAKE_C_FLAGS = table.concat(cflags, ' ')
+ envs.CMAKE_CXX_FLAGS = table.concat(cxxflags, ' ')
+ envs.CMAKE_ASM_FLAGS = table.concat(table.wrap(_get_buildenv("asflags")), ' ')
+ envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("arflags")), ' ')
+ envs.CMAKE_EXE_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("ldflags")), ' ')
+ envs.CMAKE_SHARED_LINKER_FLAGS = table.concat(table.wrap(_get_buildenv("shflags")), ' ')
+ -- avoid find and add system include/library path
+ envs.CMAKE_FIND_ROOT_PATH = sdkdir
+ envs.CMAKE_SYSROOT = sdkdir
+ envs.CMAKE_FIND_ROOT_PATH_MODE_LIBRARY = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_INCLUDE = "ONLY"
+ envs.CMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "NEVER"
+ -- avoid add -isysroot on macOS
+ envs.CMAKE_OSX_SYSROOT = ""
+ -- Avoid cmake to add the flags -search_paths_first and -headerpad_max_install_names on macOS
+ envs.HAVE_FLAG_SEARCH_PATHS_FIRST = "0"
+ for k, v in pairs(envs) do
+ table.insert(configs, "-D" .. k .. "=" .. v)
+ end
+end
+
-- get configs
function _get_configs(artifacts_dir)
@@ -45,23 +166,13 @@ function _get_configs(artifacts_dir)
table.insert(configs, "-A")
table.insert(configs, "x64")
elseif is_plat("android") then
- -- https://developer.android.google.cn/ndk/guides/cmake
- local ndk = config.get("ndk")
- if ndk and os.isdir(ndk) then
- local arch = config.arch()
- local ndk_sdkver = config.get("ndk_sdkver")
- local ndk_cxxstl = config.get("ndk_cxxstl")
- table.insert(configs, "-DCMAKE_TOOLCHAIN_FILE=" .. path.join(ndk, "build/cmake/android.toolchain.cmake"))
- if arch then
- table.insert(configs, "-DANDROID_ABI=" .. arch)
- end
- if ndk_sdkver then
- table.insert(configs, "-DANDROID_NATIVE_API_LEVEL=" .. ndk_sdkver)
- end
- if ndk_cxxstl then
- table.insert(configs, "-DANDROID_STL=" .. ndk_cxxstl)
- end
- end
+ _get_configs_for_android(configs)
+ elseif is_plat("iphoneos") then
+ _get_configs_for_iphoneos(configs)
+ elseif is_plat("mingw") then
+ _get_configs_for_mingw(configs)
+ elseif not is_plat(os.subhost()) then
+ _get_configs_for_cross(configs)
end
-- enable verbose?