diff --git a/clang/tools/libclang/CMakeLists.txt b/clang/tools/libclang/CMakeLists.txt index ac7a9a8db37c0..5b544985faa52 100644 --- a/clang/tools/libclang/CMakeLists.txt +++ b/clang/tools/libclang/CMakeLists.txt @@ -157,15 +157,28 @@ if(ENABLE_STATIC) endif() if(ENABLE_SHARED) - if(WIN32) + if(WIN32 OR CYGWIN) set_target_properties(libclang PROPERTIES VERSION ${LIBCLANG_LIBRARY_VERSION} DEFINE_SYMBOL _CINDEX_LIB_) - # Avoid declaring clang c++ symbols that are statically linked into libclang as dllimport'ed. - # If llvm/libclang-cpp dll is also being built for windows clang c++ symbols will still be - # implicitly be exported from libclang. - target_compile_definitions(libclang PRIVATE CLANG_BUILD_STATIC) + if (CYGWIN) + # On Cygwin, a shared library target generates "cyg${OUTPUT_NAME}-${VERSION}.dll" + # and "lib${OUTPUT_NAME}.dll.a", but does not generate an unversioned symlink + # "cyg${OUTPUT_NAME}.dll" as is common on other Unix platforms. + # However, tools like clang-python or direct dlopen() calls usually expect the + # unversioned form (e.g. "cygclang.dll"). + # Therefore, we create a symlink named without the version suffix to + # improve compatibility. + set(UNPAINTED_TARGET_NAME "$/$clang$") + add_custom_command(TARGET libclang POST_BUILD + COMMAND ${CMAKE_COMMAND} -E create_symlink "$" "${UNPAINTED_TARGET_NAME}") + install(FILES "${UNPAINTED_TARGET_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT libclang) + endif() + # Avoid declaring clang c++ symbols that are statically linked into libclang as dllimport'ed. + # If llvm/libclang-cpp dll is also being built for windows clang c++ symbols will still be + # implicitly be exported from libclang. + target_compile_definitions(libclang PRIVATE CLANG_BUILD_STATIC) elseif(APPLE) set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1") set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")