diff --git a/bolt/CMakeLists.txt b/bolt/CMakeLists.txt --- a/bolt/CMakeLists.txt +++ b/bolt/CMakeLists.txt @@ -4,6 +4,10 @@ set(BOLT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_CXX_STANDARD 17) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) + set(BOLT_ENABLE_RUNTIME OFF) if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") set(BOLT_ENABLE_RUNTIME ON) diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -6,6 +6,9 @@ include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) +set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + # If we are not building as a part of LLVM, build Clang as an # standalone project, using LLVM as an external library: if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) @@ -13,8 +16,13 @@ set(CLANG_BUILT_STANDALONE TRUE) endif() -# Must go below project(..) -include(GNUInstallDirs) +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if(CLANG_BUILT_STANDALONE) set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") @@ -41,15 +49,7 @@ find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) - # They are used as destination of target generators. - set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) - set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) - if(WIN32 OR CYGWIN) - # DLL platform -- put DLLs into bin. - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) - else() - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) - endif() + include(LLVMSetIntDirs) option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF) @@ -145,8 +145,7 @@ # Make sure that our source directory is on the current cmake module path so that # we can include cmake files from this directory. list(INSERT CMAKE_MODULE_PATH 0 - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" + "${CLANG_CURRENT_SOURCE_DIR}/cmake/modules" ) # This allows disabling clang's XML dependency even if LLVM finds libxml2. @@ -296,9 +295,6 @@ "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')") mark_as_advanced(CLANG_TOOLS_INSTALL_DIR) -set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) - if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE ) message(FATAL_ERROR "In-source builds are not allowed. " "Please create a directory and run cmake " diff --git a/clang/tools/scan-build/CMakeLists.txt b/clang/tools/scan-build/CMakeLists.txt --- a/clang/tools/scan-build/CMakeLists.txt +++ b/clang/tools/scan-build/CMakeLists.txt @@ -1,6 +1,6 @@ option(CLANG_INSTALL_SCANBUILD "Install the scan-build tool" ON) -include(GNUInstallDirs) +include(LLVMGNUDirs) if (WIN32 AND NOT CYGWIN) set(BinFiles diff --git a/cmake/Modules/LLVMGNUDirs.cmake b/cmake/Modules/LLVMGNUDirs.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/LLVMGNUDirs.cmake @@ -0,0 +1,25 @@ +# Must go before the first `include(GNUInstallDirs)`. + +if (NOT DEFINED CMAKE_INSTALL_LIBDIR AND DEFINED LLVM_LIBDIR_SUFFIX) + set(CMAKE_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") +endif() + +include(GNUInstallDirs) + +# `LLVMPROJ` used to distinguish project-wide vars from LLVM itself, one +# "project" in here among many. + +if (NOT DEFINED LLVMPROJ_BINARY_BINDIR) + set(LLVMPROJ_BINARY_BINDIR "${LLVMPROJ_BINARY_DIR}/bin") +endif() + +if (NOT DEFINED LLVMPROJ_BINARY_INCLUDEDIR) + set(LLVMPROJ_BINARY_INCLUDEDIR "${LLVMPROJ_BINARY_DIR}/include") +endif() + +if (NOT DEFINED LLVMPROJ_LIBDIR_BASENAME) + get_filename_component(LLVMPROJ_LIBDIR_BASENAME "${LLVMPROJ_INSTALL_LIBDIR}" NAME) +endif() +if (NOT DEFINED LLVMPROJ_BINARY_LIBDIR) + set(LLVMPROJ_BINARY_LIBDIR "${LLVMPROJ_BINARY_DIR}/${LLVMPROJ_LIBDIR_BASENAME}") +endif() diff --git a/cmake/Modules/LLVMSetIntDirs.cmake b/cmake/Modules/LLVMSetIntDirs.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/LLVMSetIntDirs.cmake @@ -0,0 +1,9 @@ +# They are used as destination of target generators. +set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) +set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${CMAKE_LIBDIR_BASENAME}) +if(WIN32 OR CYGWIN) + # DLL platform -- put DLLs into bin. + set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) +else() + set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) +endif() diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -22,6 +22,10 @@ "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) + if(CMAKE_CONFIGURATION_TYPES) set(CMAKE_CFG_RESOLVED_INTDIR "${CMAKE_CFG_INTDIR}/") else() diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake --- a/compiler-rt/cmake/base-config-ix.cmake +++ b/compiler-rt/cmake/base-config-ix.cmake @@ -97,28 +97,34 @@ string(TOLOWER ${CMAKE_SYSTEM_NAME} COMPILER_RT_OS_DIR) endif() endif() + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(COMPILER_RT_OUTPUT_LIBRARY_DIR ${COMPILER_RT_OUTPUT_DIR}/lib) extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) - set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH - "Path where built compiler-rt libraries should be installed.") else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(COMPILER_RT_OUTPUT_LIBRARY_DIR ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") - set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH - "Path where built compiler-rt libraries should be installed.") endif() +set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built compiler-rt libraries should be installed.") +unset(default_install_path) + extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_BINDIR}") set(COMPILER_RT_INSTALL_BINARY_DIR "${default_install_path}" CACHE PATH "Path where built compiler-rt executables should be installed.") +unset(default_install_path) + extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_INCLUDEDIR}") set(COMPILER_RT_INSTALL_INCLUDE_DIR "${default_install_path}" CACHE PATH "Path where compiler-rt headers should be installed.") +unset(default_install_path) + extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_DATADIR}") set(COMPILER_RT_INSTALL_DATA_DIR "${default_install_path}" CACHE PATH "Path where compiler-rt data files should be installed.") +unset(default_install_path) if(APPLE) # On Darwin if /usr/include/c++ doesn't exist, the user probably has Xcode but diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt --- a/flang/CMakeLists.txt +++ b/flang/CMakeLists.txt @@ -14,6 +14,7 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE) message(FATAL_ERROR "In-source builds are not allowed. \ @@ -35,11 +36,19 @@ set(FLANG_STANDALONE_BUILD OFF) endif() -# Must go below project(..) -include(GNUInstallDirs) +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${FLANG_SOURCE_DIR}/../cmake) +endif() + +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if (FLANG_STANDALONE_BUILD) - set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) if (NOT MSVC_IDE) set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS} CACHE BOOL "Enable assertions") @@ -194,14 +203,8 @@ ${LLVM_INCLUDE_TESTS}) set(FLANG_GTEST_AVAIL 1) - if(FLANG_STANDALONE_BUILD) - set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang) - else() - set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) - endif() - - set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir ) # --src-root - set(MLIR_INCLUDE_DIR ${MLIR_MAIN_SRC_DIR}/include ) # --includedir + set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --src-root + set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --includedir set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include) include_directories(SYSTEM ${MLIR_INCLUDE_DIR}) include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR}) @@ -229,8 +232,7 @@ # tco tool and FIR lib output directories if(FLANG_STANDALONE_BUILD) - set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin) - set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib) + include(LLVMSetIntDirs) endif() # Always build tco tool set(LLVM_BUILD_TOOLS ON) @@ -242,7 +244,6 @@ # Add Flang-centric modules to cmake path. list(INSERT CMAKE_MODULE_PATH 0 "${FLANG_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) include(AddFlang) diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -3,6 +3,10 @@ # Default to C++17 set(CMAKE_CXX_STANDARD 17) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) + # Use old version of target_sources command which converts the source # file paths to full paths. cmake_policy(SET CMP0076 OLD) diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -22,7 +22,9 @@ set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build") -include(GNUInstallDirs) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) # Require out of source build. include(MacroEnsureOutOfSourceBuild) @@ -151,8 +153,6 @@ endif() option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS}) -set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING - "Define suffix of library directory name (32/64)") option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON) option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON) cmake_dependent_option(LIBCXX_INSTALL_STATIC_LIBRARY @@ -410,31 +410,43 @@ set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING "Output name for the shared libc++ runtime library.") set(LIBCXX_STATIC_OUTPUT_NAME "c++" CACHE STRING "Output name for the static libc++ runtime library.") +if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(default_install_path "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1") +else() + set(default_install_path "${LIBCXX_INSTALL_INCLUDE_DIR}") +endif() +set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${default_install_path}" CACHE PATH + "Path where target-specific libc++ headers should be installed.") +unset(default_install_path) + +if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}") +else() + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}") +endif() +set(LIBCXX_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built libc++ libraries should be installed.") +unset(default_install_path) + +get_filename_component(LIBCXX_LIBDIR_BASENAME "${LIBCXX_INSTALL_LIBRARY_DIR}" NAME) + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1") - set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH - "Path where built libc++ libraries should be installed.") - set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE PATH - "Path where target-specific libc++ headers should be installed.") if(LIBCXX_LIBDIR_SUBDIR) - string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR}) - string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR}) + string(APPEND LIBCXX_LIBRARY_DIR "/${LIBCXX_LIBDIR_SUBDIR}") + string(APPEND LIBCXX_INSTALL_LIBRARY_DIR "/${LIBCXX_LIBDIR_SUBDIR}") endif() else() if(LLVM_LIBRARY_OUTPUT_INTDIR) - set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) + set(LIBCXX_LIBRARY_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}") set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") else() - set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX}) - set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1") + set(LIBCXX_LIBRARY_DIR "${CMAKE_BINARY_DIR}/${LIBCXX_LIBDIR_BASENAME}") + set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVMPROJ_BINARY_INCLUDEDIR}/c++/v1") endif() set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}") - set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH - "Path where built libc++ libraries should be installed.") - set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE PATH - "Path where target-specific libc++ headers should be installed.") endif() file(MAKE_DIRECTORY "${LIBCXX_BINARY_INCLUDE_DIR}") diff --git a/libcxx/docs/BuildingLibcxx.rst b/libcxx/docs/BuildingLibcxx.rst --- a/libcxx/docs/BuildingLibcxx.rst +++ b/libcxx/docs/BuildingLibcxx.rst @@ -234,11 +234,6 @@ Build libc++ as a static library. Either `LIBCXX_ENABLE_SHARED` or `LIBCXX_ENABLE_STATIC` has to be enabled. -.. option:: LIBCXX_LIBDIR_SUFFIX:STRING - - Extra suffix to append to the directory where libraries are to be installed. - This option overrides `LLVM_LIBDIR_SUFFIX`. - .. option:: LIBCXX_HERMETIC_STATIC_LIBRARY:BOOL **Default**: ``OFF`` @@ -266,7 +261,7 @@ .. option:: LIBCXX_INSTALL_LIBRARY_DIR:PATH - **Default**: ``lib${LIBCXX_LIBDIR_SUFFIX}`` + **Default**: ``lib${LLVM_LIBDIR_SUFFIX}`` Path where built libc++ libraries should be installed. If a relative path, relative to ``CMAKE_INSTALL_PREFIX``. diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -23,7 +23,9 @@ set(LIBCXXABI_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH "Specify path to libc++ source.") -include(GNUInstallDirs) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) # Require out of source build. include(MacroEnsureOutOfSourceBuild) @@ -74,8 +76,6 @@ endif() option(LIBCXXABI_INCLUDE_TESTS "Generate build targets for the libc++abi unit tests." ${LLVM_INCLUDE_TESTS}) -set(LIBCXXABI_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING - "Define suffix of library directory name (32/64)") option(LIBCXXABI_INSTALL_HEADERS "Install the libc++abi headers." ON) option(LIBCXXABI_INSTALL_LIBRARY "Install the libc++abi library." ON) @@ -187,25 +187,32 @@ set(LIBCXXABI_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "Path where built libc++abi runtime libraries should be installed.") +if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}") +else() + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}") +endif() +set(LIBCXXABI_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built libc++abi libraries should be installed.") +unset(default_install_path) + +get_filename_component(LIBCXXABI_LIBDIR_BASENAME "${LIBCXXABI_INSTALL_LIBRARY_DIR}" NAME) + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR}) set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH - "Path where built libc++abi libraries should be installed.") if(LIBCXX_LIBDIR_SUBDIR) - string(APPEND LIBCXXABI_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR}) - string(APPEND LIBCXXABI_INSTALL_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR}) + string(APPEND LIBCXXABI_LIBRARY_DIR "/${LIBCXXABI_LIBDIR_SUBDIR}") + string(APPEND LIBCXXABI_INSTALL_LIBRARY_DIR "/${LIBCXXABI_LIBDIR_SUBDIR}") endif() else() if(LLVM_LIBRARY_OUTPUT_INTDIR) - set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR}) - set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) + set(LIBCXXABI_HEADER_DIR "${LLVM_BINARY_DIR}") + set(LIBCXXABI_LIBRARY_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}") else() set(LIBCXXABI_HEADER_DIR ${CMAKE_BINARY_DIR}) - set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX}) + set(LIBCXXABI_LIBRARY_DIR "${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBDIR_BASENAME}") endif() - set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX} CACHE PATH - "Path where built libc++abi libraries should be installed.") endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXXABI_LIBRARY_DIR}) diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -19,7 +19,9 @@ set(LIBUNWIND_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH "Specify path to libc++ source.") -include(GNUInstallDirs) +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) #=============================================================================== # Setup CMake Options @@ -51,8 +53,6 @@ option(LIBUNWIND_REMEMBER_HEAP_ALLOC "Use heap instead of the stack for .cfi_remember_state." OFF) option(LIBUNWIND_INSTALL_HEADERS "Install the libunwind headers." ON) -set(LIBUNWIND_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING - "Define suffix of library directory name (32/64)") option(LIBUNWIND_INSTALL_LIBRARY "Install the libunwind library." ON) cmake_dependent_option(LIBUNWIND_INSTALL_STATIC_LIBRARY "Install the static libunwind library." ON @@ -115,21 +115,28 @@ set(LIBUNWIND_STATIC_OUTPUT_NAME "unwind" CACHE STRING "Output name for the static libunwind runtime library.") if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) - set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH - "Path where built libunwind libraries should be installed.") + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}") +else() + set(default_install_path "lib${LLVM_LIBDIR_SUFFIX}") +endif() +set(LIBUNWIND_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH + "Path where built libunwind libraries should be installed.") +unset(default_install_path) + +get_filename_component(LIBUNWIND_LIBDIR_BASENAME "${LIBUNWIND_INSTALL_LIBRARY_DIR}" NAME) + +if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBUNWIND_LIBRARY_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}") if(LIBCXX_LIBDIR_SUBDIR) - string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) - string(APPEND LIBUNWIND_INSTALL_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR}) + string(APPEND LIBUNWIND_LIBRARY_DIR "/${LIBUNWIND_LIBDIR_SUBDIR}") + string(APPEND LIBUNWIND_INSTALL_LIBRARY_DIR "/${LIBUNWIND_LIBDIR_SUBDIR}") endif() else() if(LLVM_LIBRARY_OUTPUT_INTDIR) - set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) + set(LIBUNWIND_LIBRARY_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}") else() - set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX}) + set(LIBUNWIND_LIBRARY_DIR "${CMAKE_BINARY_DIR}/${LIBUNWIND_LIBDIR_BASENAME}") endif() - set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH - "Path where built libunwind libraries should be installed.") endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBUNWIND_LIBRARY_DIR}) diff --git a/libunwind/docs/BuildingLibunwind.rst b/libunwind/docs/BuildingLibunwind.rst --- a/libunwind/docs/BuildingLibunwind.rst +++ b/libunwind/docs/BuildingLibunwind.rst @@ -144,7 +144,7 @@ .. option:: LIBUNWIND_INSTALL_LIBRARY_DIR:PATH - **Default**: ``lib${LIBUNWIND_LIBDIR_SUFFIX}`` + **Default**: ``lib${LLVM_LIBDIR_SUFFIX}`` Path where built libunwind libraries should be installed. If a relative path, relative to ``CMAKE_INSTALL_PREFIX``. diff --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt --- a/lld/CMakeLists.txt +++ b/lld/CMakeLists.txt @@ -6,6 +6,9 @@ include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) +set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + # If we are not building as a part of LLVM, build LLD as an # standalone project, using LLVM as an external library: if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) @@ -13,8 +16,13 @@ set(LLD_BUILT_STANDALONE TRUE) endif() -# Must go below project(..) -include(GNUInstallDirs) +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if(LLD_BUILT_STANDALONE) set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") @@ -35,8 +43,7 @@ NO_DEFAULT_PATH) # They are used as destination of target generators. - set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) - set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) + include(LLVMSetIntDirs) include(AddLLVM) include(TableGen) @@ -111,9 +118,7 @@ "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')") mark_as_advanced(LLD_TOOLS_INSTALL_DIR) -set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include ) -set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(LLD_VENDOR ${PACKAGE_VENDOR} CACHE STRING "Vendor-specific text for showing with version information.") @@ -149,7 +154,6 @@ # Add path for custom modules. list(INSERT CMAKE_MODULE_PATH 0 "${LLD_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) include(AddLLD) diff --git a/lldb/CMakeLists.txt b/lldb/CMakeLists.txt --- a/lldb/CMakeLists.txt +++ b/lldb/CMakeLists.txt @@ -6,13 +6,6 @@ include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) -# Add path for custom modules. -set(CMAKE_MODULE_PATH - ${CMAKE_MODULE_PATH} - "${CMAKE_CURRENT_SOURCE_DIR}/cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - ) - # If we are not building as part of LLVM, build LLDB as a standalone project, # using LLVM as an external library. if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) @@ -20,8 +13,19 @@ set(LLDB_BUILT_STANDALONE TRUE) endif() -# Must go below project(..) -include(GNUInstallDirs) +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) + +# Add path for custom modules. +list(INSERT CMAKE_MODULE_PATH 0 + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" + ) option(LLDB_INCLUDE_TESTS "Generate build targets for the LLDB unit tests." ${LLVM_INCLUDE_TESTS}) diff --git a/lldb/cmake/modules/LLDBStandalone.cmake b/lldb/cmake/modules/LLDBStandalone.cmake --- a/lldb/cmake/modules/LLDBStandalone.cmake +++ b/lldb/cmake/modules/LLDBStandalone.cmake @@ -1,9 +1,3 @@ -if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) - set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) -endif() - -list(APPEND CMAKE_MODULE_PATH "${LLVM_COMMON_CMAKE_UTILS}/Modules") - option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF) find_package(LLVM REQUIRED CONFIG HINTS ${LLVM_DIR} NO_CMAKE_FIND_ROOT_PATH) @@ -68,15 +62,7 @@ endif() endif() -# They are used as destination of target generators. -set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) -set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) -if(WIN32 OR CYGWIN) - # DLL platform -- put DLLs into bin. - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) -else() - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) -endif() +include(LLVMSetIntDirs) # We append the directory in which LLVMConfig.cmake lives. We expect LLVM's # CMake modules to be in that directory as well. diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -44,21 +44,24 @@ set(CMAKE_OSX_ARCHITECTURES "x86_64") endif() +set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) + +# Add path for common private CMake modules +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + project(LLVM VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} LANGUAGES C CXX ASM) -if (NOT DEFINED CMAKE_INSTALL_LIBDIR AND DEFINED LLVM_LIBDIR_SUFFIX) - # Must go before `include(GNUInstallDirs)`. - set(CMAKE_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") -endif() +# Must go before the first `include(GNUInstallDirs)`. +# Must go after `project(..)`. +include(LLVMGNUDirs) -# Must go after `DEFINED LLVM_LIBDIR_SUFFIX` check. +# Must go after `include(LLVMGNUDirs)`. set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) -# Must go after `project(..)`. -include(GNUInstallDirs) - # This C++ standard is required to build LLVM. set(LLVM_REQUIRED_CXX_STANDARD 17) @@ -278,7 +281,6 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) # Generate a CompilationDatabase (compile_commands.json file) for our build, @@ -385,14 +387,7 @@ mark_as_advanced(LLVM_EXAMPLES_INSTALL_DIR) # They are used as destination of target generators. -set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) -set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) -if(WIN32 OR CYGWIN) - # DLL platform -- put DLLs into bin. - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) -else() - set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) -endif() +include(LLVMSetIntDirs) # Each of them corresponds to llvm-config's. set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir diff --git a/mlir/CMakeLists.txt b/mlir/CMakeLists.txt --- a/mlir/CMakeLists.txt +++ b/mlir/CMakeLists.txt @@ -7,14 +7,26 @@ include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) +set(MLIR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(MLIR_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + # Check if MLIR is built as a standalone project. if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) project(mlir) set(MLIR_STANDALONE_BUILD TRUE) endif() -# Must go below project(..) -include(GNUInstallDirs) +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) +endif() + +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if(MLIR_STANDALONE_BUILD) find_package(LLVM CONFIG REQUIRED) @@ -43,19 +55,16 @@ "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')") mark_as_advanced(MLIR_TOOLS_INSTALL_DIR) -set(MLIR_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) +set(MLIR_MAIN_SRC_DIR ${MLIR_SOURCE_DIR} ) set(MLIR_MAIN_INCLUDE_DIR ${MLIR_MAIN_SRC_DIR}/include ) -set(MLIR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(MLIR_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) -set(MLIR_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) +set(MLIR_INCLUDE_DIR ${MLIR_BINARY_DIR}/include) set(MLIR_TOOLS_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) # Make sure that our source directory is on the current cmake module path so # that we can include cmake files from this directory. list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) include(AddMLIR) diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt --- a/openmp/CMakeLists.txt +++ b/openmp/CMakeLists.txt @@ -1,12 +1,5 @@ cmake_minimum_required(VERSION 3.13.4) -set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) - -# Add path for custom modules -list(INSERT CMAKE_MODULE_PATH 0 - "${CMAKE_CURRENT_SOURCE_DIR}/cmake" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" - ) # llvm/runtimes/ will set OPENMP_STANDALONE_BUILD. if (OPENMP_STANDALONE_BUILD OR "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") @@ -14,8 +7,18 @@ project(openmp C CXX) endif() -# Must go below project(..) -include(GNUInstallDirs) +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) +endif() + +# Add path for custom modules +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if (OPENMP_STANDALONE_BUILD) # CMAKE_BUILD_TYPE was not set, default to Release. @@ -51,6 +54,11 @@ endif() endif() +# Add path for custom modules +list(INSERT CMAKE_MODULE_PATH 0 + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + ) + # Check and set up common compiler flags. include(config-ix) include(HandleOpenMPOptions) diff --git a/polly/CMakeLists.txt b/polly/CMakeLists.txt --- a/polly/CMakeLists.txt +++ b/polly/CMakeLists.txt @@ -1,12 +1,25 @@ # Check if this is a in tree build. + +set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + if (NOT DEFINED LLVM_MAIN_SRC_DIR) project(Polly) cmake_minimum_required(VERSION 3.13.4) set(POLLY_STANDALONE_BUILD TRUE) endif() -# Must go below project(..) -include(GNUInstallDirs) +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${POLLY_SOURCE_DIR}/../cmake) +endif() + +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +# Must go after project(..) +include(LLVMGNUDirs) if(POLLY_STANDALONE_BUILD) # Where is LLVM installed? @@ -48,18 +61,10 @@ set(POLLY_GTEST_AVAIL 1) endif () -set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) - -if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) - set(LLVM_COMMON_CMAKE_UTILS ${POLLY_SOURCE_DIR}/../cmake) -endif() - # Make sure that our source directory is on the current cmake module path so that # we can include cmake files from this directory. list(INSERT CMAKE_MODULE_PATH 0 "${POLLY_SOURCE_DIR}/cmake" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) include("polly_macros")