[Openmp-commits] [openmp] e682a76 - [OpenMP] Use `add_llvm_library` to build the target `PluginInterface` in `plugins-nextgen`

Shilei Tian via Openmp-commits openmp-commits at lists.llvm.org
Tue Dec 6 08:37:42 PST 2022


Author: Shilei Tian
Date: 2022-12-06T11:37:37-05:00
New Revision: e682a76c3bf61c52628d79d6ec4db221430768c0

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

LOG: [OpenMP] Use `add_llvm_library` to build the target `PluginInterface` in `plugins-nextgen`

This patch uses `add_llvm_library` to build the target `PluginInterface` since it can handle LLVM dependences much better. One temporary drawback of using this is that currently LLVM CMake macro doesn't support object libraries very well (there was a try a couple years ago but it was reverted later https://github.com/llvm/llvm-project/commit/29e57229497711a3a294f437b59afa6ddc36a3d8). After switching to that, `CXX_VISIBILITY_PRESET` can not be set correctly, which can cause runtime error that a function call from one plugin could go to another. As a consequence, `PluginInterface` is built as a static library for now. I have asked the question in CMake community (https://discourse.cmake.org/t/set-target-properties-doesnt-work-properly/7016). Once that issue is solved, I'll switch it back to object library. It is not necessarily too bad to use static library, especially `BUILDTREE_ONLY` is already set such that `PluginInterface.a` will not be installed.

Reviewed By: jhuber6

Differential Revision: https://reviews.llvm.org/D139371

Added: 
    

Modified: 
    openmp/libomptarget/plugins-nextgen/common/PluginInterface/CMakeLists.txt
    openmp/libomptarget/plugins/common/elf_common/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/CMakeLists.txt b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/CMakeLists.txt
index 60aeff8796fc7..64ebda2da478f 100644
--- a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/CMakeLists.txt
+++ b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/CMakeLists.txt
@@ -11,24 +11,39 @@
 ##===----------------------------------------------------------------------===##
 
 # Plugin Interface library.
-add_library(PluginInterface OBJECT PluginInterface.cpp GlobalHandler.cpp)
+add_llvm_library(PluginInterface PluginInterface.cpp GlobalHandler.cpp
+  BUILDTREE_ONLY
 
-# Define the TARGET_NAME.
-add_definitions("-DTARGET_NAME=PluginInterface")
+  LINK_COMPONENTS
+    Support
 
-# Define the DEBUG_PREFIX.
-add_definitions(-DDEBUG_PREFIX="PluginInterface")
+  LINK_LIBS
+    elf_common
+)
+
+# NOTE: Please don't move `MemoryManager` to `LINK_LIBS` above, even though it
+# is an interface "library". Don't expect it to be treated as a "library" such
+# that we just need to link it via CMake and its include path will be updated
+# automatically. It is because `PluginInterface` is a static library here, and
+# per CMake design (which makes sense), privately linked libraries have to be
+# exported. However, there is no a typical way in CMake to export an interface
+# library without install rules. We apparently don't need `MemoryManager`'s
+# header out of the build tree.
+target_include_directories(PluginInterface PRIVATE
+  $<TARGET_PROPERTY:MemoryManager,INTERFACE_INCLUDE_DIRECTORIES>
+)
+
+# Define the TARGET_NAME and DEBUG_PREFIX.
+target_compile_definitions(PluginInterface PRIVATE
+  TARGET_NAME="PluginInterface"
+  DEBUG_PREFIX="PluginInterface"
+)
+
+target_include_directories(PluginInterface
+  INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${LIBOMPTARGET_INCLUDE_DIR}
+)
 
 set_target_properties(PluginInterface PROPERTIES
   POSITION_INDEPENDENT_CODE ON
   CXX_VISIBILITY_PRESET protected)
-llvm_update_compile_flags(PluginInterface)
-set(LINK_LLVM_LIBS LLVMSupport)
-if (LLVM_LINK_LLVM_DYLIB)
-  set(LINK_LLVM_LIBS LLVM)
-endif()
-target_link_libraries(PluginInterface INTERFACE ${LINK_LLVM_LIBS} PRIVATE elf_common MemoryManager)
-add_dependencies(PluginInterface ${LINK_LLVM_LIBS})
-
-target_include_directories(PluginInterface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
-target_include_directories(PluginInterface PRIVATE ${LIBOMPTARGET_INCLUDE_DIR})

diff  --git a/openmp/libomptarget/plugins/common/elf_common/CMakeLists.txt b/openmp/libomptarget/plugins/common/elf_common/CMakeLists.txt
index f6aa809b46169..60affae40eae0 100644
--- a/openmp/libomptarget/plugins/common/elf_common/CMakeLists.txt
+++ b/openmp/libomptarget/plugins/common/elf_common/CMakeLists.txt
@@ -10,21 +10,23 @@
 #
 ##===----------------------------------------------------------------------===##
 
-add_library(elf_common OBJECT elf_common.cpp ELFSymbols.cpp)
+add_llvm_library(elf_common elf_common.cpp ELFSymbols.cpp
+  BUILDTREE_ONLY
+
+  LINK_COMPONENTS
+    BinaryFormat
+    Object
+    Support
+
+  LINK_LIBS
+    ${OPENMP_PTHREAD_LIB}
+)
 
 # Build elf_common with PIC to be able to link it with plugin shared libraries.
 set_property(TARGET elf_common PROPERTY POSITION_INDEPENDENT_CODE ON)
-llvm_update_compile_flags(elf_common)
-set(LINK_LLVM_LIBS LLVMBinaryFormat LLVMObject LLVMSupport)
-if (LLVM_LINK_LLVM_DYLIB)
-  set(LINK_LLVM_LIBS LLVM)
-endif()
-target_link_libraries(elf_common INTERFACE ${LINK_LLVM_LIBS})
-add_dependencies(elf_common ${LINK_LLVM_LIBS})
-
-# The code uses Debug.h, which requires threads support.
-target_link_libraries(elf_common INTERFACE ${OPENMP_PTHREAD_LIB})
 
 # Expose elf_common.h directory to the users of this library.
-target_include_directories(elf_common INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
-target_include_directories(elf_common PRIVATE ${LIBOMPTARGET_INCLUDE_DIR})
+target_include_directories(elf_common
+  INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${LIBOMPTARGET_INCLUDE_DIR}
+)


        


More information about the Openmp-commits mailing list