From 1f39dabc12946ea855502f02a94e0c71d44858e5 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 13 Nov 2025 01:53:14 +0100 Subject: [PATCH] cmake: support parallel MSVC420 builds by embedding debug information in the objects Only disadvantage is that the object files will be bigger. It remains possible to create a PDB file with all debug information --- CMakeLists.txt | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6485e070..5f3ad1c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 3.15 FATAL_ERROR) # MSVC runtime library flags are selected by an abstraction cmake_policy(SET CMP0091 NEW) +# MSVC debug information format flags are selected by an abstraction +cmake_policy(SET CMP0141 NEW) + project(isle CXX) include(CheckCXXSourceCompiles) @@ -445,6 +448,9 @@ function(add_lego_libraries NAME) target_link_libraries(${tgt} PRIVATE ${ARG_LINK_LIBRARIES}) target_link_libraries(${tgt} PRIVATE $<$:DirectX5::DirectX5>) target_compile_definitions(${tgt} PRIVATE $<$:DIRECTX5_SDK>) + if(MSVC_FOR_DECOMP) + set_property(TARGET ${tgt} PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") + endif() endforeach() # Make sure filenames are ALL CAPS @@ -540,6 +546,9 @@ if (ISLE_BUILD_CONFIG) set_property(TARGET config PROPERTY OUTPUT_NAME "CONFIG") set_property(TARGET config PROPERTY SUFFIX ".EXE") set_property(TARGET config PROPERTY MSVC_RUNTIME_LIBRARY MultiThreaded$<$:Debug>DLL) + if(MSVC_FOR_DECOMP) + set_property(TARGET config PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") + endif() endif() if (MSVC) @@ -587,6 +596,9 @@ if (MSVC_FOR_DECOMP) if (ISLE_BUILD_APP) target_link_options(isle PRIVATE "/OPT:REF") set_property(TARGET isle ${lego1_targets} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + if(MSVC_FOR_DECOMP) + set_property(TARGET isle PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") + endif() endif() if (ISLE_BUILD_CONFIG) @@ -615,11 +627,14 @@ if (MSVC_FOR_DECOMP) target_link_options(lego1 PRIVATE "/OPT:REF") set_property(TARGET lego1 PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() + if(MSVC_FOR_DECOMP) + set_property(TARGET lego1 PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") + endif() set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"") - set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Zi /Od /D \"_DEBUG\"") + set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Z7 /Od /D \"_DEBUG\"") set(CMAKE_CXX_FLAGS_RELEASE "/O2 /D \"NDEBUG\"") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Zi /O2 /D \"NDEBUG\"") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Z7 /O2 /D \"NDEBUG\"") set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os /D \"NDEBUG\"") set(CMAKE_EXE_LINKER_FLAGS "/machine:I386") @@ -635,26 +650,6 @@ if (MSVC_FOR_DECOMP) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/incremental:no") set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug") set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "/incremental:no") - - # Older MSVC versions don't support building in parallel. - # Force non-parallel builds of isle and lego1 by putting them in a pool with 1 available job. - if (CMAKE_CXX_COMPILER_ID VERSION_LESS 12) - foreach(tgt IN LISTS lego1_targets beta10_targets) - set_property(GLOBAL APPEND PROPERTY JOB_POOLS "msvc_${tgt}=1") - set_property(TARGET ${tgt} PROPERTY JOB_POOL_COMPILE "msvc_${tgt}") - set_property(TARGET ${tgt} PROPERTY JOB_POOL_LINK "msvc_${tgt}") - endforeach() - if (TARGET isle) - set_property(GLOBAL APPEND PROPERTY JOB_POOLS "msvc_isle=1") - set_property(TARGET isle PROPERTY JOB_POOL_COMPILE "msvc_isle") - set_property(TARGET isle PROPERTY JOB_POOL_LINK "msvc_isle") - endif() - if (TARGET config) - set_property(GLOBAL APPEND PROPERTY JOB_POOLS "msvc_config=1") - set_property(TARGET config PROPERTY JOB_POOL_COMPILE "msvc_config") - set_property(TARGET config PROPERTY JOB_POOL_LINK "msvc_config") - endif() - endif() endif() find_program(CLANGFORMAT_BIN NAMES clang-format)