Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -1,7 +1,56 @@ +cmake_minimum_required(VERSION 2.8.12) + # If we are not building as a part of LLVM, build lld as a standalone project, # using LLVM as an external library. +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + project(LLD) + + # Find and include LLVMConfig via either LLVM_INSTALL_DIR or CMAKE_PREFIX_PATH. + find_package(LLVM REQUIRED PATHS "${LLVM_INSTALL_DIR}") + + include_directories(${LLVM_INCLUDE_DIRS}) + link_directories(${LLVM_LIBRARY_DIRS}) + + # Use ${cmake_2_8_12_KEYWORD} intead of KEYWORD in target_link_libraries(). + set(cmake_2_8_12_INTERFACE INTERFACE) + set(cmake_2_8_12_PRIVATE PRIVATE) + if(POLICY CMP0022) + cmake_policy(SET CMP0022 NEW) # automatic when 2.8.12 is required + endif() -cmake_minimum_required(VERSION 2.8) + # Include the LLVM CMake modules. + list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") + include(AddLLVM) + include(TableGen) + include(HandleLLVMOptions) + + # All options referred to from HandleLLVMOptions have to be specified + # BEFORE this include, otherwise options will not be correctly set on + # first CMake run. + include(cmake/config-ix.cmake) + + # LLVMConfig sets LLVM_PACKAGE_VERSION whereas LLVM's CMakeLists sets + # PACKAGE_VERSION. + set(PACKAGE_VERSION ${LLVM_PACKAGE_VERSION}) + + # Set global variables referenced by the LLVM modules. + find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) + list(GET LLVM_INCLUDE_DIRS 0 LLVM_MAIN_INCLUDE_DIR) + list(GET LLVM_LIBRARY_DIRS 0 LLVM_LIBRARY_DIR) + + # Include auto-generated headers. + include_directories("${CMAKE_CURRENT_BINARY_DIR}/lib/Driver") + + # Define the default arguments to use with 'lit', and an option for the user + # to override. + set(LIT_ARGS_DEFAULT "-sv") + if (MSVC OR XCODE) + set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") + endif() + set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") +endif() set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) @@ -48,6 +97,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Config/Version.inc.in ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Config/Version.inc) +# Configure the config.h file. +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Config/config.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Config/config.h) if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite " Index: cmake/config-ix.cmake =================================================================== --- /dev/null +++ cmake/config-ix.cmake @@ -0,0 +1,6 @@ +# size_t must be defined before including cxxabi.h on FreeBSD 10.0. +check_cxx_source_compiles(" +#include +#include +int main() { return 0; } +" HAVE_CXXABI_H) Index: include/lld/Config/config.h.cmake =================================================================== --- /dev/null +++ include/lld/Config/config.h.cmake @@ -0,0 +1,9 @@ +/* include/lld/Config/config.h.cmake */ + +#ifndef LLD_CONFIG_CONFIG_H +#define LLD_CONFIG_CONFIG_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_CXXABI_H ${HAVE_CXXABI_H} + +#endif Index: lib/ReaderWriter/ELF/ELFLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -11,11 +11,11 @@ #include "ELFFile.h" #include "OrderPass.h" #include "TargetHandler.h" +#include "lld/Config/config.h" #include "lld/Core/Instrumentation.h" #include "lld/Core/SharedLibraryFile.h" #include "lld/Passes/RoundTripYAMLPass.h" #include "llvm/ADT/Triple.h" -#include "llvm/Config/config.h" #include "llvm/Support/ELF.h" #include "llvm/Support/Errc.h" #include "llvm/Support/FileSystem.h" Index: lib/ReaderWriter/MachO/MachOLinkingContext.cpp =================================================================== --- lib/ReaderWriter/MachO/MachOLinkingContext.cpp +++ lib/ReaderWriter/MachO/MachOLinkingContext.cpp @@ -12,6 +12,7 @@ #include "File.h" #include "MachONormalizedFile.h" #include "MachOPasses.h" +#include "lld/Config/config.h" #include "lld/Core/ArchiveLibraryFile.h" #include "lld/Core/PassManager.h" #include "lld/Core/Reader.h" @@ -20,7 +21,6 @@ #include "lld/Passes/RoundTripYAMLPass.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Triple.h" -#include "llvm/Config/config.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Errc.h" #include "llvm/Support/Host.h" Index: test/lit.cfg =================================================================== --- test/lit.cfg +++ test/lit.cfg @@ -48,6 +48,14 @@ path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH'])) path = os.path.pathsep.join((os.path.join(getattr(config, 'llvm_src_root', None),'test','Scripts'),path)) + # Add path to FileCheck + lit_tools_dir = getattr(config, 'lit_tools_dir', None) + if lit_tools_dir: + path = os.path.pathsep.join((lit_tools_dir, path)) + + # Lastly, ensure path to lld is first in the path + path = os.path.pathsep.join((os.path.join(lld_obj_root,'bin'), path)) + config.environment['PATH'] = path llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)