mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-12 18:02:43 +00:00
a5359b1b07
Until recently, Python_ADDITIONAL_VERSIONS was used to limit LLVM's Python support to 2.7. Now that both LLVM and LLDB both support Python 3, there's no longer a need to put an arbitrary limit on this. However, instead of removing the variable, r365692 expanded the list, which has the (presumably unintentional) side-effect of expression preference for Python 3. Instead, as Michal proposed in the original code review, we should just not set the list at all, and let CMake pick whatever Python interpreter you have in your path. This patch removes the Python_ADDITIONAL_VERSIONS variable in llvm, clang and lld. I've also updated the docs with the default behavior and how to force a different Python version to be used. Differential revision: https://reviews.llvm.org/D64894 llvm-svn: 366447
226 lines
7.8 KiB
CMake
226 lines
7.8 KiB
CMake
# Check if lld is built as a standalone project.
|
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
project(lld)
|
|
cmake_minimum_required(VERSION 3.4.3)
|
|
|
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
set(LLD_BUILT_STANDALONE TRUE)
|
|
|
|
find_program(LLVM_CONFIG_PATH "llvm-config" DOC "Path to llvm-config binary")
|
|
if(NOT LLVM_CONFIG_PATH)
|
|
message(FATAL_ERROR "llvm-config not found: specify LLVM_CONFIG_PATH")
|
|
endif()
|
|
|
|
execute_process(COMMAND "${LLVM_CONFIG_PATH}"
|
|
"--obj-root"
|
|
"--includedir"
|
|
"--cmakedir"
|
|
"--src-root"
|
|
RESULT_VARIABLE HAD_ERROR
|
|
OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if(HAD_ERROR)
|
|
message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
|
|
endif()
|
|
|
|
string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" LLVM_CONFIG_OUTPUT "${LLVM_CONFIG_OUTPUT}")
|
|
|
|
list(GET LLVM_CONFIG_OUTPUT 0 OBJ_ROOT)
|
|
list(GET LLVM_CONFIG_OUTPUT 1 MAIN_INCLUDE_DIR)
|
|
list(GET LLVM_CONFIG_OUTPUT 2 LLVM_CMAKE_PATH)
|
|
list(GET LLVM_CONFIG_OUTPUT 3 MAIN_SRC_DIR)
|
|
|
|
set(LLVM_OBJ_ROOT ${OBJ_ROOT} CACHE PATH "path to LLVM build tree")
|
|
set(LLVM_MAIN_INCLUDE_DIR ${MAIN_INCLUDE_DIR} CACHE PATH "path to llvm/include")
|
|
set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
|
|
|
|
file(TO_CMAKE_PATH ${LLVM_OBJ_ROOT} LLVM_BINARY_DIR)
|
|
|
|
if(NOT EXISTS "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
|
|
message(FATAL_ERROR "LLVMConfig.cmake not found")
|
|
endif()
|
|
include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
|
|
|
set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
|
|
include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS})
|
|
link_directories(${LLVM_LIBRARY_DIRS})
|
|
|
|
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
|
|
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
|
|
find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)
|
|
|
|
include(AddLLVM)
|
|
include(TableGen)
|
|
include(HandleLLVMOptions)
|
|
|
|
if(LLVM_INCLUDE_TESTS)
|
|
include(FindPythonInterp)
|
|
if(NOT PYTHONINTERP_FOUND)
|
|
message(FATAL_ERROR
|
|
"Unable to find Python interpreter, required for testing.
|
|
|
|
Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
|
|
endif()
|
|
|
|
if(${PYTHON_VERSION_STRING} VERSION_LESS 2.7)
|
|
message(FATAL_ERROR "Python 2.7 or newer is required")
|
|
endif()
|
|
|
|
# Check prebuilt llvm/utils.
|
|
if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
|
|
AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
|
|
set(LLVM_UTILS_PROVIDED ON)
|
|
endif()
|
|
|
|
if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
|
|
# Note: path not really used, except for checking if lit was found
|
|
set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
|
|
if(NOT LLVM_UTILS_PROVIDED)
|
|
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
|
|
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
|
|
set(LLVM_UTILS_PROVIDED ON)
|
|
set(LLD_TEST_DEPS FileCheck not)
|
|
endif()
|
|
set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
|
|
if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
|
|
AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
|
|
AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
|
|
add_subdirectory(${UNITTEST_DIR} utils/unittest)
|
|
endif()
|
|
else()
|
|
# Seek installed Lit.
|
|
find_program(LLVM_LIT
|
|
NAMES llvm-lit lit.py lit
|
|
PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
|
|
DOC "Path to lit.py")
|
|
endif()
|
|
|
|
if(LLVM_LIT)
|
|
# Define the default arguments to use with 'lit', and an option for the user
|
|
# to override.
|
|
set(LIT_ARGS_DEFAULT "-sv")
|
|
if (MSVC OR XCODE)
|
|
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
|
|
endif()
|
|
set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
|
|
|
|
# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
|
|
if(WIN32 AND NOT CYGWIN)
|
|
set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
|
|
endif()
|
|
else()
|
|
set(LLVM_INCLUDE_TESTS OFF)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include )
|
|
set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
# Compute the LLD version from the LLVM version.
|
|
string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION
|
|
${PACKAGE_VERSION})
|
|
message(STATUS "LLD version: ${LLD_VERSION}")
|
|
|
|
string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR
|
|
${LLD_VERSION})
|
|
string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR
|
|
${LLD_VERSION})
|
|
|
|
# Determine LLD revision and repository.
|
|
# TODO: Figure out a way to get the revision and the repository on windows.
|
|
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" )
|
|
execute_process(COMMAND ${CMAKE_SOURCE_DIR}/utils/GetSourceVersion ${LLD_SOURCE_DIR}
|
|
OUTPUT_VARIABLE LLD_REVISION)
|
|
|
|
execute_process(COMMAND ${CMAKE_SOURCE_DIR}/utils/GetRepositoryPath ${LLD_SOURCE_DIR}
|
|
OUTPUT_VARIABLE LLD_REPOSITORY)
|
|
if ( LLD_REPOSITORY )
|
|
# Replace newline characters with spaces
|
|
string(REGEX REPLACE "(\r?\n)+" " " LLD_REPOSITORY ${LLD_REPOSITORY})
|
|
# Remove leading spaces
|
|
STRING(REGEX REPLACE "^[ \t\r\n]+" "" LLD_REPOSITORY "${LLD_REPOSITORY}" )
|
|
# Remove trailing spaces
|
|
string(REGEX REPLACE "(\ )+$" "" LLD_REPOSITORY ${LLD_REPOSITORY})
|
|
endif()
|
|
|
|
if ( LLD_REVISION )
|
|
# Replace newline characters with spaces
|
|
string(REGEX REPLACE "(\r?\n)+" " " LLD_REVISION ${LLD_REVISION})
|
|
# Remove leading spaces
|
|
STRING(REGEX REPLACE "^[ \t\r\n]+" "" LLD_REVISION "${LLD_REVISION}" )
|
|
# Remove trailing spaces
|
|
string(REGEX REPLACE "(\ )+$" "" LLD_REVISION ${LLD_REVISION})
|
|
endif()
|
|
endif ()
|
|
|
|
# Configure the Version.inc file.
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Common/Version.inc.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/include/lld/Common/Version.inc)
|
|
|
|
|
|
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
|
message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
|
|
"the makefiles distributed with LLVM. Please create a directory and run cmake "
|
|
"from there, passing the path to this source directory as the last argument. "
|
|
"This process created the file `CMakeCache.txt' and the directory "
|
|
"`CMakeFiles'. Please delete them.")
|
|
endif()
|
|
|
|
list (APPEND CMAKE_MODULE_PATH "${LLD_SOURCE_DIR}/cmake/modules")
|
|
|
|
include(AddLLD)
|
|
|
|
option(LLD_USE_VTUNE
|
|
"Enable VTune user task tracking."
|
|
OFF)
|
|
if (LLD_USE_VTUNE)
|
|
find_package(VTune)
|
|
if (VTUNE_FOUND)
|
|
include_directories(${VTune_INCLUDE_DIRS})
|
|
list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES})
|
|
add_definitions(-DLLD_HAS_VTUNE)
|
|
endif()
|
|
endif()
|
|
|
|
option(LLD_BUILD_TOOLS
|
|
"Build the lld tools. If OFF, just generate build targets." ON)
|
|
|
|
if (MSVC)
|
|
add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.'
|
|
add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header.
|
|
endif()
|
|
|
|
include_directories(BEFORE
|
|
${CMAKE_CURRENT_BINARY_DIR}/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
)
|
|
|
|
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
install(DIRECTORY include/
|
|
DESTINATION include
|
|
FILES_MATCHING
|
|
PATTERN "*.h"
|
|
PATTERN ".svn" EXCLUDE
|
|
)
|
|
endif()
|
|
|
|
add_subdirectory(Common)
|
|
add_subdirectory(lib)
|
|
add_subdirectory(tools/lld)
|
|
|
|
if (LLVM_INCLUDE_TESTS)
|
|
add_subdirectory(test)
|
|
add_subdirectory(unittests)
|
|
endif()
|
|
|
|
add_subdirectory(docs)
|
|
add_subdirectory(COFF)
|
|
add_subdirectory(ELF)
|
|
add_subdirectory(MinGW)
|
|
add_subdirectory(wasm)
|