diff options
Diffstat (limited to 'xmake/modules/package/tools/cmake.lua')
| -rw-r--r-- | xmake/modules/package/tools/cmake.lua | 154 |
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 |
