Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -366,6 +366,12 @@ option (LLVM_BUILD_EXTERNAL_COMPILER_RT "Build compiler-rt as an external project." OFF) +set(LLVM_DYLIB_NAME "LLVM" CACHE STRING "Specify an alternative library name for libLLVM") +set(LLVM_DYLIB_SOVERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}" CACHE STRING + "Specify the SOVERSION for libLLVM (specify . to use the CMake default)") +set(LLVM_DYLIB_VERSION "${PACKAGE_VERSION}" CACHE STRING + "Specify the VERSION for libLLVM (specify . to use the CMake default)") + # You can configure which libraries from LLVM you want to include in the # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited # list of LLVM components. All component names handled by llvm-config are valid. Index: cmake/modules/AddLLVM.cmake =================================================================== --- cmake/modules/AddLLVM.cmake +++ cmake/modules/AddLLVM.cmake @@ -326,7 +326,7 @@ function(llvm_add_library name) cmake_parse_arguments(ARG "MODULE;SHARED;STATIC;DISABLE_LLVM_LINK_LLVM_DYLIB" - "OUTPUT_NAME" + "OUTPUT_NAME;SOVERSION;VERSION" "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" ${ARGN}) list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) @@ -431,10 +431,24 @@ ) endif() - set_target_properties(${name} - PROPERTIES - SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} - VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) + # Set SOVERSION iff it is unspecified in arguments; + # we take a value of "." to mean "use the default". + set(soversion ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}) + if(ARG_SOVERSION) + set(soversion ${ARG_SOVERSION}) + endif() + if(NOT "${soversion}" STREQUAL ".") + set_target_properties(${name} PROPERTIES SOVERSION ${soversion}) + endif() + + # As above, but for VERSION. + set(version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) + if(ARG_VERSION) + set(version ${ARG_VERSION}) + endif() + if(NOT "${version}" STREQUAL ".") + set_target_properties(${name} PROPERTIES VERSION ${version}) + endif() endif() if(ARG_MODULE OR ARG_SHARED) @@ -457,7 +471,7 @@ get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_STATIC AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB) - set(llvm_libs LLVM) + set(llvm_libs ${LLVM_DYLIB_NAME}) else() llvm_map_components_to_libnames(llvm_libs ${ARG_LINK_COMPONENTS} @@ -886,10 +900,15 @@ set(linkmode "component-libs") endif() add_custom_command(OUTPUT ${binpath} - COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "linkmode=${linkmode}" + COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" + "cc=${cc}" + "cxx=${cxx}" + "cppflags=${cppflags}" + "ldflags=${ldflags}" + "linkmode=${linkmode}" + "dylib=${LLVM_DYLIB_NAME}" ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath} - DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX} - ${llvmlibs} ${ARG_DEPENDS} + DEPENDS llvm-config llvm-go ${llvmlibs} ${ARG_DEPENDS} COMMENT "Building Go executable ${binary}" VERBATIM) if (ARG_ALL) Index: cmake/modules/LLVM-Config.cmake =================================================================== --- cmake/modules/LLVM-Config.cmake +++ cmake/modules/LLVM-Config.cmake @@ -44,7 +44,7 @@ # To do this, we need special handling for "all", since that # may imply linking to libraries that are not included in # libLLVM. - target_link_libraries(${executable} LLVM) + target_link_libraries(${executable} ${LLVM_DYLIB_NAME}) endif() explicit_llvm_config(${executable} ${link_components}) Index: tools/llvm-go/llvm-go.go =================================================================== --- tools/llvm-go/llvm-go.go +++ tools/llvm-go/llvm-go.go @@ -88,13 +88,13 @@ return outstr } -func llvmFlags(linkmode string) compilerFlags { +func llvmFlags(linkmode, dylibName string) compilerFlags { ldflags := llvmConfig("--ldflags") switch linkmode { case linkmodeComponentLibs: ldflags += " " + llvmConfig(append([]string{"--libs"}, components...)...) case linkmodeDylib: - ldflags += " -lLLVM" + ldflags += " -l" + dylibName default: panic("invalid linkmode: " + linkmode) } @@ -133,8 +133,8 @@ fmt.Println(strings.Join(components, " ")) } -func printConfig(linkmode string) { - flags := llvmFlags(linkmode) +func printConfig(linkmode, dylibName string) { + flags := llvmFlags(linkmode, dylibName) fmt.Printf(`// +build !byollvm @@ -153,7 +153,7 @@ `, flags.cpp, flags.cxx, flags.ld) } -func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode string) { +func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode, dylibName string) { args = addTag(args, "byollvm") srcdir := llvmConfig("--src-root") @@ -182,7 +182,7 @@ newgopathlist = append(newgopathlist, filepath.SplitList(os.Getenv("GOPATH"))...) newgopath := strings.Join(newgopathlist, string(filepath.ListSeparator)) - flags := llvmFlags(linkmode) + flags := llvmFlags(linkmode, dylibName) newenv := []string{ "CC=" + cc, @@ -251,6 +251,7 @@ gocmd := "go" llgo := "" linkmode := linkmodeComponentLibs + dylibName := "LLVM" flags := []struct { name string @@ -263,6 +264,7 @@ {"cppflags", &cppflags}, {"ldflags", &ldflags}, {"linkmode", &linkmode}, + {"dylib", &dylibName}, } args := os.Args[1:] @@ -283,11 +285,11 @@ switch args[0] { case "build", "get", "install", "run", "test": - runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode) + runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode, dylibName) case "print-components": printComponents() case "print-config": - printConfig(linkmode) + printConfig(linkmode, dylibName) default: usage() } Index: tools/llvm-shlib/CMakeLists.txt =================================================================== --- tools/llvm-shlib/CMakeLists.txt +++ tools/llvm-shlib/CMakeLists.txt @@ -72,7 +72,11 @@ add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE}) endif() -add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB ${SOURCES}) +add_llvm_library(${LLVM_DYLIB_NAME} ${SOURCES} + SHARED + SOVERSION ${LLVM_DYLIB_SOVERSION} + VERSION ${LLVM_DYLIB_VERSION} + DISABLE_LLVM_LINK_LLVM_DYLIB) list(REMOVE_DUPLICATES LIB_NAMES) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf" @@ -82,14 +86,14 @@ set(LIB_NAMES -Wl,-all_load ${LIB_NAMES}) endif() -target_link_libraries(LLVM PRIVATE ${LIB_NAMES}) +target_link_libraries(${LLVM_DYLIB_NAME} PRIVATE ${LIB_NAMES}) if(TARGET libLLVMExports) - add_dependencies(LLVM libLLVMExports) + add_dependencies(${LLVM_DYLIB_NAME} libLLVMExports) endif() if (APPLE) - set_property(TARGET LLVM APPEND_STRING PROPERTY + set_property(TARGET ${LLVM_DYLIB_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -compatibility_version 1 -current_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}") endif()