diff options
Diffstat (limited to 'xmake/modules/package/tools/cmake.lua')
| -rw-r--r-- | xmake/modules/package/tools/cmake.lua | 171 |
1 files changed, 80 insertions, 91 deletions
diff --git a/xmake/modules/package/tools/cmake.lua b/xmake/modules/package/tools/cmake.lua index cbf9bcb37..684c522e8 100644 --- a/xmake/modules/package/tools/cmake.lua +++ b/xmake/modules/package/tools/cmake.lua @@ -315,6 +315,13 @@ function _get_shflags(package, opt) end end +-- get arflags +function _get_arflags(package, opt) + local result = table.wrap(package:build_getenv("arflags")) + if #result > 0 then + return os.args(_translate_paths(result)) + end +end -- get cmake version function _get_cmake_version() local cmake_version = _g.cmake_version @@ -401,27 +408,6 @@ end -- get configs for generic function _get_configs_for_generic(package, configs, opt) local envs = {} - local cflags = _get_cflags(package, opt) - if cflags then - envs.CMAKE_C_FLAGS = cflags - end - local cxxflags = _get_cxxflags(package, opt) - if cxxflags then - envs.CMAKE_CXX_FLAGS = cxxflags - end - local asflags = _get_asflags(package, opt) - if asflags then - envs.CMAKE_ASM_FLAGS = asflags - end - local ldflags = _get_ldflags(package, opt) - if ldflags then - envs.CMAKE_EXE_LINKER_FLAGS = ldflags - end - local shflags = _get_shflags(package, opt) - if shflags then - envs.CMAKE_SHARED_LINKER_FLAGS = shflags - envs.CMAKE_MODULE_LINKER_FLAGS = shflags - end if not package:is_plat("windows", "mingw") and package:config("pic") ~= false then envs.CMAKE_POSITION_INDEPENDENT_CODE = "ON" end @@ -461,12 +447,9 @@ function _get_configs_for_windows(package, configs, opt) -- use clang-cl or clang, and we need pass --target=xxx flags if package:has_tool("cc", "clang", "clang_cl") then envs.CMAKE_C_COMPILER = _translate_bin_path(package:build_getenv("cc")) - -- @see https://github.com/xmake-io/xmake-repo/issues/7662 - envs.CMAKE_C_FLAGS = _get_cflags(package, {cross = true}) end if package:has_tool("cxx", "clang", "clang_cl") then envs.CMAKE_CXX_COMPILER = _translate_bin_path(package:build_getenv("cxx")) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, {cross = true}) end -- we maybe need patch `cmake_policy(SET CMP0091 NEW)` to enable this argument for some packages @@ -535,13 +518,6 @@ function _get_configs_for_appleos(package, configs, opt) opt = opt or {} local envs = {} opt.cross = true - envs.CMAKE_C_FLAGS = _get_cflags(package, opt) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, opt) - envs.CMAKE_ASM_FLAGS = _get_asflags(package, opt) - envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') - envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, opt) - envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, opt) - envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, opt) -- https://cmake.org/cmake/help/v3.17/manual/cmake-toolchains.7.html#id25 if package:is_plat("watchos") then envs.CMAKE_SYSTEM_NAME = "watchOS" @@ -580,13 +556,6 @@ function _get_configs_for_mingw(package, configs, opt) envs.CMAKE_AR = _translate_bin_path(package:build_getenv("ar")) envs.CMAKE_RANLIB = _translate_bin_path(package:build_getenv("ranlib")) envs.CMAKE_RC_COMPILER = _translate_bin_path(package:build_getenv("mrc")) - envs.CMAKE_C_FLAGS = _get_cflags(package, opt) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, opt) - envs.CMAKE_ASM_FLAGS = _get_asflags(package, opt) - envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') - envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, opt) - envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, opt) - envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, opt) -- @see https://cmake.org/cmake/help/latest/variable/CMAKE_CROSSCOMPILING.html -- https://github.com/xmake-io/xmake/pull/5888 if not is_host("windows") then @@ -633,15 +602,6 @@ function _get_configs_for_wasm(package, configs, opt) end end - -- pass toolchain flags cross-compilation - -- @see https://github.com/xmake-io/xmake/issues/6690 - envs.CMAKE_C_FLAGS = _get_cflags(package, {cross = true}) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, {cross = true}) - envs.CMAKE_ASM_FLAGS = _get_asflags(package, {cross = true}) - envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, {cross = true}) - envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, {cross = true}) - envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, {cross = true}) - -- avoid find and add system include/library path -- @see https://github.com/xmake-io/xmake/issues/5577 -- https://github.com/emscripten-core/emscripten/issues/13310 @@ -679,14 +639,7 @@ function _get_configs_for_cross(package, configs, opt) if package:has_tool("ld", "gxx", "clangxx") then envs.CMAKE_CXX_LINK_EXECUTABLE = ld .. " <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" end - envs.CMAKE_RANLIB = _translate_bin_path(package:build_getenv("ranlib")) - envs.CMAKE_C_FLAGS = _get_cflags(package, opt) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, opt) - envs.CMAKE_ASM_FLAGS = _get_asflags(package, opt) - envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') - envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, opt) - envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, opt) - envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, opt) + envs.CMAKE_RANLIB = _translate_bin_path(package:build_getenv("ranlib")) -- we don't need to set it as cross compilation if we just pass toolchain -- https://github.com/xmake-io/xmake/issues/2170 if package:is_cross() then @@ -743,14 +696,7 @@ function _get_configs_for_host_toolchain(package, configs, opt) if package:has_tool("ld", "gxx", "clangxx") then envs.CMAKE_CXX_LINK_EXECUTABLE = ld .. " <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" end - envs.CMAKE_RANLIB = _translate_bin_path(package:build_getenv("ranlib")) - envs.CMAKE_C_FLAGS = _get_cflags(package, opt) - envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, opt) - envs.CMAKE_ASM_FLAGS = _get_asflags(package, opt) - envs.CMAKE_STATIC_LINKER_FLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') - envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, opt) - envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, opt) - envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, opt) + envs.CMAKE_RANLIB = _translate_bin_path(package:build_getenv("ranlib")) -- we don't need to set it as cross compilation if we just pass toolchain -- https://github.com/xmake-io/xmake/issues/2170 if package:is_cross() then @@ -866,21 +812,23 @@ function _get_default_flags(package, configs, buildtype, opt) local runenvs = opt.envs or buildenvs(package) local cmake = find_tool("cmake") - local _configs = table.join(configs, "-S " .. path.directory(dummy_cmakelist), "-B " .. tmpdir, cflags or {}, cxxflags) + local _configs = table.join(configs, "-S", path.directory(dummy_cmakelist), "-B", tmpdir, cflags or {}, cxxflags) local outdata = try{ function() return os.iorunv(cmake.program, _configs, {envs = runenvs}) end} if outdata and outdata ~= "" then cmake_default_flags = {} - cmake_default_flags.cflags = outdata:match("CMAKE_C_FLAGS is (.-)\n") or " " - cmake_default_flags.cflags = cmake_default_flags.cflags .. " " .. outdata:match(format("CMAKE_C_FLAGS_%s is (.-)\n", buildtype)):replace("/MDd", ""):replace("/MD", "") - cmake_default_flags.cxxflags = outdata:match("CMAKE_CXX_FLAGS is (.-)\n") or " " - cmake_default_flags.cxxflags = cmake_default_flags.cxxflags .. " " .. outdata:match(format("CMAKE_CXX_FLAGS_%s is (.-)\n", buildtype)):replace("/MDd", ""):replace("/MD", "") - cmake_default_flags.ldflags = outdata:match("CMAKE_EXE_LINKER_FLAGS is (.-)\n") or " " - cmake_default_flags.ldflags = cmake_default_flags.ldflags .. " " .. outdata:match(format("CMAKE_EXE_LINKER_FLAGS_%s is (.-)\n", buildtype)) - cmake_default_flags.shflags = outdata:match("CMAKE_SHARED_LINKER_FLAGS is (.-)\n") or " " - cmake_default_flags.shflags = cmake_default_flags.shflags .. " " .. outdata:match(format("CMAKE_SHARED_LINKER_FLAGS_%s is (.-)\n", buildtype)) - cmake_default_flags.arflags = outdata:match("CMAKE_STATIC_LINKER_FLAGS is (.-)\n") or " " - cmake_default_flags.arflags = cmake_default_flags.arflags .. " " ..outdata:match(format("CMAKE_STATIC_LINKER_FLAGS_%s is (.-)\n", buildtype)) - + cmake_default_flags.CMAKE_C_FLAGS = outdata:match("CMAKE_C_FLAGS is (.-)\n") + cmake_default_flags["CMAKE_C_FLAGS_" .. buildtype] = outdata:match(format("CMAKE_C_FLAGS_%s is (.-)\n", buildtype)) + cmake_default_flags.CMAKE_CXX_FLAGS = outdata:match("CMAKE_CXX_FLAGS is (.-)\n") + cmake_default_flags["CMAKE_CXX_FLAGS_" .. buildtype] = outdata:match(format("CMAKE_CXX_FLAGS_%s is (.-)\n", buildtype)) + cmake_default_flags.CMAKE_CXX_FLAGS = outdata:match("CMAKE_CXX_FLAGS is (.-)\n") + cmake_default_flags["CMAKE_EXE_LINKER_FLAGS_" .. buildtype] = outdata:match(format("CMAKE_EXE_LINKER_FLAGS_%s is (.-)\n", buildtype)) + cmake_default_flags.CMAKE_SHARED_LINKER_FLAGS = outdata:match("CMAKE_SHARED_LINKER_FLAGS is (.-)\n") + cmake_default_flags["CMAKE_SHARED_LINKER_FLAGS_" .. buildtype] = outdata:match(format("CMAKE_SHARED_LINKER_FLAGS_%s is (.-)\n", buildtype)) + cmake_default_flags.CMAKE_STATIC_LINKER_FLAGS = outdata:match("CMAKE_STATIC_LINKER_FLAGS is (.-)\n") + cmake_default_flags["CMAKE_STATIC_LINKER_FLAGS_" .. buildtype] = outdata:match(format("CMAKE_STATIC_LINKER_FLAGS_%s is (.-)\n", buildtype)) + for k, v in ipairs(cmake_default_flags) do + cmake_default_flags[k] = v:replace("/M[DT]d", ""):replace("/M[DT]", "") + end _g.cmake_default_flags = _g.cmake_default_flags or {} _g.cmake_default_flags[cachekey] = cmake_default_flags end @@ -905,25 +853,30 @@ function _get_envs_for_default_flags(package, configs, opt) local default_flags = _get_default_flags(package, configs, buildtype, opt) if default_flags then if not opt.cxxflags and not opt.cxflags then - envs[format("CMAKE_CXX_FLAGS_%s", buildtype)] = default_flags.cxxflags + envs.CMAKE_CXX_FLAGS = default_flags.CMAKE_CXX_FLAGS + envs["CMAKE_CXX_FLAGS_" .. buildtype] = default_flags["CMAKE_CXX_FLAGS_" .. buildtype] end if not opt.cflags and not opt.cxflags then - envs[format("CMAKE_C_FLAGS_%s", buildtype)] = default_flags.cflags + envs.CMAKE_C_FLAGS = default_flags.CMAKE_C_FLAGS + envs["CMAKE_C_FLAGS_" .. buildtype] = default_flags["CMAKE_C_FLAGS_" .. buildtype] end if not opt.ldflags then - envs[format("CMAKE_EXE_LINKER_FLAGS_%s", buildtype)] = default_flags.ldflags + envs.CMAKE_EXE_LINKER_FLAGS = default_flags.CMAKE_EXE_LINKER_FLAGS + envs["CMAKE_EXE_LINKER_FLAGS_" .. buildtype] = default_flags["CMAKE_EXE_LINKER_FLAGS_" .. buildtype] end if not opt.arflags then - envs[format("CMAKE_STATIC_LINKER_FLAGS_%s", buildtype)] = default_flags.arflags + envs.CMAKE_STATIC_LINKER_FLAGS = default_flags.CMAKE_STATIC_LINKER_FLAGS + envs["CMAKE_STATIC_LINKER_FLAGS_" .. buildtype] = default_flags["CMAKE_STATIC_LINKER_FLAGS_" .. buildtype] end if not opt.shflags then - envs[format("CMAKE_SHARED_LINKER_FLAGS_%s", buildtype)] = default_flags.shflags + envs.CMAKE_SHARED_LINKER_FLAGS = default_flags.CMAKE_SHARED_LINKER_FLAGS + envs["CMAKE_SHARED_LINKER_FLAGS_" .. buildtype] = default_flags["CMAKE_SHARED_LINKER_FLAGS_" .. buildtype] end end return envs end -function _get_envs_for_runtime_flags(package, configs, opt) +function _get_envs_for_runtime_flags(package, opt) local buildtype = _get_cmake_buildtype(package) local envs = {} local runtimes = package:runtimes() @@ -938,6 +891,45 @@ function _get_envs_for_runtime_flags(package, configs, opt) return envs end +function _get_envs_for_flags(package, configs, opt) + -- get the default envs + local envs = _get_envs_for_default_flags(package, configs, opt) or {} + local runtime_envs = _get_envs_for_runtime_flags(package, opt) + if runtime_envs then + for name, value in pairs(runtime_envs) do + envs[name] = (envs[name] or " ") .. " " .. table.concat(value, " ") + end + end + + -- get the platform/toolchain envs + local platform_envs = {} + if package:is_plat("windows") then + -- use clang-cl or clang, and we need pass --target=xxx flags + if package:has_tool("cc", "clang", "clang_cl") then + -- @see https://github.com/xmake-io/xmake-repo/issues/7662 + platform_envs.CMAKE_C_FLAGS = _get_cflags(package, {cross = true}) + end + if package:has_tool("cxx", "clang", "clang_cl") then + platform_envs.CMAKE_CXX_FLAGS = _get_cxxflags(package, {cross = true}) + end + elseif package:is_plat("wasm") then + -- pass toolchain flags cross-compilation + -- @see https://github.com/xmake-io/xmake/issues/6690 + opt.cross = true + end + platform_envs.CMAKE_C_FLAGS = platform_envs.CMAKE_C_FLAGS or _get_cflags(package, opt) + platform_envs.CMAKE_CXX_FLAGS = platform_envs.CMAKE_CXX_FLAGS or _get_cxxflags(package, opt) + platform_envs.CMAKE_ASM_FLAGS = _get_asflags(package, opt) + platform_envs.CMAKE_EXE_LINKER_FLAGS = _get_ldflags(package, opt) + platform_envs.CMAKE_SHARED_LINKER_FLAGS = _get_shflags(package, opt) + platform_envs.CMAKE_MODULE_LINKER_FLAGS = _get_shflags(package, opt) + platform_envs.CMAKE_STATIC_LINKER_FLAGS = _get_arflags(package, opt) + for name, value in pairs(platform_envs) do + envs[name] = (envs[name] or " ") .. " " .. value + end + return envs +end + function _get_configs(package, configs, opt) configs = configs or {} opt._configs_str = string.serialize(configs, {indent = false, strip = true}) @@ -975,22 +967,19 @@ function _get_configs(package, configs, opt) table.insert(configs, "-DCMAKE_POLICY_VERSION_MINIMUM=3.5") end - local envs = _get_envs_for_default_flags(package, configs, opt) - local runtime_envs = _get_envs_for_runtime_flags(package, configs, opt) - if runtime_envs then - envs = envs or {} - for name, value in pairs(runtime_envs) do - envs[name] = (envs[name] or " ") .. " " .. table.concat(value, " ") - end - end - _insert_configs_from_envs(configs, envs or {}, opt) + -- insert flags to configs + -- + -- @note We need to rely on configs to get the exact default flags + -- @see https://github.com/xmake-io/xmake/issues/6781 + local envs = _get_envs_for_flags(package, configs, opt) + _insert_configs_from_envs(configs, envs, opt) + -- enable ccache? local ccache = package:data("ccache") if ccache then table.insert(configs, "-DCMAKE_C_COMPILER_LAUNCHER=" .. ccache) table.insert(configs, "-DCMAKE_CXX_COMPILER_LAUNCHER=" .. ccache) end - return configs end |
