diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -785,24 +785,16 @@ endforeach() # Build arguments for native tool used in CMake. - set(build_configuration "$") set(build_tool_args "${LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS}") if(NOT build_tool_args STREQUAL "") string(PREPEND build_tool_args "-- ") separate_arguments(build_tool_args UNIX_COMMAND "${build_tool_args}") endif() - ExternalProject_Add(${NEXT_CLANG_STAGE} + include(ClangBootstrap) + clang_Bootstrap_Add(${NEXT_CLANG_STAGE} DEPENDS clang-bootstrap-deps - PREFIX ${NEXT_CLANG_STAGE} - SOURCE_DIR ${CMAKE_SOURCE_DIR} - STAMP_DIR ${STAMP_DIR} - BINARY_DIR ${BINARY_DIR} - EXCLUDE_FROM_ALL 1 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} ${PASSTHROUGH_VARIABLES} ${CLANG_BOOTSTRAP_CMAKE_ARGS} -DCLANG_STAGE=${NEXT_CLANG_STAGE} @@ -814,16 +806,8 @@ ${${CLANG_STAGE}_RANLIB} ${${CLANG_STAGE}_OBJCOPY} ${${CLANG_STAGE}_STRIP} - BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR} - --config ${build_configuration} - ${build_tool_args} - INSTALL_COMMAND "" - STEP_TARGETS configure build - USES_TERMINAL_CONFIGURE 1 - USES_TERMINAL_BUILD 1 - USES_TERMINAL_INSTALL 1 - LIST_SEPARATOR | - ) + BUILD_TOOL_ARGS ${build_tool_args} + ) # exclude really-install from main target set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On) @@ -904,37 +888,23 @@ ) # Build specified targets with instrumented Clang to collect the profile - set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt-instrumented-clang-stamps/) - set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt-instrumented-clang-bins/) - set(build_configuration "$") - include(ExternalProject) - ExternalProject_Add(bolt-instrumentation-profile + include(ClangBootstrap) + set(COMPILER_OPTIONS + -DCMAKE_C_COMPILER=${CLANG_INSTRUMENTED} + -DCMAKE_CXX_COMPILER=${CLANGXX_INSTRUMENTED} + -DCMAKE_ASM_COMPILER=${CLANG_INSTRUMENTED} + -DCMAKE_ASM_COMPILER_ID=Clang + ) + clang_Bootstrap_Add(bolt-instrumentation-profile DEPENDS clang++-instrumented - PREFIX bolt-instrumentation-profile - SOURCE_DIR ${CMAKE_SOURCE_DIR} - STAMP_DIR ${STAMP_DIR} - BINARY_DIR ${BINARY_DIR} - EXCLUDE_FROM_ALL 1 CMAKE_ARGS ${CLANG_BOLT_INSTRUMENT_EXTRA_CMAKE_FLAGS} - # 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} - -DCMAKE_C_COMPILER=${CLANG_INSTRUMENTED} - -DCMAKE_CXX_COMPILER=${CLANGXX_INSTRUMENTED} - -DCMAKE_ASM_COMPILER=${CLANG_INSTRUMENTED} - -DCMAKE_ASM_COMPILER_ID=Clang + ${COMPILER_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=${CLANG_BOLT_INSTRUMENT_PROJECTS} -DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD} - BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR} - --config ${build_configuration} - --target ${CLANG_BOLT_INSTRUMENT_TARGETS} - INSTALL_COMMAND "" - STEP_TARGETS configure build - USES_TERMINAL_CONFIGURE 1 - USES_TERMINAL_BUILD 1 - USES_TERMINAL_INSTALL 1 + BUILD_TOOL_ARGS + --target ${CLANG_BOLT_INSTRUMENT_TARGETS} ) # Merge profiles into one using merge-fdata diff --git a/clang/cmake/modules/ClangBootstrap.cmake b/clang/cmake/modules/ClangBootstrap.cmake new file mode 100644 --- /dev/null +++ b/clang/cmake/modules/ClangBootstrap.cmake @@ -0,0 +1,41 @@ +include(ExternalProject) + +# clang_Bootstrap_Add(name ... +# DEPENDS targets... +# Targets that this project depends on +# CMAKE_ARGS arguments... +# Optional cmake arguments to pass when configuring the project +# BUILD_TOOL_ARGS arguments... +# Optional arguments to pass to the build tool +macro(clang_Bootstrap_Add name) + cmake_parse_arguments(ARG "" "LINKER;AR;RANLIB;OBJCOPY;STRIP" + "DEPENDS;TABLEGEN;CMAKE_ARGS;BUILD_TOOL_ARGS" + ${ARGN}) + set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-stamps/) + set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-bins/) + # Build arguments for native tool used in CMake. + set(build_configuration "$") + + ExternalProject_Add(${name} + DEPENDS ${ARG_DEPENDS} + PREFIX ${name} + SOURCE_DIR ${CMAKE_SOURCE_DIR} + STAMP_DIR ${STAMP_DIR} + BINARY_DIR ${BINARY_DIR} + EXCLUDE_FROM_ALL 1 + 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} + ${ARG_CMAKE_ARGS} + BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR} + --config ${build_configuration} + ${ARG_BUILD_TOOL_ARGS} + INSTALL_COMMAND "" + STEP_TARGETS configure build + USES_TERMINAL_CONFIGURE 1 + USES_TERMINAL_BUILD 1 + USES_TERMINAL_INSTALL 1 + LIST_SEPARATOR | + ) +endmacro()