Skip to content

Commit

Permalink
optim: reduce the time msvc takes to find modules
Browse files Browse the repository at this point in the history
  • Loading branch information
z1turn0 committed Jan 31, 2024
1 parent c45bf27 commit e48903b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 23 deletions.
18 changes: 16 additions & 2 deletions src/群友提交/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,33 @@ include(CheckLoserHomeWork)
set(CMAKE_CXX_STANDARD 26)

if (MSVC)
set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7") #for cmake 3.27
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /permissive-")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
enable_msvc_build_stl_modules()

string(REGEX REPLACE "\/bin\/Host(x|X)(64|86)\/x(64|86)\/cl\.exe" "" MSVC_ROOT "${CMAKE_CXX_COMPILER}")
# std.ixx
configure_file("${MSVC_ROOT}/modules/std.ixx" "${PROJECT_BINARY_DIR}/std.ixx" COPYONLY)
# std.compat.ixx
configure_file("${MSVC_ROOT}/modules/std.compat.ixx" "${PROJECT_BINARY_DIR}/std.compat.ixx" COPYONLY)
endif ()

set(homework_dir ${CMAKE_CURRENT_SOURCE_DIR})
handle_homework(${homework_dir} targets_list run_targets_list)

if (MSVC)
foreach (target ${targets_list})
target_compile_options(${target} PRIVATE "/experimental:module")
get_target_property(use_modules ${target} use_modules)
if(use_modules)
target_compile_options(${target} PRIVATE "/experimental:module")
target_sources(${target}
PUBLIC
FILE_SET cxx_modules TYPE CXX_MODULES BASE_DIRS ${PROJECT_BINARY_DIR}
FILES ${PROJECT_BINARY_DIR}/std.ixx ${PROJECT_BINARY_DIR}/std.compat.ixx
)
endif(use_modules)
endforeach ()
endif ()

Expand Down
36 changes: 15 additions & 21 deletions src/群友提交/cmake/CheckLoserHomeWork.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ function(is_target_compiler cpp_file _ret)
set(${_ret} true PARENT_SCOPE)
endfunction()

function(is_use_modules cpp_file _ret)
set(${_ret} false PARENT_SCOPE)
file(STRINGS ${cpp_file} lines)
if("${lines}" MATCHES "import")
set(${_ret} true PARENT_SCOPE)
endif ()
endfunction()

function(add_homework_target target question_index cpp_file)
message(STATUS "add executable: ${target_name} ${cpp_file}")
add_executable (${target} ${cpp_file})
Expand Down Expand Up @@ -146,6 +154,13 @@ function(handle_homework homework_dir _targets_list _run_targets_list)
get_homework_target_name(${index} ${cpp_file} target)
add_homework_target(${target} ${index} ${cpp_file})
list(APPEND targets_list ${target})
is_use_modules(${cpp_file} use_modules)
set_target_properties(${target}
PROPERTIES use_modules ${use_modules})
if(use_modules)
message(NOTICE "${target}: use modules")
endif()

is_check_run(${cpp_file} check_run)
if(check_run)
add_run_homework_target("run_${target}" ${target} add_run_ret)
Expand All @@ -159,25 +174,4 @@ function(handle_homework homework_dir _targets_list _run_targets_list)
endforeach()
set(${_targets_list} ${targets_list} PARENT_SCOPE)
set(${_run_targets_list} ${run_targets_list} PARENT_SCOPE)
endfunction()

function(enable_msvc_build_stl_modules)
if( MSVC_VERSION GREATER_EQUAL 1936 AND MSVC_IDE ) # 17.6+
# When using /std:c++latest, "Build ISO C++23 Standard Library Modules" defaults to "Yes".
# Default to "No" instead.
#
# As of CMake 3.26.4, there isn't a way to control this property
# (https://gitlab.kitware.com/cmake/cmake/-/issues/24922),
# We'll use the MSBuild project system instead
# (https://learn.microsoft.com/en-us/cpp/build/reference/vcxproj-file-structure)
file( CONFIGURE OUTPUT "${CMAKE_BINARY_DIR}/Directory.Build.props" CONTENT [==[
<Project>
<ItemDefinitionGroup>
<ClCompile>
<BuildStlModules>true</BuildStlModules>
</ClCompile>
</ItemDefinitionGroup>
</Project>
]==] @ONLY )
endif()
endfunction()

0 comments on commit e48903b

Please sign in to comment.