diff --git a/CMakeLists.txt b/CMakeLists.txt index a846eaeb2a4..0de1e08cf78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,24 @@ endforeach(c) set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm) +# The USE_EXPLICIT_DEPENDENCIES variable will be TRUE to indicate that +# we should use the library dependencies explicitly specified in the +# CMakeLists.txt files rather than those determined by +# llvm-config. This value must be true for non-make and IDE +# generators. +if (MSVC_IDE) + set(DEFAULT_USE_EXPLICIT_DEPENDENCIES ON) +elseif (XCODE) + set(DEFAULT_USE_EXPLICIT_DEPENDENCIES ON) +else () + set(DEFAULT_USE_EXPLICIT_DEPENDENCIES OFF) +endif () + +option(USE_EXPLICIT_DEPENDENCIES + "Use explicit dependencies instead of llvm-config" + ${DEFAULT_USE_EXPLICIT_DEPENDENCIES}) +mark_as_advanced(USE_EXPLICIT_DEPENDENCIES) + # Add path for custom modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index c531298a30f..a21ed20d3ba 100755 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -26,11 +26,11 @@ macro(add_llvm_executable name) if( LLVM_LINK_COMPONENTS ) llvm_config(${name} ${LLVM_LINK_COMPONENTS}) endif( LLVM_LINK_COMPONENTS ) - if( MSVC ) + if( USE_EXPLICIT_DEPENDENCIES ) target_link_libraries(${name} ${llvm_libs}) - else( MSVC ) + else( ) add_dependencies(${name} llvm-config.target) - endif( MSVC ) + endif( ) get_system_libs(llvm_system_libs) if( llvm_system_libs ) target_link_libraries(${name} ${llvm_system_libs}) diff --git a/cmake/modules/AddPartiallyLinkedObject.cmake b/cmake/modules/AddPartiallyLinkedObject.cmake index c9d96de1b9a..d20666dd79f 100755 --- a/cmake/modules/AddPartiallyLinkedObject.cmake +++ b/cmake/modules/AddPartiallyLinkedObject.cmake @@ -1,18 +1,18 @@ include(LLVMProcessSources) macro(target_name_of_partially_linked_object lib var) - if( MSVC ) + if( USE_EXPLICIT_DEPENDENCIES ) set(${var} ${lib}) - else( MSVC ) + else( ) set(${var} ${lib}_pll) - endif( MSVC ) + endif( ) endmacro(target_name_of_partially_linked_object lib var) macro(add_partially_linked_object lib) - if( MSVC ) + if( USE_EXPLICIT_DEPENDENCIES ) add_llvm_library( ${lib} ${ARGN}) - else( MSVC ) + else( ) set(pll ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/${lib}.o) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib) @@ -36,7 +36,7 @@ macro(add_partially_linked_object lib) add_custom_target(${tnplo} ALL DEPENDS ${pll}) set( llvm_libs ${llvm_libs} ${pll} PARENT_SCOPE) set( llvm_lib_targets ${llvm_lib_targets} ${tnplo} PARENT_SCOPE ) - endif( MSVC ) + endif( ) install(FILES ${pll} DESTINATION lib) endmacro(add_partially_linked_object lib) diff --git a/cmake/modules/LLVMConfig.cmake b/cmake/modules/LLVMConfig.cmake index 9776fb05d2a..fd924951874 100755 --- a/cmake/modules/LLVMConfig.cmake +++ b/cmake/modules/LLVMConfig.cmake @@ -21,36 +21,40 @@ endfunction(get_system_libs) macro(llvm_config executable) # extra args is the list of link components. - if( MSVC ) - msvc_llvm_config(${executable} ${ARGN}) - else( MSVC ) + if( USE_EXPLICIT_DEPENDENCIES ) + explicit_llvm_config(${executable} ${ARGN}) + else( ) nix_llvm_config(${executable} ${ARGN}) - endif( MSVC ) + endif( ) endmacro(llvm_config) -function(msvc_llvm_config executable) +function(explicit_llvm_config executable) set( link_components ${ARGN} ) - if( CMAKE_CL_64 ) - set(include_lflag "/INCLUDE:") - else( CMAKE_CL_64 ) - set(include_lflag "/INCLUDE:_") - endif() - foreach(c ${link_components}) - if( c STREQUAL "jit" ) - set(lfgs "${lfgs} ${include_lflag}X86TargetMachineModule") - endif( c STREQUAL "jit" ) - list(FIND LLVM_TARGETS_TO_BUILD ${c} idx) - if( NOT idx LESS 0 ) - set(lfgs "${lfgs} ${include_lflag}${c}TargetMachineModule") - list(FIND LLVM_ASMPRINTERS_FORCE_LINK ${c} idx) - if( NOT idx LESS 0 ) - set(lfgs "${lfgs} ${include_lflag}${c}AsmPrinterForceLink") - endif() - endif() - endforeach(c) - msvc_map_components_to_libraries(LIBRARIES ${link_components}) + set(lfgs) + if (MSVC) + if( CMAKE_CL_64 ) + set(include_lflag "/INCLUDE:") + else( CMAKE_CL_64 ) + set(include_lflag "/INCLUDE:_") + endif() + foreach(c ${link_components}) + if( c STREQUAL "jit" ) + set(lfgs "${lfgs} ${include_lflag}X86TargetMachineModule") + endif( c STREQUAL "jit" ) + list(FIND LLVM_TARGETS_TO_BUILD ${c} idx) + if( NOT idx LESS 0 ) + set(lfgs "${lfgs} ${include_lflag}${c}TargetMachineModule") + list(FIND LLVM_ASMPRINTERS_FORCE_LINK ${c} idx) + if( NOT idx LESS 0 ) + set(lfgs "${lfgs} ${include_lflag}${c}AsmPrinterForceLink") + endif() + endif() + endforeach(c) + endif () + + explicit_map_components_to_libraries(LIBRARIES ${link_components}) target_link_libraries(${executable} ${LIBRARIES}) if( lfgs ) @@ -58,10 +62,10 @@ function(msvc_llvm_config executable) PROPERTIES LINK_FLAGS ${lfgs}) endif() -endfunction(msvc_llvm_config) +endfunction(explicit_llvm_config) -function(msvc_map_components_to_libraries out_libs) +function(explicit_map_components_to_libraries out_libs) set( link_components ${ARGN} ) foreach(c ${link_components}) # add codegen/asmprinter @@ -121,7 +125,7 @@ function(msvc_map_components_to_libraries out_libs) endwhile( ${curr_idx} LESS ${lst_size} ) list(REMOVE_DUPLICATES result) set(${out_libs} ${result} PARENT_SCOPE) -endfunction(msvc_map_components_to_libraries) +endfunction(explicit_map_components_to_libraries) macro(nix_llvm_config executable) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 113d98743c4..5c1ee351a2a 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -2,9 +2,9 @@ # large and three small executables. This is done to minimize memory load # in parallel builds. Please retain this ordering. -if( NOT MSVC ) - add_subdirectory(llvm-config) -endif( NOT MSVC ) +if (NOT USE_EXPLICIT_DEPENDENCIES) + add_subdirectory(llvm-config) +endif() add_subdirectory(opt) add_subdirectory(llvm-as)