diff options
author | Chris Bieneman <beanz@apple.com> | 2015-07-13 20:23:15 +0000 |
---|---|---|
committer | Chris Bieneman <beanz@apple.com> | 2015-07-13 20:23:15 +0000 |
commit | 8ac6d119b7f690c38a4e1f6b57a9ef9121588e27 (patch) | |
tree | 172328cf53072f580000bd9ca8bb54f2cfc061ae /llvm/cmake/modules | |
parent | cd42e7f77a788969bc9365b8b0b2f21e2308e04e (diff) | |
download | bcm5719-llvm-8ac6d119b7f690c38a4e1f6b57a9ef9121588e27.tar.gz bcm5719-llvm-8ac6d119b7f690c38a4e1f6b57a9ef9121588e27.zip |
[CMake] Cleanup tools/CMakeLists.txt to take advantage of the auto-registration that was already partially working.
Summary:
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_*_*.
Original Summary:
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
llvm-svn: 242059
Diffstat (limited to 'llvm/cmake/modules')
-rw-r--r-- | llvm/cmake/modules/AddLLVM.cmake | 85 |
1 files changed, 64 insertions, 21 deletions
diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 752d496f74f..ebd17a0cf85 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -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,48 +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) - set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}" - CACHE PATH "Path to ${name} source directory") - if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL "" - AND 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) + 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") + 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) |