diff --git a/llvm/cmake/modules/CrossCompile.cmake b/llvm/cmake/modules/CrossCompile.cmake --- a/llvm/cmake/modules/CrossCompile.cmake +++ b/llvm/cmake/modules/CrossCompile.cmake @@ -67,4 +67,36 @@ llvm_create_cross_target_internal(${target_name} ${sysroot} ${CMAKE_BUILD_TYPE}) endfunction() +function(build_native_tool) + # Sets up a native build for a tool, used e.g. for cross-compilation and + # LLVM_OPTIMIZED_TABLEGEN. Always builds in Release. + set(one_value_keywords + TARGET # The target to build natively + COMMENT # The comment to use for the custom command + OUTPUT_PATH_VAR # Receives the path to the built target + ) + set(multi_value_keywords + DEPENDS # Additional dependencies for the target + ) + cmake_parse_arguments(ARG "" "${one_value_keywords}" "${multi_value_keywords}" + ${ARGN}) + + include(LLVMExternalProjectUtils) + llvm_ExternalProject_BuildCmd(build_cmd ${ARG_TARGET} ${LLVM_NATIVE_BUILD} + CONFIGURATION Release) + + if(CMAKE_CONFIGURATION_TYPES) + set(output_path "${LLVM_NATIVE_BUILD}/Release/bin/${ARG_TARGET}") + else() + set(output_path "${LLVM_NATIVE_BUILD}/bin/${ARG_TARGET}") + endif() + add_custom_command(OUTPUT "${output_path}" + COMMAND ${build_cmd} + DEPENDS CONFIGURE_LLVM_NATIVE ${ARG_DEPENDS} + WORKING_DIRECTORY "${LLVM_NATIVE_BUILD}" + COMMENT "${ARG_COMMENT}" + USES_TERMINAL) + set(${ARG_OUTPUT_PATH_VAR} "${output_path}" PARENT_SCOPE) +endfunction() + llvm_create_cross_target_internal(NATIVE "" Release) diff --git a/llvm/cmake/modules/TableGen.cmake b/llvm/cmake/modules/TableGen.cmake --- a/llvm/cmake/modules/TableGen.cmake +++ b/llvm/cmake/modules/TableGen.cmake @@ -2,8 +2,6 @@ # Extra parameters for `tblgen' may come after `ofn' parameter. # Adds the name of the generated file to TABLEGEN_OUTPUT. -include(LLVMExternalProjectUtils) - if(LLVM_MAIN_INCLUDE_DIR) set(LLVM_TABLEGEN_FLAGS -I ${LLVM_MAIN_INCLUDE_DIR}) endif() @@ -136,30 +134,21 @@ if(LLVM_USE_HOST_TOOLS) if( ${${project}_TABLEGEN} STREQUAL "${target}" ) - if (NOT CMAKE_CONFIGURATION_TYPES) - set(${project}_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/bin/${target}") - else() - set(${project}_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/Release/bin/${target}") - endif() + build_native_tool(TARGET ${target} + DEPENDS ${target} + COMMENT "Building native TableGen..." + OUTPUT_PATH_VAR ${project}_TABLEGEN_EXE) set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN_EXE} PARENT_SCOPE) - llvm_ExternalProject_BuildCmd(tblgen_build_cmd ${target} - ${LLVM_NATIVE_BUILD} - CONFIGURATION Release) + add_custom_target(${project}-tablegen-host DEPENDS ${${project}_TABLEGEN_EXE}) + set(${project}_TABLEGEN_TARGET ${project}-tablegen-host PARENT_SCOPE) + # Create an artificial dependency between tablegen projects, because they # compile the same dependencies, thus using the same build folders. # FIXME: A proper fix requires sequentially chaining tablegens. if (NOT ${project} STREQUAL LLVM AND TARGET ${project}-tablegen-host) add_dependencies(${project}-tablegen-host LLVM-tablegen-host) endif() - add_custom_command(OUTPUT ${${project}_TABLEGEN_EXE} - COMMAND ${tblgen_build_cmd} - DEPENDS CONFIGURE_LLVM_NATIVE ${target} - WORKING_DIRECTORY ${LLVM_NATIVE_BUILD} - COMMENT "Building native TableGen..." - USES_TERMINAL) - add_custom_target(${project}-tablegen-host DEPENDS ${${project}_TABLEGEN_EXE}) - set(${project}_TABLEGEN_TARGET ${project}-tablegen-host PARENT_SCOPE) endif() endif() diff --git a/llvm/tools/llvm-config/CMakeLists.txt b/llvm/tools/llvm-config/CMakeLists.txt --- a/llvm/tools/llvm-config/CMakeLists.txt +++ b/llvm/tools/llvm-config/CMakeLists.txt @@ -75,16 +75,11 @@ add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH}) if(CMAKE_CROSSCOMPILING AND NOT LLVM_CONFIG_PATH) - set(LLVM_CONFIG_PATH "${LLVM_NATIVE_BUILD}/bin/llvm-config" CACHE STRING "") + build_native_tool(TARGET llvm-config + COMMENT "Building native llvm-config..." + OUTPUT_PATH_VAR LLVM_CONFIG_PATH) + set(LLVM_CONFIG_PATH "${LLVM_CONFIG_PATH}" CACHE STRING "") - add_custom_command(OUTPUT "${LLVM_CONFIG_PATH}" - COMMAND ${CMAKE_COMMAND} --build . --target llvm-config --config $ - DEPENDS ${LLVM_NATIVE_BUILD}/CMakeCache.txt - WORKING_DIRECTORY ${LLVM_NATIVE_BUILD} - COMMENT "Building native llvm-config..." - USES_TERMINAL) add_custom_target(NativeLLVMConfig DEPENDS ${LLVM_CONFIG_PATH}) - add_dependencies(NativeLLVMConfig CONFIGURE_LLVM_NATIVE) - add_dependencies(llvm-config NativeLLVMConfig) endif()