summaryrefslogtreecommitdiff
path: root/xmake/modules/package/tools/cmake.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/modules/package/tools/cmake.lua')
-rw-r--r--xmake/modules/package/tools/cmake.lua154
1 files changed, 129 insertions, 25 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