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
This commit is contained in:
Anonymous Maarten 2025-11-13 01:53:14 +01:00
parent dfffb873ed
commit 1f39dabc12

View File

@ -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 $<$<BOOL:${ISLE_USE_DX5}>:DirectX5::DirectX5>)
target_compile_definitions(${tgt} PRIVATE $<$<BOOL:${ISLE_USE_DX5}>: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$<$<CONFIG:Debug>: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$<$<CONFIG:Debug>: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$<$<CONFIG:Debug>: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)