diff --git a/bolt/CMakeLists.txt b/bolt/CMakeLists.txt --- a/bolt/CMakeLists.txt +++ b/bolt/CMakeLists.txt @@ -4,6 +4,12 @@ set(BOLT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_CXX_STANDARD 17) +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + +include(GNUInstallDirs) +include(GNUBinaryDirs) + 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 @@ -1,5 +1,8 @@ cmake_minimum_required(VERSION 3.13.4) +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) @@ -7,8 +10,20 @@ set(CLANG_BUILT_STANDALONE TRUE) endif() +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${CLANG_SOURCE_DIR}/../cmake) +endif() + +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) if(CLANG_BUILT_STANDALONE) set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") @@ -35,15 +50,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) @@ -140,15 +147,10 @@ set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}") endif() # standalone -if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) - set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_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 - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${LLVM_COMMON_CMAKE_UTILS}/Modules" + "${CLANG_CURRENT_SOURCE_DIR}/cmake/modules" ) if(LLVM_ENABLE_LIBXML2) @@ -310,9 +312,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,7 @@ option(CLANG_INSTALL_SCANBUILD "Install the scan-build tool" ON) include(GNUInstallDirs) +include(GNUBinaryDirs) if (WIN32 AND NOT CYGWIN) set(BinFiles diff --git a/cmake/Modules/GNUBinaryDirs.cmake b/cmake/Modules/GNUBinaryDirs.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/GNUBinaryDirs.cmake @@ -0,0 +1,14 @@ +if (NOT DEFINED CMAKE_BINARY_BINDIR) + set(CMAKE_BINARY_BINDIR "${CMAKE_BINARY_DIR}/bin") +endif() + +if (NOT DEFINED CMAKE_BINARY_INCLUDEDIR) + set(CMAKE_BINARY_INCLUDEDIR "${CMAKE_BINARY_DIR}/include") +endif() + +if (NOT DEFINED CMAKE_LIBDIR_BASENAME) + get_filename_component(CMAKE_LIBDIR_BASENAME "${CMAKE_INSTALL_LIBDIR}" NAME) +endif() +if (NOT DEFINED CMAKE_BINARY_LIBDIR) + set(CMAKE_BINARY_LIBDIR "${CMAKE_BINARY_DIR}/${CMAKE_LIBDIR_BASENAME}") +endif() diff --git a/cmake/Modules/LLVMLibdirSuffix.cmake b/cmake/Modules/LLVMLibdirSuffix.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/LLVMLibdirSuffix.cmake @@ -0,0 +1,5 @@ +# 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() 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,12 @@ "${LLVM_COMMON_CMAKE_UTILS}/Modules" ) +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + +include(GNUInstallDirs) +include(GNUBinaryDirs) + 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 @@ -8,6 +8,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. \ @@ -29,11 +30,22 @@ set(FLANG_STANDALONE_BUILD OFF) endif() +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)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) 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") @@ -189,12 +201,6 @@ ${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(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}") set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --src-root set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --includedir @@ -225,8 +231,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) @@ -235,14 +240,9 @@ ${FLANG_BINARY_DIR}/include ${FLANG_SOURCE_DIR}/include) -if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) - set(LLVM_COMMON_CMAKE_UTILS ${FLANG_SOURCE_DIR}/../cmake) -endif() - # 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,12 @@ # Default to C++17 set(CMAKE_CXX_STANDARD 17) +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + +include(GNUInstallDirs) +include(GNUBinaryDirs) + # 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,11 @@ set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build") +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + include(GNUInstallDirs) +include(GNUBinaryDirs) # Require out of source build. include(MacroEnsureOutOfSourceBuild) @@ -151,8 +155,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 @@ -415,31 +417,43 @@ set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "Path where built libc++ runtime libraries should be installed.") +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 "${CMAKE_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 @@ -235,11 +235,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`` @@ -267,7 +262,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,11 @@ set(LIBCXXABI_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH "Specify path to libc++ source.") +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + include(GNUInstallDirs) +include(GNUBinaryDirs) # Require out of source build. include(MacroEnsureOutOfSourceBuild) @@ -74,8 +78,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) @@ -184,25 +186,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,11 @@ set(LIBUNWIND_LIBCXX_PATH "${CMAKE_CURRENT_LIST_DIR}/../libcxx" CACHE PATH "Specify path to libc++ source.") +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + include(GNUInstallDirs) +include(GNUBinaryDirs) #=============================================================================== # Setup CMake Options @@ -51,8 +55,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." OFF) -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 @@ -116,21 +118,28 @@ "Path where built libunwind runtime libraries should be installed.") 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 @@ -1,5 +1,8 @@ cmake_minimum_required(VERSION 3.13.4) +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) @@ -7,8 +10,20 @@ set(LLD_BUILT_STANDALONE TRUE) endif() +if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) + set(LLVM_COMMON_CMAKE_UTILS ${LLD_SOURCE_DIR}/../cmake) +endif() + +list(INSERT CMAKE_MODULE_PATH 0 + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + +# Must go before the first `include(GNUInstallDirs)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) if(LLD_BUILT_STANDALONE) set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") @@ -29,8 +44,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) @@ -105,9 +119,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.") @@ -140,14 +152,9 @@ "`CMakeFiles'. Please delete them.") endif() -if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) - set(LLVM_COMMON_CMAKE_UTILS ${LLD_SOURCE_DIR}/../cmake) -endif() - # 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 @@ -1,12 +1,5 @@ cmake_minimum_required(VERSION 3.13.4) -# 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) @@ -14,8 +7,26 @@ set(LLDB_BUILT_STANDALONE TRUE) endif() +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)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) + +# Add path for custom modules. +list(INSERT CMAKE_MODULE_PATH 0 + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" + ) if(LLDB_BUILT_STANDALONE) include(LLDBStandalone) 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 @@ -4,12 +4,6 @@ cmake_policy(SET CMP0116 OLD) endif() -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) @@ -74,15 +68,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 @@ -51,20 +51,26 @@ 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)`. +include(LLVMLibdirSuffix) -# Must go after `DEFINED LLVM_LIBDIR_SUFFIX` check. +# Must go after `include(LLVMLibdirSuffix)`. set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" ) # Must go after `project(..)`. include(GNUInstallDirs) +include(GNUBinaryDirs) # This C++ standard is required to build LLVM. set(LLVM_REQUIRED_CXX_STANDARD 17) @@ -279,7 +285,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, @@ -381,14 +386,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 @@ -1,13 +1,28 @@ # MLIR project. +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() +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)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) if(MLIR_STANDALONE_BUILD) cmake_minimum_required(VERSION 3.13.4) @@ -36,12 +51,10 @@ "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}) if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) @@ -52,7 +65,6 @@ # 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,6 +7,18 @@ project(openmp C CXX) endif() +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)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) @@ -51,6 +56,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,28 @@ # 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() +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)`. +include(LLVMLibdirSuffix) + # Must go below project(..) include(GNUInstallDirs) +include(GNUBinaryDirs) if(POLLY_STANDALONE_BUILD) # Where is LLVM installed? @@ -48,18 +64,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")