mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 12:46:08 +00:00

When the `add_flang_library` was first added, it was apparently copied over from `add_clang_library`, including its logic to determine the library type. It includes a workaround: If `BUILD_SHARED_LIBS` is enabled, it should build all libraries as shared, including those that are explicitly marked as `STATIC`[^1], because `add_clang_library` always passes at least one of `STATIC`/`SHARED` to `llvm_add_library`, and `llvm_add_library` could not distinguish the two cases. Then, the two implementations diverged. For its runtime libraries, Flang requires some libraries to always be static libraries, so if a library is explicitly marked as `STATIC`, `BUILD_SHARED_LIBS` is ignored[^2]. I noticed the two implementations of the same functionality, modified only the `add_clang_library`, and copied over the result to `add_flang_library`[^3], without noticing that they are slightly different. As a result, Flang runtime libraries would be built as shared libraries with `-DBUILD_SHARED_LIBS=ON`, which may break some build configurations[^4]. This PR fixes the problem and at the same time simplifies the library type algorithm by just passing SHARED/STATIC verbatim to `llvm_add_library`. This is effectively what [^2] should have done instead adding more code to undo the workaround of [^1]. Ideally, one would use ``` llvm_add_library(${name} ${ARG_STATIC} ${ARG_SHARED} [...]) ``` but `ARG_STATIC`/`ARG_SHARED` as set by `cmake_parse_arguments` contain `TRUE`/`FALSE` instead of the keywords themselves. I could imagine a utility function akin to `pythonize_bool` that does this. This simplification adds two more changes: 1. Object libraries are not explicitly requested anymore. `llvm_add_library` itself should determine whether an object library is necessary. As the comment notes, using an object library is not without problems and seem of no use here since it works fine without object library when in `XCODE`/`MSVC_IDE` mode. 2. The property `CLANG_STATIC_LIBS` was removed. It was `FLANG_STATIC_LIBS` before to copy&paste error of #93519 [^3] which not used anywhere. In clang, `CLANG_STATIC_LIBS` is used for `clang-shlib` to include all component libraries in a single large library. There is no equivalent `flang-shlib`. [^1]: dbc2a12c7311ff4cc2cd7887d128b506bd35b579 [^2]: 3d2e05d542e646891745c5278a09950d3c4fb4a5 [^3]: #93519 [^4]: https://github.com/llvm/llvm-project/pull/93519#issuecomment-2192359002
133 lines
4.0 KiB
CMake
133 lines
4.0 KiB
CMake
include(GNUInstallDirs)
|
|
include(LLVMDistributionSupport)
|
|
|
|
macro(set_flang_windows_version_resource_properties name)
|
|
if (DEFINED windows_resource_file)
|
|
set_windows_version_resource_properties(${name} ${windows_resource_file}
|
|
VERSION_MAJOR ${FLANG_VERSION_MAJOR}
|
|
VERSION_MINOR ${FLANG_VERSION_MINOR}
|
|
VERSION_PATCHLEVEL ${FLANG_VERSION_PATCHLEVEL}
|
|
VERSION_STRING "${FLANG_VERSION}"
|
|
PRODUCT_NAME "flang")
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(add_flang_subdirectory name)
|
|
add_llvm_subdirectory(FLANG TOOL ${name})
|
|
endmacro()
|
|
|
|
function(add_flang_library name)
|
|
set(options SHARED STATIC INSTALL_WITH_TOOLCHAIN)
|
|
set(multiValueArgs ADDITIONAL_HEADERS CLANG_LIBS)
|
|
cmake_parse_arguments(ARG
|
|
"${options}"
|
|
""
|
|
"${multiValueArgs}"
|
|
${ARGN})
|
|
|
|
set(srcs)
|
|
if (MSVC_IDE OR XCODE)
|
|
# Add public headers
|
|
file(RELATIVE_PATH lib_path
|
|
${FLANG_SOURCE_DIR}/lib/
|
|
${CMAKE_CURRENT_SOURCE_DIR})
|
|
if(NOT lib_path MATCHES "^[.][.]")
|
|
file( GLOB_RECURSE headers
|
|
${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.h
|
|
${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.def)
|
|
set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
|
|
|
|
if (headers)
|
|
set(srcs ${headers})
|
|
endif()
|
|
endif()
|
|
endif(MSVC_IDE OR XCODE)
|
|
|
|
if (srcs OR ARG_ADDITIONAL_HEADERS)
|
|
set(srcs
|
|
ADDITIONAL_HEADERS
|
|
${srcs}
|
|
${ARG_ADDITIONAL_HEADERS}) # It may contain unparsed unknown args.
|
|
|
|
endif()
|
|
|
|
if(ARG_SHARED AND ARG_STATIC)
|
|
set(LIBTYPE SHARED STATIC)
|
|
elseif(ARG_SHARED)
|
|
set(LIBTYPE SHARED)
|
|
elseif(ARG_STATIC)
|
|
# If BUILD_SHARED_LIBS and ARG_STATIC are both set, llvm_add_library prioritizes STATIC.
|
|
# This is required behavior for libFortranFloat128Math.
|
|
set(LIBTYPE STATIC)
|
|
else()
|
|
# Let llvm_add_library decide, taking BUILD_SHARED_LIBS into account.
|
|
set(LIBTYPE)
|
|
endif()
|
|
llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
|
|
|
|
clang_target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS})
|
|
|
|
if (TARGET ${name})
|
|
|
|
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libflang"
|
|
OR ARG_INSTALL_WITH_TOOLCHAIN)
|
|
get_target_export_arg(${name} Flang export_to_flangtargets UMBRELLA flang-libraries)
|
|
install(TARGETS ${name}
|
|
COMPONENT ${name}
|
|
${export_to_flangtargets}
|
|
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
|
|
|
if (NOT LLVM_ENABLE_IDE)
|
|
add_llvm_install_targets(install-${name}
|
|
DEPENDS ${name}
|
|
COMPONENT ${name})
|
|
endif()
|
|
|
|
set_property(GLOBAL APPEND PROPERTY FLANG_LIBS ${name})
|
|
endif()
|
|
set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
|
|
else()
|
|
# Add empty "phony" target
|
|
add_custom_target(${name})
|
|
endif()
|
|
|
|
set_target_properties(${name} PROPERTIES FOLDER "Flang/Libraries")
|
|
set_flang_windows_version_resource_properties(${name})
|
|
endfunction(add_flang_library)
|
|
|
|
macro(add_flang_executable name)
|
|
add_llvm_executable(${name} ${ARGN})
|
|
set_flang_windows_version_resource_properties(${name})
|
|
endmacro(add_flang_executable)
|
|
|
|
macro(add_flang_tool name)
|
|
if (NOT FLANG_BUILD_TOOLS)
|
|
set(EXCLUDE_FROM_ALL ON)
|
|
endif()
|
|
|
|
add_flang_executable(${name} ${ARGN})
|
|
|
|
if (FLANG_BUILD_TOOLS)
|
|
get_target_export_arg(${name} Flang export_to_flangtargets)
|
|
install(TARGETS ${name}
|
|
${export_to_flangtargets}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
|
COMPONENT ${name})
|
|
|
|
if(NOT LLVM_ENABLE_IDE)
|
|
add_llvm_install_targets(install-${name}
|
|
DEPENDS ${name}
|
|
COMPONENT ${name})
|
|
endif()
|
|
set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(add_flang_symlink name dest)
|
|
llvm_add_tool_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE)
|
|
# Always generate install targets
|
|
llvm_install_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE)
|
|
endmacro()
|