[llvm-branch-commits] [llvm] [Flang-RT] Build libflang_rt.so (PR #120213)

Michael Kruse via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Dec 17 03:09:49 PST 2024


https://github.com/Meinersbur created https://github.com/llvm/llvm-project/pull/120213

Under non-Windows platforms, also create a dynamic library version of the runtime. Build of either version of the library can be switched off using FLANG_RT_ENABLE_STATIC=OFF respectively FLANG_RT_ENABLE_SHARED=OFF. Default is to build both.

PR on top of #110217.

EXPERIMENTAL DRAFT. CHANGES AND CLEANUPS IN PROGRESS.

>From 7e252f1a64e12ac04706175cabc303076d9e973f Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 17 Dec 2024 12:00:38 +0100
Subject: [PATCH] Add FLANG_RT_ENABLE_STATIC and _SHARED

---
 flang-rt/CMakeLists.txt                 |  14 +++
 flang-rt/cmake/modules/AddFlangRT.cmake | 123 ++++++++++++++++++++----
 2 files changed, 117 insertions(+), 20 deletions(-)

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 1d7b241adea89c..48169673ad772f 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -115,6 +115,20 @@ endif ()
 option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
 
 
+option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." ON)
+if (WIN32)
+  # Windows DLL currently not implemented.
+  set(FLANG_RT_ENABLE_SHARED OFF)
+else ()
+  option(FLANG_RT_ENABLE_SHARED "Build Flang-RT as a shared library." ON)
+endif ()
+if (NOT FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_SHARED)
+  message(FATAL_ERROR "Must build at least one type of library
+      (FLANG_RT_ENABLE_STATIC=ON, FLANG_RT_ENABLE_SHARED=ON, or both)
+    ")
+endif ()
+
+
 set(FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile Flang-RT with GPU support (CUDA or OpenMP)")
 set_property(CACHE FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
     ""
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 6e55a0d115713d..e20622b7039785 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -38,42 +38,124 @@ function (add_flangrt_library name)
     ${ARGN})
 
   if (ARG_INSTALL_WITH_TOOLCHAIN AND ARG_EXCLUDE_FROM_ALL)
-     message(SEND_ERROR "add_flangrt_library(${name} ...):
+    message(SEND_ERROR "add_flangrt_library(${name} ...):
        INSTALL_WITH_TOOLCHAIN and EXCLUDE_FROM_ALL are in conflict. When
        installing an artifact it must have been built first in the 'all' target.
-     ")
+      ")
+    return ()
   endif ()
 
-  # Also add header files to IDEs to list as part of the library
-  set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
+  #if (ARG_CMAKE_CONFIGURABLE AND (ARG_STATIC OR ARG_SHARED))
+  #  message(SEND_ERROR "add_flangrt_library(${name} ...):
+  #     CMAKE_CONFIGURABLE cannot be used together with STATIC or SHARED.
+  #    ")
+  #  return ()
+  #endif ()
+
+  #if (NOT ARG_STATIC AND NOT ARG_SHARED AND NOT ARG_CMAKE_CONFIGURABLE AND NOT ARG_OBJECT)
+  #  message(SEND_ERROR "add_flangrt_library(${name} ...):
+  #     Must specifiy library type.
+  #    ")
+  #  return ()
+  #endif () 
+
+  set(build_static OFF)
+  set(build_shared OFF)
+  if (ARG_STATIC AND FLANG_RT_ENABLE_STATIC)
+    set(build_static ON)
+  endif ()
+  if (ARG_SHARED AND FLANG_RT_ENABLE_SHARED)
+    set(build_shared ON)
+  endif ()
+  if (NOT ARG_STATIC AND NOT ARG_SHARED AND NOT ARG_OBJECT)
+    if (BUILD_SHARED_LIBS)
+      set(build_shared ON)
+    else ()
+      set(build_static ON)
+    endif ()
+  endif ()
 
-  # Forward libtype to add_library
-  set(extra_args "")
-  if (ARG_SHARED)
-    list(APPEND extra_args SHARED)
+  # Name of targets must only depend on function arguments to be predictable for callers.
+  if (ARG_STATIC AND ARG_SHARED)
+    set(name_static "${name}.static")
+    set(name_shared "${name}.shared")
+  else ()
+    set(name_static "${name}")
+    set(name_shared "${name}")
   endif ()
-  if (ARG_STATIC)
-    list(APPEND extra_args STATIC)
+  if (ARG_OBJECT AND NOT ARG_STATIC AND NOT ARG_SHARED)
+    set(name_object "${name}")
+  else ()
+    set(name_object "obj.${name}")
   endif ()
-  if (ARG_OBJECT)
-    list(APPEND extra_args OBJECT)
+
+
+  if (ARG_OBJECT AND NOT build_static AND NOT build_shared)
+    set(build_only_objectlib ON)
+  else ()
+    set(build_only_objectlib OFF)
   endif ()
+  if (build_only_objectlib OR (build_static AND build_shared))
+    set(need_objectlib ON)
+  else ()
+    set(need_objectlib OFF)
+  endif ()
+
+  if (NOT build_static AND NOT build_shared AND NOT need_objectlib)
+    # Nothing to build
+    return ()
+  endif ()
+
+  # Also add header files to IDEs to list as part of the library
+  set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
+
+  set(extra_args "")
   if (ARG_EXCLUDE_FROM_ALL)
     list(APPEND extra_args EXCLUDE_FROM_ALL)
   endif ()
 
-  add_library(${name} ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
 
-  if (ARG_INSTALL_WITH_TOOLCHAIN)
-    set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Toolchain Libraries")
-  elseif (ARG_OBJECT)
-    set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Object Libraries")
+  if (need_objectlib)
+    add_library(${name_object} OBJECT ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+    set_target_properties(${name_object} PROPERTIES FOLDER "Flang-RT/Object Libraries")
+
+    # Replace arguments for the libraries we are going to create
+    set(ARG_ADDITIONAL_HEADERS "")
+    set(ARG_UNPARSED_ARGUMENTS $<TARGET_OBJECTS:${objectlib_name}>)
+    set(srctargets ${name_object})
+    set(liblist nostargets)
+    set(alltargets ${name_object})
   else ()
-    set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Libraries")
+    set(liblist srctargets)
+    set(alltargets)
+  endif ()
+
+  set(libtargets "")
+  if (build_static)
+    add_library(${name_static} STATIC ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+    list(APPEND alltargets ${name_static})
+    list(APPEND libtargets ${name_static})
+    list(APPEND ${liblist} ${name_static})
   endif ()
+  if (build_shared)
+    add_library(${name_shared} SHARED ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+    list(APPEND alltargets ${name_shared})
+    list(APPEND libtargets ${name_shared})
+    list(APPEND ${liblist} ${name_shared})
+  endif ()
+
+  foreach (name IN LISTS libtargets)
+    if (ARG_INSTALL_WITH_TOOLCHAIN)
+      set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Toolchain Libraries")
+    else ()
+      set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Libraries")
+    endif ()
+  endforeach ()
+
+  foreach (name IN LISTS alltargets)
+    # Minimum required C++ version for Flang-RT, even if CMAKE_CXX_STANDARD is defined to something else.
+    target_compile_features(${name} PRIVATE cxx_std_17)
 
-  # Minimum required C++ version for Flang-RT, even if CMAKE_CXX_STANDARD is defined to something else.
-  target_compile_features(${name} PRIVATE cxx_std_17)
 
   # Use compiler-specific options to disable exceptions and RTTI.
   if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
@@ -163,4 +245,5 @@ function (add_flangrt_library name)
   if (NOT ARG_EXCLUDE_FROM_ALL)
     add_dependencies(flang-rt ${name})
   endif ()
+  endforeach ()
 endfunction (add_flangrt_library)



More information about the llvm-branch-commits mailing list