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}) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
