diff options
| author | ruki <[email protected]> | 2020-09-07 23:03:37 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-09-07 23:03:37 +0800 |
| commit | 219a220ae31f482fdc95a21f1a479709d562c6cd (patch) | |
| tree | 3bf620d4ea7198ebd66e3a90cfdf16d80fe205fb | |
| parent | 813c160027d341232fae4612b1d89b2ded8eabad (diff) | |
add mingw toolchain to trybuild/cmake
| -rw-r--r-- | xmake/modules/package/tools/cmake.lua | 154 | ||||
| -rw-r--r-- | xmake/modules/private/action/trybuild/cmake.lua | 145 |
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? |
