[llvm] r242705 - [CMake] Cleanup tools/CMakeLists.txt to take advantage of the auto-registration that was already partially working.

Filipe Cabecinhas filcab at gmail.com
Mon Jul 20 23:07:13 PDT 2015


Hi Chris!

I haven't been able to debug it much, but could this revision be the reason
I can't do something like this? (all checkouts on the same dir, then tell
cmake where to find them)

cmake -G Ninja /Users/filcab/dev/llvm/llvm
-DLIBCXXABI_LIBCXX_PATH=~/dev/llvm/libcxx
-DLIBCXXABI_LIBCXX_INCLUDES=~/dev/llvm/libcxx/include -DCMAKE_BUILD_T
YPE=Release -DLLVM_TARGETS_TO_BUILD=AArch64;ARM;X86
-DLLVM_TOOL_LLDB_BUILD=NO
-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=/Users/filcab/dev/llvm/llvm/../clang
-DLLVM_EXT
ERNAL_LLD_SOURCE_DIR=/Users/filcab/dev/llvm/llvm/../lld
-DLLVM_EXTERNAL_LLDB_SOURCE_DIR=/Users/filcab/dev/llvm/llvm/../lldb
-DLLVM_EXTERNAL_LIBCXXABI_SOURCE_D
IR=/Users/filcab/dev/llvm/llvm/../libcxxabi
-DLLVM_EXTERNAL_LIBCXX_SOURCE_DIR=/Users/filcab/dev/llvm/llvm/../libcxx
-DLLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR=/Us
ers/filcab/dev/llvm/llvm/../compiler-rt

CMake starts and everything looks fine, until I start getting this:
---------------------------------
-- Compiler-RT supported architectures: x86_64;i386
-- Looking for rpc/xdr.h
-- Looking for rpc/xdr.h - not found
-- Looking for tirpc/rpc/xdr.h
-- Looking for tirpc/rpc/xdr.h - not found
-- Found LibXml2: /usr/lib/libxml2.dylib (found version "2.9.0")
-- Clang version: 3.8.0
-- Performing Test CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG
-- Performing Test CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG - Success
CMake Error at /Users/filcab/dev/llvm/compiler-rt/CMakeLists.txt:44
(add_custom_target):
  add_custom_target cannot create target "compiler-rt" because another
target
  with the same name already exists.  The existing target is a custom target
  created in source directory "/Users/filcab/dev/llvm/compiler-rt".  See
  documentation for policy CMP0002 for more details.


-- Compiler-RT supported architectures: x86_64;i386
CMake Error at /Users/filcab/dev/llvm/compiler-rt/include/CMakeLists.txt:26
(add_custom_target):
  add_custom_target cannot create target "compiler-rt-headers" because
  another target with the same name already exists.  The existing target is
a
  custom target created in source directory
  "/Users/filcab/dev/llvm/compiler-rt/include".  See documentation for
policy
  CMP0002 for more details.


CMake Error at
/Users/filcab/dev/llvm/compiler-rt/cmake/Modules/SanitizerUtils.cmake:74
(add_custom_target):
  add_custom_target cannot create target "SanitizerLintCheck" because
another
  target with the same name already exists.  The existing target is a custom
  target created in source directory
  "/Users/filcab/dev/llvm/compiler-rt/lib".  See documentation for policy
  CMP0002 for more details.
Call Stack (most recent call first):
  /Users/filcab/dev/llvm/compiler-rt/lib/CMakeLists.txt:5 (include)
---------------------------------

Also, libcxx cmake errors:
---------------------------------
CMake Error at /Users/filcab/dev/llvm/libcxx/lib/CMakeLists.txt:28
(add_library):
  add_library cannot create target "cxx" because another target with the
same
  name already exists.  The existing target is a shared library created in
  source directory "/Users/filcab/dev/llvm/libcxx/lib".  See documentation
  for policy CMP0002 for more details.


CMake Error at /Users/filcab/dev/llvm/libcxx/lib/CMakeLists.txt:69
(target_link_libraries):
  Attempt to add link library "pthread" to target "cxx" which is not built
in
  this directory.


CMake Error at /Users/filcab/dev/llvm/libcxx/lib/CMakeLists.txt:69
(target_link_libraries):
  Attempt to add link library "c" to target "cxx" which is not built in this
  directory.


CMake Error at /Users/filcab/dev/llvm/libcxx/lib/CMakeLists.txt:69
(target_link_libraries):
  Attempt to add link library "m" to target "cxx" which is not built in this
  directory.
---------------------------------
This goes on and on...

I might be able to debug more tomorrow, but you might know what's happening.

Thanks,

  Filipe

On Mon, Jul 20, 2015 at 1:36 PM, Chris Bieneman <beanz at apple.com> wrote:

> Author: cbieneman
> Date: Mon Jul 20 15:36:06 2015
> New Revision: 242705
>
> URL: http://llvm.org/viewvc/llvm-project?rev=242705&view=rev
> Log:
> [CMake] Cleanup tools/CMakeLists.txt to take advantage of the
> auto-registration that was already partially working.
>
> Re-landing r242059 which re-landed r241621... I'm really bad at this.
>
> Summary (r242059):
> This change re-lands r241621, with an additional fix that was required to
> allow tool sources to live outside the llvm checkout. It also no longer
> renames LLVM_EXTERNAL_*_SOURCE_DIR. This change was reverted in r241663,
> because it renamed several variables of the format LLVM_EXTERNAL_*_* to
> LLVM_TOOL_*_*.
>
> Summary (r241621):
> The tools CMakeLists file already had implicit tool registration, but
> there were a few things off about it that needed to be altered to make it
> work. This change addresses all that. The changes in this patch are:
>
> * factored out canonicalizing tool names from paths to CMake variables *
> removed the LLVM_IMPLICIT_PROJECT_IGNORE mechanism in favor of
> LLVM_EXTERNAL_${nameUPPER}_BUILD which I renamed to
> LLVM_TOOL_${nameUPPER}_BUILD because it applies to internal and external
> tools
> * removed ignore_llvm_tool_subdirectory() in favor of just setting
> LLVM_TOOL_${nameUPPER}_BUILD to Off
> * Added create_llvm_tool_options() to resolve a bug in
> add_llvm_external_project() - the old LLVM_EXTERNAL_${nameUPPER}_BUILD
> would not work on a clean CMake directory because the option could be
> created after it was set in code.
> * Removed all but the minimum required calls to add_llvm_external_project
> from tools/CMakeLists.txt
>
> Differential Revision: http://reviews.llvm.org/D10665
>
> Modified:
>     llvm/trunk/cmake/modules/AddLLVM.cmake
>     llvm/trunk/tools/CMakeLists.txt
>
> Modified: llvm/trunk/cmake/modules/AddLLVM.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/modules/AddLLVM.cmake?rev=242705&r1=242704&r2=242705&view=diff
>
> ==============================================================================
> --- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
> +++ llvm/trunk/cmake/modules/AddLLVM.cmake Mon Jul 20 15:36:06 2015
> @@ -676,6 +676,13 @@ macro(add_llvm_target target_name)
>    set( CURRENT_LLVM_TARGET LLVM${target_name} )
>  endmacro(add_llvm_target)
>
> +function(canonicalize_tool_name name output)
> +  string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" nameStrip ${name})
> +  string(REPLACE "-" "_" nameUNDERSCORE ${nameStrip})
> +  string(TOUPPER ${nameUNDERSCORE} nameUPPER)
> +  set(${output} "${nameUPPER}" PARENT_SCOPE)
> +endfunction(canonicalize_tool_name)
> +
>  # Add external project that may want to be built as part of llvm such as
> Clang,
>  # lld, and Polly. This adds two options. One for the source directory of
> the
>  # project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another
> to
> @@ -686,56 +693,84 @@ macro(add_llvm_external_project name)
>    if("${add_llvm_external_dir}" STREQUAL "")
>      set(add_llvm_external_dir ${name})
>    endif()
> -  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE
> "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}")
> -  string(REPLACE "-" "_" nameUNDERSCORE ${name})
> -  string(TOUPPER ${nameUNDERSCORE} nameUPPER)
> -  #TODO: Remove this check in a few days once it has circulated through
> -  # buildbots and people's checkouts (cbieneman - July 14, 2015)
> -  if("${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL
> "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}")
> -    unset(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR CACHE)
> -  endif()
> -  if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR)
> -    set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
> "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}")
> -  else()
> -    set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
> +  canonicalize_tool_name(${name} nameUPPER)
> +  if (LLVM_TOOL_${nameUPPER}_BUILD)
> +    if(EXISTS
> ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
> +
> add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}
> ${add_llvm_external_dir})
> +        set(LLVM_TOOL_${nameUPPER}_BUILD Off)
> +    elseif(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR)
> +      set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
> +        "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
>          CACHE PATH "Path to ${name} source directory")
> -  endif()
> -  if (EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt)
> -    option(LLVM_EXTERNAL_${nameUPPER}_BUILD
> -           "Whether to build ${name} as part of LLVM" ON)
> -    if (LLVM_EXTERNAL_${nameUPPER}_BUILD)
> +      mark_as_advanced(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR)
>        add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}
> ${add_llvm_external_dir})
> +      set(LLVM_TOOL_${nameUPPER}_BUILD Off)
>      endif()
>    endif()
>  endmacro(add_llvm_external_project)
>
>  macro(add_llvm_tool_subdirectory name)
> -  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE
> "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
> -  add_subdirectory(${name})
> +  add_llvm_external_project(${name})
>  endmacro(add_llvm_tool_subdirectory)
>
> -macro(ignore_llvm_tool_subdirectory name)
> -  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE
> "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
> -endmacro(ignore_llvm_tool_subdirectory)
> +function(get_project_name_from_src_var var output)
> +  string(REGEX MATCH "LLVM_EXTERNAL_(.*)_SOURCE_DIR"
> +         MACHED_TOOL "${var}")
> +  if(MACHED_TOOL)
> +    set(${output} ${CMAKE_MATCH_1} PARENT_SCOPE)
> +  else()
> +    set(${output} PARENT_SCOPE)
> +  endif()
> +endfunction()
> +
> +function(create_llvm_tool_options)
> +  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
> +  foreach(dir ${sub-dirs})
> +    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
> +      canonicalize_tool_name(${dir} name)
> +      option(LLVM_TOOL_${name}_BUILD
> +           "Whether to build ${name} as part of LLVM" On)
> +      mark_as_advanced(LLVM_TOOL_${name}_BUILD)
> +    endif()
> +  endforeach()
> +  get_cmake_property(variableNames VARIABLES)
> +  foreach (variableName ${variableNames})
> +    get_project_name_from_src_var(${variableName} projectName)
> +    if(projectName)
> +      option(LLVM_TOOL_${projectName}_BUILD
> +           "Whether to build ${name} as part of LLVM" On)
> +      mark_as_advanced(LLVM_TOOL_${name}_BUILD)
> +    endif()
> +  endforeach()
> +endfunction(create_llvm_tool_options)
>
> -function(add_llvm_implicit_external_projects)
> +function(add_llvm_implicit_projects)
>    set(list_of_implicit_subdirs "")
>    file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
>    foreach(dir ${sub-dirs})
> -    if(IS_DIRECTORY "${dir}")
> -      list(FIND LLVM_IMPLICIT_PROJECT_IGNORE "${dir}" tool_subdir_ignore)
> -      if( tool_subdir_ignore EQUAL -1
> -          AND EXISTS "${dir}/CMakeLists.txt")
> +    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
> +      canonicalize_tool_name(${dir} name)
> +      if (LLVM_TOOL_${name}_BUILD)
>          get_filename_component(fn "${dir}" NAME)
>          list(APPEND list_of_implicit_subdirs "${fn}")
>        endif()
>      endif()
>    endforeach()
>
> +  get_cmake_property(variableNames VARIABLES)
> +  foreach (variableName ${variableNames})
> +    get_project_name_from_src_var(${variableName} projectName)
> +    if(projectName)
> +      string(TOLOWER ${projectName} projectName)
> +      list(APPEND list_of_implicit_subdirs ${projectName})
> +    endif()
> +  endforeach()
> +
> +  list(REMOVE_DUPLICATES list_of_implicit_subdirs)
>    foreach(external_proj ${list_of_implicit_subdirs})
>      add_llvm_external_project("${external_proj}")
>    endforeach()
> -endfunction(add_llvm_implicit_external_projects)
> +endfunction(add_llvm_implicit_projects)
>
>  # Generic support for adding a unittest.
>  function(add_unittest test_suite test_name)
>
> Modified: llvm/trunk/tools/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?rev=242705&r1=242704&r2=242705&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/CMakeLists.txt (original)
> +++ llvm/trunk/tools/CMakeLists.txt Mon Jul 20 15:36:06 2015
> @@ -1,85 +1,37 @@
> -add_llvm_tool_subdirectory(llvm-config)
> +# This file will recurse into all subdirectories that contain
> CMakeLists.txt
> +# Setting variables that match the pattern LLVM_TOOL_{NAME}_BUILD to Off
> will
> +# prevent traversing into a directory.
> +#
> +# The only tools that need to be explicitly added are ones that have
> explicit
> +# ordering requirements.
> +
> +# Iterates all the subdirectories to create CMake options to
> enable/disable
> +# traversing each directory.
> +create_llvm_tool_options()
>
>  # Build polly before the tools: the tools link against polly when
>  # LINK_POLLY_INTO_TOOLS is set.
>  if(WITH_POLLY)
>    add_llvm_external_project(polly)
> -else(WITH_POLLY)
> -  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE
> "${LLVM_MAIN_SRC_DIR}/tools/polly")
> -endif(WITH_POLLY)
> -
> -if( LLVM_BUILD_LLVM_DYLIB )
> -  add_llvm_tool_subdirectory(llvm-shlib)
>  else()
> -  ignore_llvm_tool_subdirectory(llvm-shlib)
> +  set(LLVM_TOOL_POLLY_BUILD Off)
>  endif()
>
> -add_llvm_tool_subdirectory(opt)
> -add_llvm_tool_subdirectory(llvm-as)
> -add_llvm_tool_subdirectory(llvm-dis)
> -add_llvm_tool_subdirectory(llvm-mc)
> -
> -add_llvm_tool_subdirectory(llc)
> -add_llvm_tool_subdirectory(llvm-ar)
> -add_llvm_tool_subdirectory(llvm-nm)
> -add_llvm_tool_subdirectory(llvm-size)
> -
> -add_llvm_tool_subdirectory(llvm-cov)
> -add_llvm_tool_subdirectory(llvm-profdata)
> -add_llvm_tool_subdirectory(llvm-link)
> -add_llvm_tool_subdirectory(lli)
> -
> -add_llvm_tool_subdirectory(llvm-extract)
> -add_llvm_tool_subdirectory(llvm-diff)
> -add_llvm_tool_subdirectory(macho-dump)
> -add_llvm_tool_subdirectory(llvm-objdump)
> -add_llvm_tool_subdirectory(llvm-readobj)
> -add_llvm_tool_subdirectory(llvm-rtdyld)
> -add_llvm_tool_subdirectory(llvm-dwarfdump)
> -add_llvm_tool_subdirectory(dsymutil)
> -add_llvm_tool_subdirectory(llvm-cxxdump)
> -if( LLVM_USE_INTEL_JITEVENTS )
> -  add_llvm_tool_subdirectory(llvm-jitlistener)
> -else()
> -  ignore_llvm_tool_subdirectory(llvm-jitlistener)
> -endif( LLVM_USE_INTEL_JITEVENTS )
> -
> -add_llvm_tool_subdirectory(bugpoint)
> -add_llvm_tool_subdirectory(bugpoint-passes)
> -add_llvm_tool_subdirectory(llvm-bcanalyzer)
> -add_llvm_tool_subdirectory(llvm-stress)
> -add_llvm_tool_subdirectory(llvm-mcmarkup)
> -
> -add_llvm_tool_subdirectory(verify-uselistorder)
> -
> -add_llvm_tool_subdirectory(llvm-symbolizer)
> -
> -add_llvm_tool_subdirectory(llvm-c-test)
> -
> -add_llvm_tool_subdirectory(obj2yaml)
> -add_llvm_tool_subdirectory(yaml2obj)
> -
> -add_llvm_tool_subdirectory(llvm-go)
> -
> -add_llvm_tool_subdirectory(llvm-pdbdump)
> -
> -if(NOT CYGWIN AND LLVM_ENABLE_PIC)
> -  add_llvm_tool_subdirectory(lto)
> -  add_llvm_tool_subdirectory(llvm-lto)
> -else()
> -  ignore_llvm_tool_subdirectory(lto)
> -  ignore_llvm_tool_subdirectory(llvm-lto)
> +if(NOT LLVM_BUILD_LLVM_DYLIB )
> +  set(LLVM_TOOL_LLVM_SHLIB_BUILD Off)
>  endif()
>
> -add_llvm_tool_subdirectory(gold)
> +if(NOT LLVM_USE_INTEL_JITEVENTS )
> +  set(LLVM_TOOL_LLVM_JITLISTENER_BUILD Off)
> +endif()
>
> -add_llvm_external_project(clang)
> -add_llvm_external_project(llgo)
> -add_llvm_external_project(lld)
> -add_llvm_external_project(lldb)
> +if(CYGWIN OR NOT LLVM_ENABLE_PIC)
> +  set(LLVM_TOOL_LTO_BUILD Off)
> +  set(LLVM_TOOL_LLVM_LTO_BUILD Off)
> +endif()
>
>  # Automatically add remaining sub-directories containing a
> 'CMakeLists.txt'
>  # file as external projects.
> -add_llvm_implicit_external_projects()
> +add_llvm_implicit_projects()
>
>  set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150720/c516d963/attachment.html>


More information about the llvm-commits mailing list