Skip to content

Commit e4faa5c

Browse files
committed
CMake: Deprecate using llvm-config to detect llvm installation
Summary: clang currently uses llvm-config to determine the installation paths for llvm's headers and binaries. clang is also using LLVM's cmake files to determine other information about the LLVM build, like LLVM_LIBDIR_SUFFIX, LLVM_VERSION_*, etc. Since the installation paths are also available via the cmake files, we can simplify the code by only relying on information from cmake about the LLVM install and dropping the use of llvm-config altogether. In addition to simplifying the code, the cmake files have more accurate information about the llvm installation paths. llvm-config assumes that the lib, bin, and cmake directories are always located in the same place relative to the path of the llvm-config executable. This can be wrong if a user decides to install headers, binaries or libraries to a non-standard location: e.g. static libraries installed to /usr/lib/llvm6.0/ This patch takes the first step towards dropping llvm-config by removing the automatic detection of llvm-config (users can still manually supply a path to llvm-config by passing -DLLVM_CONFIG=/usr/bin/llvm-config to cmake) and adding a deprecation warning when users try to use this option. Reviewers: chandlerc, beanz, mgorny, chapuni Subscribers: mehdi_amini, dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D51714 llvm-svn: 346732
1 parent 17e7bf8 commit e4faa5c

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

clang/CMakeLists.txt

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,14 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
1111

1212
# Rely on llvm-config.
1313
set(CONFIG_OUTPUT)
14-
find_program(LLVM_CONFIG "llvm-config")
1514
if(LLVM_CONFIG)
15+
set (LLVM_CONFIG_FOUND 1)
1616
message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
17+
message(DEPRECATION "Using llvm-config to detect the LLVM installation is \
18+
deprecated. The installed cmake files should be used \
19+
instead. CMake should be able to detect your LLVM install \
20+
automatically, but you can also use LLVM_DIR to specify \
21+
the path containing LLVMConfig.cmake.")
1722
set(CONFIG_COMMAND ${LLVM_CONFIG}
1823
"--assertion-mode"
1924
"--bindir"
@@ -36,17 +41,20 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
3641
message(STATUS "${CONFIG_COMMAND_STR}")
3742
message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
3843
endif()
39-
else()
40-
message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}")
44+
45+
list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS)
46+
list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
47+
list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
48+
list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
49+
list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
50+
list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR)
51+
list(GET CONFIG_OUTPUT 6 LLVM_CONFIG_CMAKE_PATH)
52+
53+
# Normalize LLVM_CMAKE_PATH. --cmakedir might contain backslashes.
54+
# CMake assumes slashes as PATH.
55+
file(TO_CMAKE_PATH ${LLVM_CONFIG_CMAKE_PATH} LLVM_CMAKE_PATH)
4156
endif()
4257

43-
list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS)
44-
list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
45-
list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
46-
list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
47-
list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
48-
list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR)
49-
list(GET CONFIG_OUTPUT 6 LLVM_CONFIG_CMAKE_PATH)
5058

5159
if(NOT MSVC_IDE)
5260
set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
@@ -55,22 +63,29 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
5563
mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
5664
endif()
5765

66+
find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}")
67+
list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
68+
69+
# We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
70+
# LLVM_CONFIG.
71+
if (NOT LLVM_CONFIG_FOUND)
72+
# Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
73+
# path is removed.
74+
set(TOOLS_BINARY_DIR ${LLVM_TOOLS_BINARY_DIR})
75+
set(LIBRARY_DIR ${LLVM_LIBRARY_DIR})
76+
set(INCLUDE_DIR ${LLVM_INCLUDE_DIR})
77+
set(LLVM_OBJ_DIR ${LLVM_BINARY_DIR})
78+
endif()
79+
5880
set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")
5981
set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")
6082
set(LLVM_MAIN_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
6183
set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
6284
set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
6385

64-
# Normalize LLVM_CMAKE_PATH. --cmakedir might contain backslashes.
65-
# CMake assumes slashes as PATH.
66-
file(TO_CMAKE_PATH ${LLVM_CONFIG_CMAKE_PATH} LLVM_CMAKE_PATH)
67-
6886
find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
6987
NO_DEFAULT_PATH)
7088

71-
find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}")
72-
list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
73-
7489
# They are used as destination of target generators.
7590
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
7691
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})

0 commit comments

Comments
 (0)