[compiler-rt] [llvm] [cmake] Refactor DIA SDK detection into FindDIASDK module (PR #160354)
Ruoyu Zhong via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 23 11:16:19 PDT 2025
https://github.com/ZhongRuoyu created https://github.com/llvm/llvm-project/pull/160354
This consolidates the DIA SDK detection logic from `{llvm,compiler-rt}/cmake/config-ix.cmake` into a new centralized, reusable `FindDIASDK.cmake` module.
In addition to code deduplication, it also helps to avoid hard-coded references to the DIA SDK location in `LLVMExports.cmake`, hence allowing a pre-built LLVM distribution for Windows to be used on another host without requiring the DIA SDK location to be the same.
Fixes https://github.com/llvm/llvm-project/issues/86250.
Fixes https://github.com/llvm/llvm-project/issues/100372.
Fixes https://github.com/llvm/llvm-project/issues/111829.
Fixes https://github.com/llvm/llvm-project/issues/152268.
CC @petrhosek (LLVM CMake maintainer).
>From 26dcab134ea39e6449cfbd384895ddc33042bf0c Mon Sep 17 00:00:00 2001
From: Ruoyu Zhong <zhongruoyu at outlook.com>
Date: Wed, 24 Sep 2025 01:37:14 +0800
Subject: [PATCH] [cmake] Refactor DIA SDK detection into FindDIASDK module
This consolidates the DIA SDK detection logic from
{llvm,compiler-rt}/cmake/config-ix.cmake into a new centralized,
reusable FindDIASDK.cmake module.
In addition to code deduplication, it also helps to avoid hard-coded
references to the DIA SDK location in LLVMExports.cmake, hence allowing
a pre-built LLVM distribution for Windows to be used on another host
without requiring the DIA SDK location to be the same.
Fixes https://github.com/llvm/llvm-project/issues/86250.
Fixes https://github.com/llvm/llvm-project/issues/100372.
Fixes https://github.com/llvm/llvm-project/issues/111829.
Fixes https://github.com/llvm/llvm-project/issues/152268.
Signed-off-by: Ruoyu Zhong <zhongruoyu at outlook.com>
---
compiler-rt/cmake/config-ix.cmake | 11 +---
llvm/cmake/config-ix.cmake | 27 ++--------
llvm/cmake/modules/FindDIASDK.cmake | 74 ++++++++++++++++++++++++++
llvm/cmake/modules/LLVMConfig.cmake.in | 3 ++
llvm/lib/DebugInfo/PDB/CMakeLists.txt | 14 ++---
5 files changed, 85 insertions(+), 44 deletions(-)
create mode 100644 llvm/cmake/modules/FindDIASDK.cmake
diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake
index 67db4383ec3dc..dd89b445a04a8 100644
--- a/compiler-rt/cmake/config-ix.cmake
+++ b/compiler-rt/cmake/config-ix.cmake
@@ -728,16 +728,9 @@ if (MSVC)
set(LLVM_WINSYSROOT "" CACHE STRING
"If set, argument to clang-cl's /winsysroot")
- if (LLVM_WINSYSROOT)
- set(MSVC_DIA_SDK_DIR "${LLVM_WINSYSROOT}/DIA SDK" CACHE PATH
- "Path to the DIA SDK")
- else()
- set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK" CACHE PATH
- "Path to the DIA SDK")
- endif()
-
# See if the DIA SDK is available and usable.
- if (IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
+ find_package(DIASDK)
+ if (DIASDK_FOUND)
set(CAN_SYMBOLIZE 1)
else()
set(CAN_SYMBOLIZE 0)
diff --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake
index ed2bfa6df68f4..dcef7aefc65ec 100644
--- a/llvm/cmake/config-ix.cmake
+++ b/llvm/cmake/config-ix.cmake
@@ -625,32 +625,11 @@ if( MSVC )
set(LLVM_WINSYSROOT "" CACHE STRING
"If set, argument to clang-cl's /winsysroot")
- if (LLVM_WINSYSROOT)
- set(MSVC_DIA_SDK_DIR "${LLVM_WINSYSROOT}/DIA SDK" CACHE PATH
- "Path to the DIA SDK")
- else()
- set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK" CACHE PATH
- "Path to the DIA SDK")
- endif()
-
- # See if the DIA SDK is available and usable.
- # Due to a bug in MSVC 2013's installation software, it is possible
- # for MSVC 2013 to write the DIA SDK into the Visual Studio 2012
- # install directory. If this happens, the installation is corrupt
- # and there's nothing we can do. It happens with enough frequency
- # though that we should handle it. We do so by simply checking that
- # the DIA SDK folder exists. Should this happen you will need to
- # uninstall VS 2012 and then re-install VS 2013.
- if (IS_DIRECTORY "${MSVC_DIA_SDK_DIR}")
- set(HAVE_DIA_SDK 1)
- else()
- set(HAVE_DIA_SDK 0)
- endif()
-
+ find_package(DIASDK)
option(LLVM_ENABLE_DIA_SDK "Use MSVC DIA SDK for debugging if available."
- ${HAVE_DIA_SDK})
+ ${DIASDK_FOUND})
- if(LLVM_ENABLE_DIA_SDK AND NOT HAVE_DIA_SDK)
+ if(LLVM_ENABLE_DIA_SDK AND NOT DIASDK_FOUND)
message(FATAL_ERROR "DIA SDK not found. If you have both VS 2012 and 2013 installed, you may need to uninstall the former and re-install the latter afterwards.")
endif()
else()
diff --git a/llvm/cmake/modules/FindDIASDK.cmake b/llvm/cmake/modules/FindDIASDK.cmake
new file mode 100644
index 0000000000000..3eea4353a0896
--- /dev/null
+++ b/llvm/cmake/modules/FindDIASDK.cmake
@@ -0,0 +1,74 @@
+# Finds the Microsoft DIA SDK and sets DIASDK_FOUND and related variables.
+#
+# This module is intended to be used both internally by LLVM's build system and
+# by consuming projects when loading LLVMConfig.cmake.
+#
+# LLVM_WINSYSROOT may be set for locating the DIA SDK.
+#
+# If successful, the following variables will be defined:
+# DIASDK_FOUND
+# DIASDK_INCLUDE_DIR
+# DIASDK_LIBRARIES
+#
+# Additionally, the following import target will be defined:
+# DIASDK::Diaguids
+
+if(NOT WIN32)
+ set(DIASDK_FOUND FALSE)
+ return()
+endif()
+
+if(LLVM_WINSYSROOT)
+ set(MSVC_DIA_SDK_DIR "${LLVM_WINSYSROOT}/DIA SDK" CACHE PATH
+ "Path to the DIA SDK")
+else()
+ set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK" CACHE PATH
+ "Path to the DIA SDK")
+endif()
+
+find_path(DIASDK_INCLUDE_DIR
+ NAMES dia2.h
+ PATHS "${MSVC_DIA_SDK_DIR}/include"
+ NO_DEFAULT_PATH
+ NO_CMAKE_FIND_ROOT_PATH
+)
+
+if(IS_DIRECTORY "${MSVC_DIA_SDK_DIR}")
+ set(_DIA_SDK_LIB_DIR "${MSVC_DIA_SDK_DIR}/lib")
+
+ if("$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64")
+ set(_DIA_SDK_LIB_DIR "${_DIA_SDK_LIB_DIR}/arm64")
+ elseif("$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm")
+ set(_DIA_SDK_LIB_DIR "${_DIA_SDK_LIB_DIR}/arm")
+ elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(_DIA_SDK_LIB_DIR "${_DIA_SDK_LIB_DIR}/amd64")
+ endif()
+
+ find_library(DIASDK_LIBRARIES
+ NAMES diaguids
+ PATHS "${_DIA_SDK_LIB_DIR}"
+ NO_DEFAULT_PATH
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ DIASDK
+ FOUND_VAR
+ DIASDK_FOUND
+ REQUIRED_VARS
+ DIASDK_INCLUDE_DIR
+ DIASDK_LIBRARIES
+)
+mark_as_advanced(DIASDK_INCLUDE_DIR DIASDK_LIBRARIES)
+
+if(DIASDK_FOUND)
+ if(NOT TARGET DIASDK::Diaguids)
+ add_library(DIASDK::Diaguids UNKNOWN IMPORTED)
+ set_target_properties(DIASDK::Diaguids PROPERTIES
+ IMPORTED_LOCATION "${DIASDK_LIBRARIES}"
+ INTERFACE_INCLUDE_DIRECTORIES "${DIASDK_INCLUDE_DIR}"
+ )
+ endif()
+endif()
diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in
index 70c807abea98a..cadd3f44b6e56 100644
--- a/llvm/cmake/modules/LLVMConfig.cmake.in
+++ b/llvm/cmake/modules/LLVMConfig.cmake.in
@@ -95,6 +95,9 @@ endif()
set(LLVM_WITH_Z3 @LLVM_WITH_Z3@)
set(LLVM_ENABLE_DIA_SDK @LLVM_ENABLE_DIA_SDK@)
+if(LLVM_ENABLE_DIA_SDK)
+ find_package(DIASDK)
+endif()
set(LLVM_NATIVE_ARCH @LLVM_NATIVE_ARCH@)
diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt
index b42fae41992e9..afde28914dacd 100644
--- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt
+++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt
@@ -4,17 +4,9 @@ macro(add_pdb_impl_folder group)
endmacro()
if(LLVM_ENABLE_DIA_SDK)
- include_directories(SYSTEM ${MSVC_DIA_SDK_DIR}/include)
- set(LIBPDB_LINK_FOLDERS "${MSVC_DIA_SDK_DIR}\\lib")
-
- if ("$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64")
- set(LIBPDB_LINK_FOLDERS "${LIBPDB_LINK_FOLDERS}\\arm64")
- elseif ("$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm")
- set(LIBPDB_LINK_FOLDERS "${LIBPDB_LINK_FOLDERS}\\arm")
- elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
- set(LIBPDB_LINK_FOLDERS "${LIBPDB_LINK_FOLDERS}\\amd64")
- endif()
- file(TO_CMAKE_PATH "${LIBPDB_LINK_FOLDERS}\\diaguids.lib" LIBPDB_ADDITIONAL_LIBRARIES)
+ find_package(DIASDK REQUIRED)
+ include_directories(SYSTEM "${DIASDK_INCLUDE_DIR}")
+ set(LIBPDB_ADDITIONAL_LIBRARIES DIASDK::Diaguids)
add_pdb_impl_folder(DIA
DIA/DIADataStream.cpp
More information about the llvm-commits
mailing list