[clang] 70cf763 - Reapply "[cmake] Add support for statically linking libxml2" (#192088)

via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 15 09:23:47 PDT 2026


Author: Keith Smiley
Date: 2026-04-15T09:23:42-07:00
New Revision: 70cf763a42d55dcf89687c9e84478eb007561654

URL: https://github.com/llvm/llvm-project/commit/70cf763a42d55dcf89687c9e84478eb007561654
DIFF: https://github.com/llvm/llvm-project/commit/70cf763a42d55dcf89687c9e84478eb007561654.diff

LOG: Reapply "[cmake] Add support for statically linking libxml2" (#192088)

This applies a fix for windows not discovering libxml

This reverts commit 2a9c32496b5e8e63844597f638bdf67e4732fd35.

Added: 
    llvm/cmake/modules/FindLibXml2.cmake

Modified: 
    clang/cmake/caches/Release.cmake
    llvm/CMakeLists.txt
    llvm/cmake/config-ix.cmake
    llvm/lib/WindowsManifest/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/clang/cmake/caches/Release.cmake b/clang/cmake/caches/Release.cmake
index efe20a201dbc9..b0bc3ebfe5cb6 100644
--- a/clang/cmake/caches/Release.cmake
+++ b/clang/cmake/caches/Release.cmake
@@ -172,6 +172,10 @@ set_final_stage_var(CPACK_GENERATOR "TXZ" STRING)
 set_final_stage_var(CPACK_ARCHIVE_THREADS "0" STRING)
 
 set_final_stage_var(LLVM_USE_STATIC_ZSTD "ON" BOOL)
+if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
+  set_final_stage_var(LLVM_USE_STATIC_LIBXML2 "ON" BOOL)
+endif()
+
 if (LLVM_RELEASE_ENABLE_LTO)
   set_final_stage_var(LLVM_ENABLE_FATLTO "ON" BOOL)
   set_final_stage_var(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_CURRENT_LIST_DIR}/release_cpack_pre_build_strip_lto.cmake" STRING)

diff  --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index da012596cca93..6001928f92e37 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -646,6 +646,8 @@ set(LLVM_TARGET_ARCH "host"
 
 set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
 
+set(LLVM_USE_STATIC_LIBXML2 "OFF" CACHE BOOL "Use static version of libxml2. Can be ON, or OFF")
+
 option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
 
 option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)

diff  --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake
index 7a5631b1ae3b5..70248c560de1c 100644
--- a/llvm/cmake/config-ix.cmake
+++ b/llvm/cmake/config-ix.cmake
@@ -227,6 +227,20 @@ if(LLVM_ENABLE_LIBXML2)
     if(LLVM_ENABLE_LIBXML2 STREQUAL FORCE_ON AND NOT HAVE_LIBXML2)
       message(FATAL_ERROR "Failed to configure libxml2")
     endif()
+
+    if(LLVM_USE_STATIC_LIBXML2)
+      if(NOT TARGET LibXml2::LibXml2Static)
+        message(FATAL_ERROR "Failed to find static libxml2 library, but LLVM_USE_STATIC_LIBXML2=ON")
+      endif()
+      cmake_push_check_state()
+      list(APPEND CMAKE_REQUIRED_INCLUDES ${LIBXML2_INCLUDE_DIR})
+      list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBXML2_STATIC_LIBRARY} ${LIBXML2_STATIC_DEPS})
+      check_symbol_exists(xmlReadMemory libxml/xmlreader.h HAVE_LIBXML2_STATIC)
+      cmake_pop_check_state()
+      if(NOT HAVE_LIBXML2_STATIC)
+        message(FATAL_ERROR "Failed to configure static libxml2, but LLVM_USE_STATIC_LIBXML2=ON")
+      endif()
+    endif()
   endif()
   set(LLVM_ENABLE_LIBXML2 "${HAVE_LIBXML2}")
 endif()

diff  --git a/llvm/cmake/modules/FindLibXml2.cmake b/llvm/cmake/modules/FindLibXml2.cmake
new file mode 100644
index 0000000000000..a2323b3bfe1a7
--- /dev/null
+++ b/llvm/cmake/modules/FindLibXml2.cmake
@@ -0,0 +1,79 @@
+# Try to find the libxml2 library
+#
+# If successful, the following variables will be defined:
+# LIBXML2_INCLUDE_DIR
+# LIBXML2_LIBRARY
+# LIBXML2_STATIC_LIBRARY
+# LibXml2_FOUND
+#
+# Additionally, the following import targets will be defined:
+# LibXml2::LibXml2
+# LibXml2::LibXml2Static (if the static library is found)
+
+find_package(PkgConfig QUIET)
+if(PkgConfig_FOUND)
+  pkg_check_modules(PC_LIBXML QUIET libxml-2.0)
+endif()
+
+find_path(LIBXML2_INCLUDE_DIR NAMES libxml/xpath.h
+  HINTS
+  ${PC_LIBXML_INCLUDEDIR}
+  ${PC_LIBXML_INCLUDE_DIRS}
+  PATH_SUFFIXES libxml2
+)
+
+if(DEFINED LIBXML2_LIBRARIES AND NOT DEFINED LIBXML2_LIBRARY)
+  set(LIBXML2_LIBRARY "${LIBXML2_LIBRARIES}" CACHE FILEPATH "Path to libxml2 library")
+endif()
+
+find_library(LIBXML2_LIBRARY NAMES xml2 libxml2 libxml2s libxml2_a
+  HINTS
+  ${PC_LIBXML_LIBDIR}
+  ${PC_LIBXML_LIBRARY_DIRS}
+)
+
+find_library(LIBXML2_STATIC_LIBRARY NAMES
+  "${CMAKE_STATIC_LIBRARY_PREFIX}xml2${CMAKE_STATIC_LIBRARY_SUFFIX}"
+  "${CMAKE_STATIC_LIBRARY_PREFIX}libxml2${CMAKE_STATIC_LIBRARY_SUFFIX}"
+  HINTS
+  ${PC_LIBXML_LIBDIR}
+  ${PC_LIBXML_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(LibXml2
+  REQUIRED_VARS LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR
+  VERSION_VAR PC_LIBXML_VERSION
+)
+
+if(LibXml2_FOUND)
+  if(NOT TARGET LibXml2::LibXml2)
+    add_library(LibXml2::LibXml2 UNKNOWN IMPORTED)
+    set_target_properties(LibXml2::LibXml2 PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${LIBXML2_INCLUDE_DIR}"
+        IMPORTED_LOCATION "${LIBXML2_LIBRARY}")
+  endif()
+  if(LIBXML2_STATIC_LIBRARY AND NOT TARGET LibXml2::LibXml2Static)
+    add_library(LibXml2::LibXml2Static STATIC IMPORTED)
+    set_target_properties(LibXml2::LibXml2Static PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${LIBXML2_INCLUDE_DIR}"
+        IMPORTED_LOCATION "${LIBXML2_STATIC_LIBRARY}")
+    # Static libraries need their transitive dependencies for linking.
+    set(LIBXML2_STATIC_DEPS)
+    foreach(lib IN LISTS PC_LIBXML_STATIC_LIBRARIES)
+      if(NOT lib STREQUAL "xml2")
+        list(APPEND LIBXML2_STATIC_DEPS ${lib})
+      endif()
+    endforeach()
+    if(LIBXML2_STATIC_DEPS)
+      set_target_properties(LibXml2::LibXml2Static PROPERTIES
+          INTERFACE_LINK_LIBRARIES "${LIBXML2_STATIC_DEPS}")
+    endif()
+  endif()
+endif()
+
+set(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR})
+set(LIBXML2_LIBRARIES ${LIBXML2_LIBRARY})
+set(LIBXML2_DEFINITIONS ${PC_LIBXML_CFLAGS_OTHER})
+
+mark_as_advanced(LIBXML2_INCLUDE_DIR LIBXML2_LIBRARY LIBXML2_STATIC_LIBRARY)

diff  --git a/llvm/lib/WindowsManifest/CMakeLists.txt b/llvm/lib/WindowsManifest/CMakeLists.txt
index 910132a4c7dec..46fe3b50357b6 100644
--- a/llvm/lib/WindowsManifest/CMakeLists.txt
+++ b/llvm/lib/WindowsManifest/CMakeLists.txt
@@ -1,7 +1,11 @@
 include(GetLibraryName)
 
 if(LLVM_ENABLE_LIBXML2)
-  set(imported_libs LibXml2::LibXml2)
+  if(LLVM_USE_STATIC_LIBXML2)
+    set(imported_libs LibXml2::LibXml2Static)
+  else()
+    set(imported_libs LibXml2::LibXml2)
+  endif()
 endif()
 
 add_llvm_component_library(LLVMWindowsManifest
@@ -24,10 +28,10 @@ if(LLVM_ENABLE_LIBXML2)
   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
   if(CMAKE_BUILD_TYPE)
     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
-    get_property(libxml2_library TARGET LibXml2::LibXml2 PROPERTY LOCATION_${build_type})
+    get_property(libxml2_library TARGET ${imported_libs} PROPERTY LOCATION_${build_type})
   endif()
   if(NOT libxml2_library)
-    get_property(libxml2_library TARGET LibXml2::LibXml2 PROPERTY LOCATION)
+    get_property(libxml2_library TARGET ${imported_libs} PROPERTY LOCATION)
   endif()
   get_library_name(${libxml2_library} libxml2_library)
   set_property(TARGET LLVMWindowsManifest PROPERTY LLVM_SYSTEM_LIBS ${libxml2_library})


        


More information about the cfe-commits mailing list