[PATCH] D20992: [CMake] Add LLVM runtimes directory

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 23 14:41:15 PDT 2016


Chris Bieneman <beanz at apple.com> writes:
> beanz updated this revision to Diff 61724.
> beanz added a comment.
>
> - Added documentation to runtimes/CMakeLists.txt

This is a lot clearer now, thanks!

> - Updated .gitignore to ignore subdirectories under runtimes
> - Removed a small hack from runtimes/CMakeLists.txt that related to
> libcxx - libcxx support for this path will be in a follow up
>
>
> http://reviews.llvm.org/D20992
>
> Files:
>   .gitignore
>   CMakeLists.txt
>   cmake/modules/LLVMExternalProjectUtils.cmake
>   runtimes/CMakeLists.txt
>
> Index: runtimes/CMakeLists.txt
> ===================================================================
> --- /dev/null
> +++ runtimes/CMakeLists.txt
> @@ -0,0 +1,88 @@
> +# This file handles building LLVM runtime sub-projects.
> +
> +# Runtimes are different from tools or other drop-in projects because runtimes
> +# should be built with the LLVM toolchain from the build directory. This file is
> +# a first step to formalizing runtime build interfaces.
> +
> +# In the current state this file only works with compiler-rt, other runtimes
> +# will work as the runtime build interface standardizes.
> +
> +# Find all subdirectories containing CMake projects
> +file(GLOB entries *)
> +foreach(entry ${entries})
> +  if(IS_DIRECTORY ${entry} AND EXISTS ${entry}/CMakeLists.txt)
> +    list(APPEND runtimes ${entry})
> +  endif()
> +endforeach()
> +
> +# If this file is acting as a top-level CMake invocation, this code path is
> +# triggered by the external project call for the runtimes target below.
> +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
> +
> +  cmake_minimum_required(VERSION 3.4.3)
> +
> +  # Add the root project's CMake modules, and the LLVM build's modules to the
> +  # CMake module path.
> +  list(INSERT CMAKE_MODULE_PATH 0
> +    "${CMAKE_CURRENT_SOURCE_DIR}/../cmake"
> +    "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules"
> +    "${LLVM_BINARY_DIR}/lib/cmake/llvm"
> +  )
> +
> +  # LLVMConfig.cmake contains a bunch of CMake variables from the LLVM build.
> +  # This file is installed as part of LLVM distributions, so this can be used
> +  # either from a build directory or an installed LLVM.
> +  include(LLVMConfig)
> +
> +  # Setting these variables will allow the sub-build to put their outputs into
> +  # the library and bin directories of the top-level build.
> +  set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
> +  set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_BINARY_DIR})
> +
> +  foreach(entry ${runtimes})
> +    get_filename_component(projName ${entry} NAME)
> +
> +    # TODO: Clean this up as part of an interface standardization
> +    string(REPLACE "-" "_" canon_name ${projName})
> +    string(TOUPPER ${canon_name} canon_name)
> +    # The subdirectories need to treat this as standalone builds
> +    set(${canon_name}_STANDALONE_BUILD On)
> +
> +    add_subdirectory(${projName})
> +  endforeach()
> +
> +else() # if this is included from LLVM's CMake
> +  include(LLVMExternalProjectUtils)
> +
> +  # If compiler-rt is present we need to build the builtin libraries first. This
> +  # is required because the other runtimes need the builtin libraries present
> +  # before the just-built compiler can pass the configuration tests.
> +  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt)
> +    llvm_ExternalProject_Add(builtins
> +                             ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt/lib/builtins
> +                             PASSTHROUGH_PREFIXES COMPILER_RT
> +                             USE_TOOLCHAIN)
> +    set(deps builtins)
> +  endif()
> +
> +  # We create a list the names of all the runtime projects in all uppercase and
> +  # with dashes turned to underscores. This gives us the CMake variable prefixes
> +  # for all variables that will apply to runtimes.
> +  foreach(entry ${runtimes})
> +    get_filename_component(projName ${entry} NAME)
> +    string(REPLACE "-" "_" canon_name ${projName})
> +    string(TOUPPER ${canon_name} canon_name)
> +    list(APPEND prefixes ${canon_name})
> +  endforeach()
> +
> +  if(runtimes)
> +    # Create a runtimes target that uses this file as its top-level CMake file.
> +    llvm_ExternalProject_Add(runtimes
> +                             ${CMAKE_CURRENT_SOURCE_DIR}
> +                             DEPENDS ${deps} llvm-config
> +                             # Builtins were built separately above
> +                             CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off
> +                             PASSTHROUGH_PREFIXES ${prefixes}
> +                             USE_TOOLCHAIN)
> +  endif()
> +endif()
> Index: cmake/modules/LLVMExternalProjectUtils.cmake
> ===================================================================
> --- cmake/modules/LLVMExternalProjectUtils.cmake
> +++ cmake/modules/LLVMExternalProjectUtils.cmake
> @@ -19,19 +19,25 @@
>  #     Exclude this project from the all target
>  #   NO_INSTALL
>  #     Don't generate install targets for this project
> +#   ALWAYS_CLEAN
> +#     Always clean the sub-project before building
>  #   CMAKE_ARGS arguments...
>  #     Optional cmake arguments to pass when configuring the project
>  #   TOOLCHAIN_TOOLS targets...
>  #     Targets for toolchain tools (defaults to clang;lld)
>  #   DEPENDS targets...
>  #     Targets that this project depends on
>  #   EXTRA_TARGETS targets...
>  #     Extra targets in the subproject to generate targets for
> +#   PASSTHROUGH_PREFIXES prefix...
> +#     Extra variable prefixes (name is always included) to pass down
>  #   )
>  function(llvm_ExternalProject_Add name source_dir)
> -  cmake_parse_arguments(ARG "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL"
> +  cmake_parse_arguments(ARG
> +    "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
>      "SOURCE_DIR"
> -    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS" ${ARGN})
> +    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES"
> +    ${ARGN})
>    canonicalize_tool_name(${name} nameCanon)
>    if(NOT ARG_TOOLCHAIN_TOOLS)
>      set(ARG_TOOLCHAIN_TOOLS clang lld)
> @@ -52,6 +58,10 @@
>      endif()
>    endforeach()
>  
> +  if(ARG_ALWAYS_CLEAN)
> +    set(always_clean clean)
> +  endif()
> +
>    list(FIND TOOLCHAIN_TOOLS clang FOUND_CLANG)
>    if(FOUND_CLANG GREATER -1)
>      set(CLANG_IN_TOOLCHAIN On)
> @@ -71,15 +81,18 @@
>      USES_TERMINAL
>      )
>  
> -  # Find all variables that start with COMPILER_RT and populate a variable with
> -  # them.
> +  # Find all variables that start with a prefix and propagate them through
>    get_cmake_property(variableNames VARIABLES)
> -  foreach(variableName ${variableNames})
> -    if(variableName MATCHES "^${nameCanon}")
> -      string(REPLACE ";" "\;" value "${${variableName}}")
> -      list(APPEND PASSTHROUGH_VARIABLES
> -        -D${variableName}=${value})
> -    endif()
> +
> +  list(APPEND ARG_PASSTHROUGH_PREFIXES ${nameCanon})
> +  foreach(prefix ${ARG_PASSTHROUGH_PREFIXES})
> +    foreach(variableName ${variableNames})
> +      if(variableName MATCHES "^${prefix}")
> +        string(REPLACE ";" "\;" value "${${variableName}}")
> +        list(APPEND PASSTHROUGH_VARIABLES
> +          -D${variableName}=${value})
> +      endif()
> +    endforeach()
>    endforeach()
>  
>    if(ARG_USE_TOOLCHAIN)
> @@ -117,6 +130,12 @@
>      CMAKE_ARGS ${${nameCanon}_CMAKE_ARGS}
>                 ${compiler_args}
>                 -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
> +               -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR}
> +               -DLLVM_CONFIG_PATH=$<TARGET_FILE:llvm-config>
> +               -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR}
> +               -DPACKAGE_VERSION=${PACKAGE_VERSION}
> +               -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
> +               -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
>                 ${ARG_CMAKE_ARGS}
>                 ${PASSTHROUGH_VARIABLES}
>      INSTALL_COMMAND ""
> @@ -138,6 +157,7 @@
>      DEPENDEES configure
>      ${force_deps}
>      WORKING_DIRECTORY ${BINARY_DIR}
> +    EXCLUDE_FROM_MAIN 1
>      USES_TERMINAL 1
>      )
>    ExternalProject_Add_StepTargets(${name} clean)
> Index: CMakeLists.txt
> ===================================================================
> --- CMakeLists.txt
> +++ CMakeLists.txt
> @@ -732,6 +732,8 @@
>    add_subdirectory(tools)
>  endif()
>  
> +add_subdirectory(runtimes)
> +
>  if( LLVM_INCLUDE_EXAMPLES )
>    add_subdirectory(examples)
>  endif()
> @@ -742,7 +744,8 @@
>      llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
>        USE_TOOLCHAIN
>        EXCLUDE_FROM_ALL
> -      NO_INSTALL)
> +      NO_INSTALL
> +      ALWAYS_CLEAN)
>    endif()
>    add_subdirectory(test)
>    add_subdirectory(unittests)
> Index: .gitignore
> ===================================================================
> --- .gitignore
> +++ .gitignore
> @@ -46,6 +46,8 @@
>  projects/*
>  !projects/*.*
>  !projects/Makefile
> +runtimes/*
> +!runtimes/*.*
>  # Clang, which is tracked independently.
>  tools/clang
>  # LLDB, which is tracked independently.


More information about the llvm-commits mailing list