First of all, `LLVM_TOOLS_INSTALL_DIR` put there breaks our NixOS
builds, because `LLVM_TOOLS_INSTALL_DIR` defined the same as
`CMAKE_INSTALL_BINDIR` becomes an *absolute* path, and then when
downstream projects try to install there too this breaks because our
builds always install to fresh directories for isolation's sake.
Second of all, note that `LLVM_TOOLS_INSTALL_DIR` stands out against the
other specially crafted `LLVM_CONFIG_*` variables substituted in
`llvm/cmake/modules/LLVMConfig.cmake.in`.
@beanz added it in d0e1c2a550 to fix a
dangling reference in `AddLLVM`, but I am suspicious of how this
variable doesn't follow the pattern.
Those other ones are carefully made to be build-time vs install-time
variables depending on which `LLVMConfig.cmake` is being generated, are
carefully made relative as appropriate, etc. etc. For my NixOS use-case
they are also fine because they are never used as downstream install
variables, only for reading not writing.
To avoid the problems I face, and restore symmetry, I deleted the
exported and arranged to have many `${project}_TOOLS_INSTALL_DIR`s.
`AddLLVM` now instead expects each project to define its own, and they
do so based on `CMAKE_INSTALL_BINDIR`. `LLVMConfig` still exports
`LLVM_TOOLS_BINARY_DIR` which is the location for the tools defined in
the usual way, matching the other remaining exported variables.
For the `AddLLVM` changes, I tried to copy the existing pattern of
internal vs non-internal or for LLVM vs for downstream function/macro
names, but it would good to confirm I did that correctly.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D117977
130 lines
3.9 KiB
CMake
130 lines
3.9 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} (${BACKEND_PACKAGE_STRING})"
|
|
PRODUCT_NAME "flang")
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(add_flang_subdirectory name)
|
|
add_llvm_subdirectory(FLANG TOOL ${name})
|
|
endmacro()
|
|
|
|
macro(add_flang_library name)
|
|
cmake_parse_arguments(ARG
|
|
"SHARED;STATIC"
|
|
""
|
|
"ADDITIONAL_HEADERS"
|
|
${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)
|
|
set(LIBTYPE SHARED)
|
|
else()
|
|
# llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
|
|
# so we need to handle it here.
|
|
if (BUILD_SHARED_LIBS AND NOT ARG_STATIC)
|
|
set(LIBTYPE SHARED OBJECT)
|
|
else()
|
|
set(LIBTYPE STATIC OBJECT)
|
|
endif()
|
|
set_property(GLOBAL APPEND PROPERTY FLANG_STATIC_LIBS ${name})
|
|
endif()
|
|
|
|
llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
|
|
|
|
if (TARGET ${name})
|
|
|
|
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libflang")
|
|
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})
|
|
endmacro(add_flang_library)
|
|
|
|
macro(add_flang_executable name)
|
|
add_llvm_executable(${name} ${ARGN})
|
|
set_target_properties(${name} PROPERTIES FOLDER "Flang executables")
|
|
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()
|
|
|