diff options
| author | ruki <[email protected]> | 2024-02-19 23:09:59 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-02-19 23:09:59 +0800 |
| commit | a73fb131e47000b890e49b1918f36bf603c1b948 (patch) | |
| tree | 4a406a4c3c02adca9ce4c0170da17400621f61f5 | |
| parent | 49de9a9a700de09485b6a60eaff920fb3232302e (diff) | |
improve cmake minver
| -rw-r--r-- | xmake/plugins/project/cmake/cmakelists.lua | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua index c358d401f..5bbcf05fe 100644 --- a/xmake/plugins/project/cmake/cmakelists.lua +++ b/xmake/plugins/project/cmake/cmakelists.lua @@ -31,6 +31,7 @@ import("private.utils.batchcmds") import("private.utils.rule_groups") import("private.utils.target", {alias = "target_utils"}) import("plugins.project.utils.target_cmds", {rootdir = os.programdir()}) +import("rules.c++.modules.modules_support.compiler_support", {alias = "module_compiler_support", rootdir = os.programdir()}) -- get cmake version function _get_cmake_version() @@ -45,12 +46,28 @@ function _get_cmake_version() return cmake_version end +-- has c++ modules sources +function _has_cxxmodules_sources() + for _, target in ipairs(project.ordertargets()) do + if module_compiler_support.contains_modules(target) then + return true + end + end +end + -- get minimal cmake version function _get_cmake_minver() local cmake_minver = _g.cmake_minver if not cmake_minver then cmake_minver = _get_cmake_version() - if not cmake_minver or cmake_minver:gt("3.15.0") then + if cmake_minver then + if _has_cxxmodules_sources() and cmake_minver:gt("3.28.0") then + cmake_minver = semver.new("3.28.0") + elseif cmake_minver:gt("3.15.0") then + cmake_minver = semver.new("3.15.0") + end + end + if not cmake_minver then cmake_minver = semver.new("3.15.0") end _g.cmake_minver = cmake_minver @@ -113,10 +130,10 @@ function _get_relative_unix_path_to_cmake(filepath, outputdir) return os.args(filepath) end --- get enabled languages from targets -function _get_project_languages(targets) +-- get enabled languages +function _get_project_languages() local languages = {} - for _, target in table.orderpairs(targets) do + for _, target in ipairs(project.ordertargets()) do for _, sourcekind in ipairs(target:sourcekinds()) do if sourcekind == "cc" then table.insert(languages, "C") elseif sourcekind == "cxx" then table.insert(languages, "CXX") @@ -146,8 +163,8 @@ end -- Did the current cmake native support for c++ modules? function _can_native_support_for_cxxmodules() - local cmake_version = _get_cmake_version() - if cmake_version and cmake_version:ge("3.28") then + local cmake_minver = _get_cmake_minver() + if cmake_minver and cmake_minver:ge("3.28") then return true end end @@ -234,16 +251,16 @@ function _get_flags_from_target(target, flagkind) end -- add project info -function _add_project(cmakelists, languages, outputdir) +function _add_project(cmakelists, outputdir) - local cmake_version = _get_cmake_minver() + local cmake_minver = _get_cmake_minver() cmakelists:print([[# this is the build file for project %s # it is autogenerated by the xmake build system. # do not edit by hand. ]], project.name() or "") cmakelists:print("# project") - cmakelists:print("cmake_minimum_required(VERSION %s)", cmake_version) - if cmake_version:ge("3.15.0") then + cmakelists:print("cmake_minimum_required(VERSION %s)", cmake_minver) + if cmake_minver:ge("3.15.0") then -- for MSVC_RUNTIME_LIBRARY cmakelists:print("cmake_policy(SET CMP0091 NEW)") end @@ -260,6 +277,7 @@ function _add_project(cmakelists, languages, outputdir) if project_version then project_info = project_info .. " VERSION " .. project_version end + local languages = _get_project_languages() if languages then cmakelists:print("project(%s%s LANGUAGES %s)", project_name, project_info, table.concat(languages, " ")) else @@ -840,7 +858,7 @@ function _add_target_link_libraries(cmakelists, target, outputdir) cmakelists:print(")") end - -- ignore c++ modules rules + -- get c++ modules rules local cxxmodules_rules if _can_native_support_for_cxxmodules() then cxxmodules_rules = _get_cxxmodules_rules() @@ -1130,7 +1148,7 @@ end function _generate_cmakelists(cmakelists, outputdir) -- add project info - _add_project(cmakelists, _get_project_languages(project.targets()), outputdir) + _add_project(cmakelists, outputdir) -- add targets for _, target in table.orderpairs(project.targets()) do |
