r260742 - [CMake] Improve the clang order-file generation workflow

Chandler Carruth via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 16 18:24:00 PST 2016


FYI, I had to revert this in r261054 because it caused Linux links to write
the output to 'rder_file' in all cases. See that commit for some details,
and I think several build bots hit this as well. Happy to chat to help
figure out what to do long term.

-Chandler

On Fri, Feb 12, 2016 at 1:41 PM Chris Bieneman via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: cbieneman
> Date: Fri Feb 12 15:36:55 2016
> New Revision: 260742
>
> URL: http://llvm.org/viewvc/llvm-project?rev=260742&view=rev
> Log:
> [CMake] Improve the clang order-file generation workflow
>
> Summary:
> This commit re-lands r259862. The underlying cause of the build breakage
> was an incorrectly written capabilities test. In
> tools/Driver/CMakeLists.txt I was attempting to check if a linker flag
> worked, the test was passing it to the compiler, not the linker. CMake
> doesn't have a linker test, so we have a hand-rolled one.
>
> Original Patch Review: http://reviews.llvm.org/D16896
>
> Original Summary:
> With this change generating clang order files using dtrace uses the
> following workflow:
>
> cmake <whatever options you want>
>
> ninja generate-order-file
>
> ninja clang
>
> This patch works by setting a default path to the order file (which can be
> overridden by the user). If the order file doesn't exist during
> configuration CMake will create an empty one.
>
> CMake then ties up the dependencies between the clang link job and the
> order file, and generate-order-file overwrites CLANG_ORDER_FILE with the
> new order file.
>
> Reviewers: bogner
>
> Subscribers: cfe-commits
>
> Differential Revision: http://reviews.llvm.org/D16999
>
> Modified:
>     cfe/trunk/CMakeLists.txt
>     cfe/trunk/tools/driver/CMakeLists.txt
>     cfe/trunk/utils/perf-training/CMakeLists.txt
>
> Modified: cfe/trunk/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/CMakeLists.txt?rev=260742&r1=260741&r2=260742&view=diff
>
> ==============================================================================
> --- cfe/trunk/CMakeLists.txt (original)
> +++ cfe/trunk/CMakeLists.txt Fri Feb 12 15:36:55 2016
> @@ -595,18 +595,24 @@ if( CLANG_INCLUDE_DOCS )
>    add_subdirectory(docs)
>  endif()
>
> -if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/clang.order")
> -  file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/clang.order")
> -endif()
> -
> -if(CLANG_ORDER_FILE STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/clang.order")
> +# this line is needed as a cleanup to ensure that any CMakeCaches with
> the old
> +# default value get updated to the new default.
> +if(CLANG_ORDER_FILE STREQUAL "")
>    unset(CLANG_ORDER_FILE CACHE)
> -  unset(CLANG_ORDER_FILE)
>  endif()
>
> -set(CLANG_ORDER_FILE "" CACHE FILEPATH
> +set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE
> FILEPATH
>    "Order file to use when compiling clang in order to improve startup
> time.")
>
> +if(CLANG_ORDER_FILE AND NOT EXISTS ${CLANG_ORDER_FILE})
> +  string(FIND CLANG_ORDER_FILE "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)
> +  if(PATH_START EQUAL 0)
> +    file(WRITE ${CLANG_ORDER_FILE} "\n")
> +  else()
> +    message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does
> not exist.")
> +  endif()
> +endif()
> +
>  if (CLANG_BUILT_STANDALONE OR CMAKE_VERSION VERSION_EQUAL 3 OR
>      CMAKE_VERSION VERSION_GREATER 3)
>    # Generate a list of CMake library targets so that other CMake projects
> can
>
> Modified: cfe/trunk/tools/driver/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/CMakeLists.txt?rev=260742&r1=260741&r2=260742&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/driver/CMakeLists.txt (original)
> +++ cfe/trunk/tools/driver/CMakeLists.txt Fri Feb 12 15:36:55 2016
> @@ -87,8 +87,24 @@ if (APPLE)
>    set(TOOL_INFO_BUILD_VERSION)
>  endif()
>
> -if(CLANG_ORDER_FILE AND EXISTS CLANG_ORDER_FILE)
> -  target_link_libraries(clang "-Wl,-order_file,${CLANG_ORDER_FILE}")
> +if(CLANG_ORDER_FILE)
> +  include(CMakePushCheckState)
> +
> +  function(check_linker_flag flag out_var)
> +    cmake_push_check_state()
> +    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}")
> +    check_cxx_compiler_flag("" ${out_var})
> +    cmake_pop_check_state()
> +  endfunction()
> +
> +  # This is a test to ensure the actual order file works with the linker.
> +  check_linker_flag("-Wl,-order_file,${CLANG_ORDER_FILE}"
> +    LINKER_ORDER_FILE_WORKS)
> +
> +  if(LINKER_ORDER_FILE_WORKS)
> +    target_link_libraries(clang "-Wl,-order_file,${CLANG_ORDER_FILE}")
> +    set_target_properties(clang PROPERTIES LINK_DEPENDS
> ${CLANG_ORDER_FILE})
> +  endif()
>  endif()
>
>  if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
>
> Modified: cfe/trunk/utils/perf-training/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/perf-training/CMakeLists.txt?rev=260742&r1=260741&r2=260742&view=diff
>
> ==============================================================================
> --- cfe/trunk/utils/perf-training/CMakeLists.txt (original)
> +++ cfe/trunk/utils/perf-training/CMakeLists.txt Fri Feb 12 15:36:55 2016
> @@ -55,9 +55,8 @@ if(DTRACE)
>      COMMAND ${PYTHON_EXECUTABLE}
> ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean
> ${CMAKE_CURRENT_BINARY_DIR} dtrace
>      COMMENT "Clearing old dtrace data")
>
> -
>    add_custom_target(generate-order-file
> -    COMMAND ${PYTHON_EXECUTABLE}
> ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary
> $<TARGET_FILE:clang> --output ${CMAKE_CURRENT_BINARY_DIR}/clang.order
> ${CMAKE_CURRENT_BINARY_DIR}
> +    COMMAND ${PYTHON_EXECUTABLE}
> ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary
> $<TARGET_FILE:clang> --output ${CLANG_ORDER_FILE}
> ${CMAKE_CURRENT_BINARY_DIR}
>      COMMENT "Generating order file"
>      DEPENDS generate-dtrace-logs)
>  endif()
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160217/b2bc44a1/attachment.html>


More information about the cfe-commits mailing list