Skip to content
Snippets Groups Projects
Commit f853f486 authored by Chris Bieneman's avatar Chris Bieneman
Browse files

[CMake] First pass at adding support for clang bootstrap builds to CMake

Summary:
This patch adds a new CLANG_ENABLE_BOOTSTRAP option to CMake which adds targets for building a stage2 bootstrap compiler. The targets are:

bootstrap-configure
bootstrap-build
bootstrap (same as bootstrap-configure and bootstrap-build)
bootstrap-install
bootstrap-check-llvm
bootstrap-check-clang
bootstrap-check-all

If you are using 3.3.20150708 or greater it utilizes the ninja USES_TERMINAL_* settings on the external project so that the output is properly buffered.

Reviewers: bogner, chandlerc

Subscribers: filcab, cfe-commits

Differential Revision: http://reviews.llvm.org/D11743

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244070 91177308-0d34-0410-b5e6-96231b3b80d8
parent 04421f50
No related branches found
No related tags found
No related merge requests found
...@@ -96,6 +96,7 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) ...@@ -96,6 +96,7 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
"Set to ON to force using an old, unsupported host toolchain." OFF) "Set to ON to force using an old, unsupported host toolchain." OFF)
option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
include(AddLLVM) include(AddLLVM)
include(TableGen) include(TableGen)
...@@ -551,3 +552,76 @@ if (CLANG_BUILT_STANDALONE) ...@@ -551,3 +552,76 @@ if (CLANG_BUILT_STANDALONE)
${CLANG_BINARY_DIR}/share/clang/cmake/ClangConfig.cmake ${CLANG_BINARY_DIR}/share/clang/cmake/ClangConfig.cmake
COPYONLY) COPYONLY)
endif () endif ()
if (CLANG_ENABLE_BOOTSTRAP)
include(ExternalProject)
if(CMAKE_VERSION VERSION_LESS 3.3.20150708)
set(cmake_3_4_USES_TERMINAL_OPTIONS)
else()
set(cmake_3_4_USES_TERMINAL_OPTIONS
USES_TERMINAL_CONFIGURE 1
USES_TERMINAL_BUILD 1
USES_TERMINAL_INSTALL 1
)
endif()
set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bootstrap-stamps/)
set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bootstrap-bins/)
add_custom_target(bootstrap-clear
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/bootstrap-cleared
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/bootstrap-cleared
DEPENDS clang
COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/bootstrap-cleared
COMMENT "Clobberring bootstrap build and stamp directories"
)
ExternalProject_Add(bootstrap
DEPENDS clang
PREFIX bootstrap
SOURCE_DIR ${CMAKE_SOURCE_DIR}
STAMP_DIR ${STAMP_DIR}
BINARY_DIR ${BINARY_DIR}
CMAKE_ARGS
# We shouldn't need to set this here, but INSTALL_DIR doesn't
# seem to work, so instead I'm passing this through
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
${CLANG_BOOTSTRAP_CMAKE_ARGS}
-DCMAKE_CXX_COMPILER=${CMAKE_BINARY_DIR}/bin/clang++
-DCMAKE_C_COMPILER=${CMAKE_BINARY_DIR}/bin/clang
INSTALL_COMMAND ""
STEP_TARGETS configure build
${cmake_3_4_USES_TERMINAL_OPTIONS}
)
# exclude really-install from main target
set_target_properties(bootstrap PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On)
ExternalProject_Add_Step(bootstrap really-install
COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install
COMMENT "Performing install step for 'bootstrap'"
DEPENDEES build
)
ExternalProject_Add_StepTargets(bootstrap really-install)
add_custom_target(bootstrap-install DEPENDS bootstrap-really-install)
set(ADDITIONAL_TARGETS_TO_ADD check-llvm check-clang check-all)
foreach(target ${ADDITIONAL_TARGETS_TO_ADD})
# exclude from main target
set_target_properties(bootstrap PROPERTIES _EP_${target}_EXCLUDE_FROM_MAIN On)
ExternalProject_Add_Step(bootstrap ${target}
COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target ${target}
COMMENT "Performing ${target} for 'bootstrap'"
DEPENDEES configure
)
ExternalProject_Add_StepTargets(bootstrap ${target})
endforeach()
endif()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment