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-proj...@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) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits