mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-30 08:56:40 +00:00
dbbdf44025
This cleanup removes the need for the native support library to have its own target. That target was only needed because makefile builds were tripping over each other if two tablegen targets were building at the same time. This causes problems because the parallel make invocations through CMake can't communicate with each other. This is fixed by invoking make directly instead of through CMake which is how we handle this in External Project invocations. The other part of the cleanup is to mark the custom commands as USES_TERMINAL. This is a bit of a hack, but we need to ensure that Ninja generators don't invoke multiple tablegen targets in the same build dir in parallel, because that too would be bad. Marking as USES_TERMINAL does have some downside for Ninja because it results in decreased parallelism, but correct builds are worth the minor loss and LLVM_OPTIMZIED_TABLEGEN is such a huge win, it is worth it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280748 91177308-0d34-0410-b5e6-96231b3b80d8
198 lines
6.6 KiB
CMake
198 lines
6.6 KiB
CMake
include(ExternalProject)
|
|
|
|
# llvm_ExternalProject_BuildCmd(out_var target)
|
|
# Utility function for constructing command lines for external project targets
|
|
function(llvm_ExternalProject_BuildCmd out_var target bin_dir)
|
|
cmake_parse_arguments(ARG "" "CONFIGURATION" "" ${ARGN})
|
|
if(NOT ARG_CONFIGURATION)
|
|
set(ARG_CONFIGURATION "$<CONFIGURATION>")
|
|
endif()
|
|
if (CMAKE_GENERATOR MATCHES "Make")
|
|
# Use special command for Makefiles to support parallelism.
|
|
set(${out_var} "$(MAKE)" "-C" "${bin_dir}" "${target}" PARENT_SCOPE)
|
|
else()
|
|
set(${out_var} ${CMAKE_COMMAND} --build ${bin_dir} --target ${target}
|
|
--config ${ARG_CONFIGURATION} PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
# llvm_ExternalProject_Add(name source_dir ...
|
|
# USE_TOOLCHAIN
|
|
# Use just-built tools (see TOOLCHAIN_TOOLS)
|
|
# EXCLUDE_FROM_ALL
|
|
# Exclude this project from the all target
|
|
# NO_INSTALL
|
|
# Don't generate install targets for this project
|
|
# ALWAYS_CLEAN
|
|
# Always clean the sub-project before building
|
|
# CMAKE_ARGS arguments...
|
|
# Optional cmake arguments to pass when configuring the project
|
|
# TOOLCHAIN_TOOLS targets...
|
|
# Targets for toolchain tools (defaults to clang;lld)
|
|
# DEPENDS targets...
|
|
# Targets that this project depends on
|
|
# EXTRA_TARGETS targets...
|
|
# Extra targets in the subproject to generate targets for
|
|
# PASSTHROUGH_PREFIXES prefix...
|
|
# Extra variable prefixes (name is always included) to pass down
|
|
# )
|
|
function(llvm_ExternalProject_Add name source_dir)
|
|
cmake_parse_arguments(ARG
|
|
"USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
|
|
"SOURCE_DIR"
|
|
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES"
|
|
${ARGN})
|
|
canonicalize_tool_name(${name} nameCanon)
|
|
if(NOT ARG_TOOLCHAIN_TOOLS)
|
|
set(ARG_TOOLCHAIN_TOOLS clang lld)
|
|
endif()
|
|
foreach(tool ${ARG_TOOLCHAIN_TOOLS})
|
|
if(TARGET ${tool})
|
|
list(APPEND TOOLCHAIN_TOOLS ${tool})
|
|
list(APPEND TOOLCHAIN_BINS $<TARGET_FILE:${tool}>)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(NOT ARG_RUNTIME_LIBRARIES)
|
|
set(ARG_RUNTIME_LIBRARIES compiler-rt libcxx)
|
|
endif()
|
|
foreach(lib ${ARG_RUNTIME_LIBRARIES})
|
|
if(TARGET ${lib})
|
|
list(APPEND RUNTIME_LIBRARIES ${lib})
|
|
endif()
|
|
endforeach()
|
|
|
|
if(ARG_ALWAYS_CLEAN)
|
|
set(always_clean clean)
|
|
endif()
|
|
|
|
list(FIND TOOLCHAIN_TOOLS clang FOUND_CLANG)
|
|
if(FOUND_CLANG GREATER -1)
|
|
set(CLANG_IN_TOOLCHAIN On)
|
|
endif()
|
|
|
|
if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)
|
|
list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})
|
|
endif()
|
|
|
|
set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-stamps/)
|
|
set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-bins/)
|
|
|
|
add_custom_target(${name}-clear
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
|
|
COMMENT "Clobbering ${name} build and stamp directories"
|
|
USES_TERMINAL
|
|
)
|
|
|
|
# Find all variables that start with a prefix and propagate them through
|
|
get_cmake_property(variableNames VARIABLES)
|
|
|
|
list(APPEND ARG_PASSTHROUGH_PREFIXES ${nameCanon})
|
|
foreach(prefix ${ARG_PASSTHROUGH_PREFIXES})
|
|
foreach(variableName ${variableNames})
|
|
if(variableName MATCHES "^${prefix}")
|
|
string(REPLACE ";" "\;" value "${${variableName}}")
|
|
list(APPEND PASSTHROUGH_VARIABLES
|
|
-D${variableName}=${value})
|
|
endif()
|
|
endforeach()
|
|
endforeach()
|
|
|
|
if(ARG_USE_TOOLCHAIN)
|
|
if(CLANG_IN_TOOLCHAIN)
|
|
set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
|
|
-DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
|
|
endif()
|
|
list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS})
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
|
|
DEPENDS ${ARG_DEPENDS}
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${BINARY_DIR}/CMakeCache.txt
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_DIR}/${name}-mkdir
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
|
|
COMMENT "Clobbering bootstrap build and stamp directories"
|
|
)
|
|
|
|
add_custom_target(${name}-clobber
|
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)
|
|
|
|
if(ARG_EXCLUDE_FROM_ALL)
|
|
set(exclude EXCLUDE_FROM_ALL 1)
|
|
endif()
|
|
|
|
ExternalProject_Add(${name}
|
|
DEPENDS ${ARG_DEPENDS} llvm-config
|
|
${name}-clobber
|
|
PREFIX ${CMAKE_BINARY_DIR}/projects/${name}
|
|
SOURCE_DIR ${source_dir}
|
|
STAMP_DIR ${STAMP_DIR}
|
|
BINARY_DIR ${BINARY_DIR}
|
|
${exclude}
|
|
CMAKE_ARGS ${${nameCanon}_CMAKE_ARGS}
|
|
${compiler_args}
|
|
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
|
|
-DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR}
|
|
-DLLVM_CONFIG_PATH=$<TARGET_FILE:llvm-config>
|
|
-DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR}
|
|
-DPACKAGE_VERSION=${PACKAGE_VERSION}
|
|
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
|
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
|
|
${ARG_CMAKE_ARGS}
|
|
${PASSTHROUGH_VARIABLES}
|
|
INSTALL_COMMAND ""
|
|
STEP_TARGETS configure build
|
|
BUILD_ALWAYS 1
|
|
USES_TERMINAL_CONFIGURE 1
|
|
USES_TERMINAL_BUILD 1
|
|
USES_TERMINAL_INSTALL 1
|
|
)
|
|
|
|
if(ARG_USE_TOOLCHAIN)
|
|
set(force_deps DEPENDS ${TOOLCHAIN_BINS})
|
|
endif()
|
|
|
|
llvm_ExternalProject_BuildCmd(run_clean clean ${BINARY_DIR})
|
|
ExternalProject_Add_Step(${name} clean
|
|
COMMAND ${run_clean}
|
|
COMMENT "Cleaning ${name}..."
|
|
DEPENDEES configure
|
|
${force_deps}
|
|
WORKING_DIRECTORY ${BINARY_DIR}
|
|
EXCLUDE_FROM_MAIN 1
|
|
USES_TERMINAL 1
|
|
)
|
|
ExternalProject_Add_StepTargets(${name} clean)
|
|
|
|
if(ARG_USE_TOOLCHAIN)
|
|
add_dependencies(${name}-clean ${name}-clobber)
|
|
set_target_properties(${name}-clean PROPERTIES
|
|
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)
|
|
endif()
|
|
|
|
if(NOT ARG_NO_INSTALL)
|
|
install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${BINARY_DIR}/cmake_install.cmake \)"
|
|
COMPONENT ${name})
|
|
|
|
add_custom_target(install-${name}
|
|
DEPENDS ${name}
|
|
COMMAND "${CMAKE_COMMAND}"
|
|
-DCMAKE_INSTALL_COMPONENT=${name}
|
|
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
|
|
USES_TERMINAL)
|
|
endif()
|
|
|
|
# Add top-level targets
|
|
foreach(target ${ARG_EXTRA_TARGETS})
|
|
llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target} ${BINARY_DIR})
|
|
add_custom_target(${target}
|
|
COMMAND ${build_runtime_cmd}
|
|
DEPENDS ${name}-configure
|
|
WORKING_DIRECTORY ${BINARY_DIR}
|
|
VERBATIM
|
|
USES_TERMINAL)
|
|
endforeach()
|
|
endfunction()
|