Index: cmake/modules/AddLLVM.cmake =================================================================== --- cmake/modules/AddLLVM.cmake (revision 127962) +++ cmake/modules/AddLLVM.cmake (working copy) @@ -128,8 +128,9 @@ macro(add_llvm_target target_name) if( TABLEGEN_OUTPUT ) add_custom_target(${target_name}Table_gen - DEPENDS ${TABLEGEN_OUTPUT}) - add_dependencies(${target_name}Table_gen ${LLVM_COMMON_DEPENDS}) + DEPENDS ${TABLEGEN_OUTPUT} ${LLVM_TABLEGEN_EXE}) + add_dependencies(${target_name}Table_gen ${LLVM_COMMON_DEPENDS} + tblgen) endif( TABLEGEN_OUTPUT ) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) add_llvm_library(LLVM${target_name} ${ARGN} ${TABLEGEN_OUTPUT}) Index: cmake/modules/CrossCompileLLVM.cmake =================================================================== --- cmake/modules/CrossCompileLLVM.cmake (revision 127962) +++ cmake/modules/CrossCompileLLVM.cmake (working copy) @@ -1,26 +1,67 @@ if( ${LLVM_TABLEGEN} STREQUAL "tblgen" ) set(CX_NATIVE_TG_DIR "${CMAKE_BINARY_DIR}/native") - set(LLVM_TABLEGEN_EXE "${CX_NATIVE_TG_DIR}/bin/tblgen") + + if( CMAKE_CONFIGURATION_TYPES ) + set(LLVM_TABLEGEN_EXE "${CX_NATIVE_TG_DIR}/bin/Release/tblgen${CMAKE_EXECUTABLE_SUFFIX}") + else() + set(LLVM_TABLEGEN_EXE "${CX_NATIVE_TG_DIR}/bin/tblgen${CMAKE_EXECUTABLE_SUFFIX}") + endif() - add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR} + add_custom_command(OUTPUT "${CX_NATIVE_TG_DIR}/CMakeUpdated.txt" COMMAND ${CMAKE_COMMAND} -E make_directory ${CX_NATIVE_TG_DIR} + COMMAND ${CMAKE_COMMAND} -E touch ${CX_NATIVE_TG_DIR}/CMakeUpdated.txt COMMENT "Creating ${CX_NATIVE_TG_DIR}...") + + set_source_files_properties(${CX_NATIVE_TG_DIR}/CMakeUpdated.txt + PROPERTIES + GENERATED TRUE + ) + if ( MSVC_IDE ) + set(LLVM_TEMP_MAIN_CMAKE_UPDATED "${CMAKE_BINARY_DIR}/CMakeFiles/generate.stamp") + else() + set(LLVM_TEMP_MAIN_CMAKE_UPDATED "${CMAKE_BINARY_DIR}/CMakeFiles/progress.marks") + endif() - add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}/CMakeCache.txt - COMMAND ${CMAKE_COMMAND} -UMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR} + add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}/CMakeCacheUpdated.txt + COMMAND ${CMAKE_COMMAND} -UMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=Release -DLLVM_INTERNAL_ONLY_TBLGEN="1" ${CMAKE_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E touch ${CX_NATIVE_TG_DIR}/CMakeCacheUpdated.txt WORKING_DIRECTORY ${CX_NATIVE_TG_DIR} - DEPENDS ${CX_NATIVE_TG_DIR} + DEPENDS "${CX_NATIVE_TG_DIR}/CMakeUpdated.txt" "${LLVM_TEMP_MAIN_CMAKE_UPDATED}" COMMENT "Configuring native TableGen...") + set_source_files_properties(${CX_NATIVE_TG_DIR}/CMakeCacheUpdated.txt + PROPERTIES + GENERATED TRUE + ) + + if (MSVC_IDE AND MSVC_VERSION GREATER 1599) + # When building with msbuild reduce verbosity to a sane level + set(LLVM_TEMP_EXTRAPARAMS -- /verbosity:minimal /nologo) + endif() + + # Figure out project to build + if (MSVC_IDE) + set(LLVM_TEMP_TARGET utils/TableGen/tblgen) + else() + set(LLVM_TEMP_TARGET tblgen) + endif() + add_custom_command(OUTPUT ${LLVM_TABLEGEN_EXE} - COMMAND ${CMAKE_BUILD_TOOL} - DEPENDS ${CX_NATIVE_TG_DIR}/CMakeCache.txt - WORKING_DIRECTORY ${CX_NATIVE_TG_DIR}/utils/TableGen + COMMAND ${CMAKE_COMMAND} -E remove -f ${LLVM_TABLEGEN_EXE} + COMMAND ${CMAKE_COMMAND} --build . --target ${LLVM_TEMP_TARGET} --config Release ${LLVM_TEMP_EXTRAPARAMS} + DEPENDS "${CX_NATIVE_TG_DIR}/CMakeCacheUpdated.txt" ${LLVM_TBLGEN_FILES} + WORKING_DIRECTORY ${CX_NATIVE_TG_DIR} COMMENT "Building native TableGen...") add_custom_target(NativeTableGen DEPENDS ${LLVM_TABLEGEN_EXE}) + # Force better dependency checking + target_link_libraries(NativeTableGen LLVMSupport) + add_dependencies(tblgen NativeTableGen) - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CX_NATIVE_TG_DIR}) + set_target_properties(NativeTableGen PROPERTIES FOLDER "Utils") + + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + "${CX_NATIVE_TG_DIR}") endif() Index: CMakeLists.txt =================================================================== --- CMakeLists.txt (revision 127962) +++ CMakeLists.txt (working copy) @@ -202,6 +202,10 @@ # Put this before tblgen. Else we have a circular dependence. add_subdirectory(lib/Support) + +set(LLVM_INTERNAL_ONLY_TBLGEN "" CACHE + INTERNAL "Only used internally") + set(LLVM_TABLEGEN "tblgen" CACHE STRING "Native TableGen executable. Saves building one when cross-compiling.") # Effective tblgen executable to be used: @@ -209,40 +213,48 @@ add_subdirectory(utils/TableGen) -if( CMAKE_CROSSCOMPILING ) +set(LLVM_RELEASE_TBLGEN OFF CACHE + OPTION "Use release tblgen to speed up debug builds.") + +if( CMAKE_CROSSCOMPILING OR LLVM_RELEASE_TBLGEN) # This adds a dependency on target `tblgen', so must go after utils/TableGen include( CrossCompileLLVM ) -endif( CMAKE_CROSSCOMPILING ) +endif( CMAKE_CROSSCOMPILING OR LLVM_RELEASE_TBLGEN ) add_subdirectory(include/llvm) -add_subdirectory(lib) +if (NOT LLVM_INTERNAL_ONLY_TBLGEN) + add_subdirectory(lib) -add_subdirectory(utils/FileCheck) -add_subdirectory(utils/FileUpdate) -add_subdirectory(utils/count) -add_subdirectory(utils/not) -add_subdirectory(utils/llvm-lit) + add_subdirectory(utils/FileCheck) + add_subdirectory(utils/FileUpdate) + add_subdirectory(utils/count) + add_subdirectory(utils/not) + add_subdirectory(utils/llvm-lit) +endif() -add_subdirectory(projects) +if (NOT LLVM_INTERNAL_ONLY_TBLGEN) + add_subdirectory(projects) +endif() option(LLVM_BUILD_TOOLS "Build the LLVM tools. If OFF, just generate build targets." ON) option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON) -if( LLVM_INCLUDE_TOOLS ) +if( LLVM_INCLUDE_TOOLS AND NOT LLVM_INTERNAL_ONLY_TBLGEN) add_subdirectory(tools) endif() option(LLVM_BUILD_EXAMPLES "Build the LLVM example programs. If OFF, just generate build targets." OFF) option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON) -if( LLVM_INCLUDE_EXAMPLES ) +if( LLVM_INCLUDE_EXAMPLES AND NOT LLVM_INTERNAL_ONLY_TBLGEN) add_subdirectory(examples) endif() option(LLVM_BUILD_TESTS "Build LLVM unit tests. If OFF, just generate build targes." OFF) -if( LLVM_INCLUDE_TESTS ) + +if( LLVM_INCLUDE_TESTS AND NOT LLVM_INTERNAL_ONLY_TBLGEN ) add_subdirectory(test) add_subdirectory(utils/unittest) add_subdirectory(unittests) @@ -253,8 +265,11 @@ endif() endif() -add_subdirectory(cmake/modules) +if (NOT LLVM_INTERNAL_ONLY_TBLGEN) + add_subdirectory(cmake/modules) +endif() + install(DIRECTORY include/ DESTINATION include FILES_MATCHING @@ -288,7 +303,7 @@ # Workaround for MSVS10 to avoid the Dialog Hell # FIXME: This could be removed with future version of CMake. -if(MSVC_VERSION EQUAL 1600) +if(MSVC_VERSION EQUAL 1600 AND NOT LLVM_INTERNAL_ONLY_TBLGEN) set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln") if( EXISTS "${LLVM_SLN_FILENAME}" ) file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n") Index: docs/CMake.html =================================================================== --- docs/CMake.html (revision 127962) +++ docs/CMake.html (working copy) @@ -350,6 +350,10 @@ Function Interface library. If the library or its headers are installed on a custom location, you can set the variables FFI_INCLUDE_DIR and FFI_LIBRARY_DIR. Defaults to OFF. + +
LLVM_RELEASE_TBLGEN:BOOL
+
Use release tblgen to speed up debug builds. Defaults to OFF.
+ Index: include/llvm/CMakeLists.txt =================================================================== --- include/llvm/CMakeLists.txt (revision 127962) +++ include/llvm/CMakeLists.txt (working copy) @@ -3,8 +3,9 @@ tablegen(Intrinsics.gen -gen-intrinsic) add_custom_target(intrinsics_gen ALL - DEPENDS ${llvm_builded_incs_dir}/Intrinsics.gen) + DEPENDS ${LLVM_TABLEGEN_EXE} ${llvm_builded_incs_dir}/Intrinsics.gen) set_target_properties(intrinsics_gen PROPERTIES FOLDER "Tablegenning") +add_dependencies(intrinsics_gen tblgen) set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} intrinsics_gen PARENT_SCOPE) Index: utils/TableGen/CMakeLists.txt =================================================================== --- utils/TableGen/CMakeLists.txt (revision 127962) +++ utils/TableGen/CMakeLists.txt (working copy) @@ -3,7 +3,8 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR}) -add_llvm_utility(tblgen + +set(LLVM_TEMP_TBLGEN_FILES ARMDecoderEmitter.cpp AsmMatcherEmitter.cpp AsmWriterEmitter.cpp @@ -42,9 +43,18 @@ TableGen.cpp TableGenBackend.cpp X86DisassemblerTables.cpp - X86RecognizableInstr.cpp - ) + X86RecognizableInstr.cpp) + +foreach(file ${LLVM_TEMP_TBLGEN_FILES}) + set(LLVM_TEMP_TBLGEN_EXPANDED_FILES ${LLVM_TEMP_TBLGEN_EXPANDED_FILES} + ${CMAKE_CURRENT_SOURCE_DIR}/${file}) +endforeach() +set(LLVM_TBLGEN_FILES ${LLVM_TEMP_TBLGEN_EXPANDED_FILES} + CACHE INTERNAL "Internal helper" FORCE) + +add_llvm_utility(tblgen ${LLVM_TEMP_TBLGEN_FILES}) + target_link_libraries(tblgen LLVMSupport) if( MINGW ) target_link_libraries(tblgen imagehlp psapi)